簡體   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