首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用三次样条进行外推?

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

Stack Overflow用户
提问于 2022-10-03 15:41:09
回答 1查看 76关注 0票数 1

我希望使用自然三次样条在一些数据点之间使用stats::样条函数()进行插值。这些文件指出:

这些插值样条也可用于外推,即在‘x’范围以外的点上进行预测。外推法对‘method=“fmm’没有什么意义;对于自然样条,用最近的数据点的插值曲线的斜率是线性的。

我尝试在Excel中复制样条函数作为回顾,除了不能复制外推法外,它工作得很好。下面的示例数据和代码:

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-03 15:49:11

线性外推不是通过计算特定对点之间的斜率来完成的,而是使用边界处的估计导数( R's文档中的“最近点”)进行的。任何一点的导数都可以直接从样条函数中计算,例如,在上边界处计算估计的一阶导数:

代码语言:javascript
复制
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)的直线之间的区别。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73937743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档