Выполнение постоянной интерполяции в R

У меня есть набор данных, например:

x<-c(1, 2, 3, 4, 5, 6)
y<-c(100, 110, 121, 133.1, NA, 161.051)

Теперь y явно увеличивается с постоянной скоростью 10%.

Я хочу иметь возможность интерполировать данные в x=5 и хочу напечатать 146.41 в качестве ответа. Однако эта функция, похоже, этого не делает:

approx(x,y,5)

Это печатает 147.0755, что не является ответом, который я ищу.

approx(x,y,5,method="constant")

тоже не помогает.

Где я ошибаюсь?


person Randomly Named User    schedule 14.01.2014    source источник


Ответы (3)


Поскольку вы имеете дело со ставками, вам нужно перевести y в log(y), интерполировать, а затем использовать exp, чтобы вернуть результат в линейную шкалу:

exp(approx(x, log(y), x)$y)
# [1] 100.000 110.000 121.000 133.100 146.410 161.051
person flodel    schedule 14.01.2014

Короткий ответ: вы не можете, не предоставив дополнительную информацию, потому что это либо линейная подгонка, которая не имеет дело с нелинейной функцией, либо постоянная подгонка, которая также не работает.

Вы можете заставить его, сказав ему, что правая точка в 1,1 раза больше акцента левой точки:

approx(x,y,5, method="constant", f=1/2.1) # 1/ left weight (1) + right weight (1.1)

>$x
>[1] 5

>$y
>[1] 146.41

но это, вероятно, не все, что полезно!

вероятно, самое близкое, что вы можете получить, это:

spline(x,y,xout=5)

>$x
>[1] 5
>$y
>[1] 146.4125
person Troy    schedule 14.01.2014

Не очень элегантно, но вы можете заменить пропущенные значения, используя формулу геометрического ряда:

  y[is.na(y)] <- y[1]*(1+diff(y)[1]/y[1])^(which(is.na(y))-1)
y
[1] 100.000 110.000 121.000 133.100 146.410 161.051
person agstudy    schedule 14.01.2014