R中的线性插值

21

我有一个真实数据集,例如看起来像这样:

# Dataset 1 with known data
known <- data.frame(
    x = c(0:6),
    y = c(0, 10, 20, 23, 41, 39, 61)
)

plot (known$x, known$y, type="o")

现在我想得到一个问题的答案:“如果原始数据集中所有中间数据点都在两个相邻测量值之间的一条直线上,那么0.3的Y值将是多少?”

 # X values of points to interpolate from known data
 aim <- c(0.3, 0.7, 2.3, 3.3, 4.3, 5.6, 5.9)

如果您查看图形:我想获取 ablines 与已知数据的线性插值相交的 Y 值

abline(v = aim, col = "#ff0000")

所以,在理想情况下,我会使用我的已知数据创建一个“linearInterpolationModel”,例如:

model <- linearInterpol(known)

我可以请求Y值的方式是:

model$getEstimation(0.3)

(这种情况应该返回 "3")

abline(h = 3, col = "#00ff00")

我怎样能实现这个?人工地,我会针对每个值做如下操作:

  1. 找到最接近当前X值X的较小的X值Xsmall和较大的X值Xlarge
  2. 计算相对于较小X值的位置relPos = (X - Xsmall) / (Xlarge - Xsmall)
  3. 计算预期Y值Yexp = Ysmall + (relPos * (Ylarge - Ysmall))

至少对于Matlab软件来说,我听说有内置函数可以解决这些问题。

谢谢你的帮助,

Sven

2个回答

19
你可能正在看 approx()approxfun()... 或者,我猜你可以使用lm进行线性拟合,或者lowess进行非参数拟合。

2
谢谢。´approx()´恰好做到了我想要的。现在我使用了plot(approx(known$x, known$y, xout=aim))。你知道是否有一个2D版本的approx吗?我想在矩阵中插值数据点... - R_User
1
akima包具有interp函数,我已经用它来拟合不规则网格上的3D数据。默认情况下,它产生线性插值,但也允许指定样条拟合。如果您的点“矩阵”是规则的,您可以使用wireframepersp来查看,但它们不接受不规则数据。 - IRTFM
但是 wireframepersp 似乎只适用于绘图。我的数据点是以对数间隔分布的。我想将 3D 数据提供给我正在查找的函数,以及数据点的 x 和 y 坐标。该函数应返回 x 和 y 坐标的插值 z 值。这似乎无法通过这三个命名函数实现。那么,我必须手动完成吗? - R_User
为什么 interp 不能做到呢?如果您想在对数刻度上进行线性插值,那么您也可以进行转换、插值和反转换。如果您有特定的数据集,请像往常一样发布数据和问题的完整描述,这样您将得到更好的答案。这似乎与原来的问题不同,您可能需要发布一个带有数据和描述的新问题。 - IRTFM
'loess' 也可以进行二维和三维拟合和插值。 - IRTFM

11

在DWin的回答基础上,以下是如何使用线性模型获取预测值的方法。

model.lm <- lm(y ~ x, data = known)

# Use predict to estimate the values for aim.
# Note that predict expects a data.frame and the col 
# names need to match
newY <- predict(model.lm, newdata = data.frame(x = aim))

#Add the predicted points to the original plot
points(aim, newY, col = "red")

当然,您也可以直接检索这些预测值:

> cbind(aim, newY)
  aim       newY
1 0.3  2.4500000
2 0.7  6.1928571
3 2.3 21.1642857
....

对于predict()函数,给予+1的评价。当查看?lm时,它的实用性非常高,但并不是立即显而易见的。 - Brandon Bertelsen
+1 给出 predict() 的示例。这种解决方案与我寻找的略有不同。它首先对所有数据点进行线性回归,并计算给定 x 值在回归曲线上的 Y 值。我正在寻找仅在两个最接近的点之间进行线性回归的方法。可以通过 approx() 实现。 - R_User

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