[英]How can I use cubic splines for extrapolation?
我希望使用自然三次样条在使用 stats::splinefun() 的一些数据点之间进行插值。 文件指出:
“这些插值样条也可用于外推,即在‘x’范围之外的点进行预测。外推对于‘method =“fmm”’意义不大;对于自然样条,它是线性的,使用插值曲线的斜率在最近的数据点。”
我试图在 Excel 中复制样条 function 作为审查,除了我无法复制外推方法外,它工作正常。 示例数据和代码如下:
library(stats)
# Example data
x <- c(1,2,3,4,5,6,7,8,9,10,12,15,20,25,30,40,50)
y <- c(7.1119,5.862,5.4432,5.1458,4.97,4.8484,4.7726,4.6673,4.5477,4.437,4.3163,4.1755,4.0421,3.9031,3.808,3.6594,3.663)
df <- data.frame(x,y)
# Create spline functions
splinetest <- splinefun(x = df$x, y = df$y, method = "natural")
# Create dataframe of coefficients
splinetest_coef <- environment(splinetest)$z
splinetest_coefdf <- data.frame(i = 0:16, x = splinecoef_inf$x, a = splinecoef_inf$y, b = splinecoef_inf$b, c = splinecoef_inf$c, d = splinecoef_inf$d)
# Calculate extrapolated value at 51
splinetest(51)
# Result:
# [1] 3.667414
问题:这个结果是怎么计算出来的?
使用 x = 40 和 x = 50 的线性外推法的预期结果是 3.663 + (51 - 50) x (3.663 - 3.6594) / (50 - 40) = 3.66336
i = 50 时的样条系数如下:a = 3.663 和 b = 0.00441355 ... 因此 spl.netest(51) 计算为 3.663 + 0.0441355 0.0441355 在这个 function 中如何计算?
线性外推不是通过计算特定点对之间的斜率来完成的,而是通过使用边界处的估计导数(R 文档中的“最近点”)来完成的。 可以直接从样条 function 计算任意点的导数,例如计算上边界处的估计一阶导数:
splinetest(max(df$x), deriv = 1)
[1] 0.004413552
这与您对用于外推的斜率的手动反算一致。
正如评论中指出的那样,绘制曲线/数据集的末端curve(spl.netest, from = 30, to = 60); points(x,y)
curve(spl.netest, from = 30, to = 60); points(x,y)
清楚地说明了边界处的导数 (x=50) 与基于最后两个数据点的线之间的差异(即(y(x=50) - y(x=40))/10
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.