stats::splinefun自然三次样条外推系数计算疑问
自然三次样条外推时的斜率(b系数)计算疑问
我在使用stats::splinefun()实现自然三次样条插值时,按照文档说明:此类插值样条也可用于外推,即对x范围外的点进行预测。对于method="fmm",外推意义不大;对于自然样条,外推采用最近数据点处插值曲线的斜率进行线性计算。
我在Excel中复现了插值部分,但外推逻辑一直不对,以下是示例代码:
library(stats) # 示例数据 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) # 创建样条函数 splinetest <- splinefun(x = df$x, y = df$y, method = "natural") # 提取系数数据框(注:原代码中`splinecoef_inf`应为`splinetest_coef`) splinetest_coef <- environment(splinetest)$z splinetest_coefdf <- data.frame(i = 0:16, x = splinetest_coef$x, a = splinetest_coef$y, b = splinetest_coef$b, c = splinetest_coef$c, d = splinetest_coef$d) # 计算x=51的外推值 splinetest(51) # 结果: # [1] 3.667414
计算x=51时,R返回的外推值是3.667414,但如果直接用x=40和x=50的原始数据做线性外推,结果是3.663 + (51 - 50) × (3.663 - 3.6594) / (50 - 40) = 3.66336,两者差异明显。
观察样条系数可知,x=50处的系数a=3.663、b=0.00441355,R的外推值正是通过3.663 + 0.00441355得到的,想知道这个b系数(即外推所用的斜率)是如何计算出来的?
内容的提问来源于stack exchange,提问作者Rham
相关产品推荐
相关产品推荐

