繁体   English   中英

如何使用三次样条进行外推?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM