我希望使用自然三次样条在一些数据点之间使用stats::样条函数()进行插值。这些文件指出:
这些插值样条也可用于外推,即在‘x’范围以外的点上进行预测。外推法对‘method=“fmm’没有什么意义;对于自然样条,用最近的数据点的插值曲线的斜率是线性的。
我尝试在Excel中复制样条函数作为回顾,除了不能复制外推法外,它工作得很好。下面的示例数据和代码:
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.因此,splinetest(51)被计算为3.663 + 0.0441355,在此函数中如何计算0.0441355?
发布于 2022-10-03 15:49:11
线性外推不是通过计算特定对点之间的斜率来完成的,而是使用边界处的估计导数( R's文档中的“最近点”)进行的。任何一点的导数都可以直接从样条函数中计算,例如,在上边界处计算估计的一阶导数:
splinetest(max(df$x), deriv = 1)
[1] 0.004413552这与你的手工反算的斜率进行外推是一致的.
正如注释中指出的,用curve(splinetest, from = 30, to = 60); points(x,y)绘制曲线/数据集的末尾清楚地说明了边界导数(x=50)与基于最后两个数据点(即(y(x=50) - y(x=40))/10)的直线之间的区别。

https://stackoverflow.com/questions/73937743
复制相似问题