在R中执行常数插值

4

我有一组数据,例如:

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个回答

5

由于涉及到比率,你需要将y转换为log(y),插值,然后使用exp将结果转回线性比例尺:

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接