在R中执行常量插值

时间:2014-01-14 09:12:47

标签: r interpolation linear-interpolation

我有一组数据,例如:

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")

也没有做到这一点。

我哪里错了?

3 个答案:

答案 0 :(得分:4)

由于您正在处理费率,因此您需要将y翻译为log(y),进行插值,然后使用exp将结果恢复为线性比例:

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

答案 1 :(得分:2)

简短回答是你不能不给它一些更多的信息,因为它既可以是线性拟合,也不是非线性函数,也可以是常数拟合,也不是。

你可以通过告诉它右手点是左手点强调的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

答案 2 :(得分:1)

不是很优雅,但您可以使用几何系列公式替换缺失值:

  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