smooth.spline
位於 stats
包(package)。 說明
將三次平滑樣條擬合到提供的數據。
用法
smooth.spline(x, y = NULL, w = NULL, df, spar = NULL, lambda = NULL, cv = FALSE,
all.knots = FALSE, nknots = .nknots.smspl,
keep.data = TRUE, df.offset = 0, penalty = 1,
control.spar = list(), tol = 1e-6 * IQR(x), keep.stuff = FALSE)
.nknots.smspl(n)
參數
x |
給出預測變量值的向量,或指定 x 和 y 的列表或兩列矩陣。 |
y |
回應。如果 |
w |
與 |
df |
所需的等效自由度數(平滑矩陣的跡)。必須在 、 中唯一 x 值的數量,請參見下文。 |
spar |
平滑參數,通常(但不一定)位於 |
lambda |
如果需要,可以指定內部(取決於設計)平滑參數 |
cv |
當 |
all.knots |
如果 或者,使用嚴格遞增的 |
nknots |
整數或 |
keep.data |
邏輯指定輸入數據是否應保留在結果中。如果 |
df.offset |
允許 GCV 準則中的自由度增加 |
penalty |
GCV 準則中自由度的懲罰係數。 |
control.spar |
計算平滑參數 請注意,這部分是實驗性的,可能會隨著一般晶石計算的改進而改變!
請注意,僅在區間 |
tol |
same-ness 的容差或 |
keep.stuff |
實驗性的 |
n |
對於 |
細節
x
和 y
都不允許包含缺失值或無限值。
x
向量應至少包含四個不同的值。這裏的‘Distinct’由tol
控製:被視為相同的值被它們的第一個值替換,並且相應的y
和w
被相應地池化。
除非指定 lambda
而不是 spar
,否則使用的計算 (作為 的函數)為 ,其中 、 是由 給出的矩陣, 由 給出, 是權重的對角矩陣(縮放後其軌跡為 ,即原始觀測數), 是 -th B-spline 。
請注意,使用這些定義 和 B-spline 基礎表示 (即 是樣條係數的向量),懲罰對數似然為 ,因此 是(嶺回歸) 的解決方案。
如果 spar
和 lambda
缺失或 NULL
,則使用 df
的值來確定平滑程度。如果 df
也丟失,則使用留一交叉驗證(普通或 ‘generalized’ 由 cv
確定)來確定 。
請注意,根據上述關係,spar
是 ,這是故意的不同的來自 S-PLUS 的實現smooth.spline
(在哪裏spar
正比於 )。在R的( )規模,改變更有意義spar
線性地。
但請注意,目前對於小於 -1 或 -2 的 spar
值,結果可能變得非常不可靠。對於大於 2 左右的值也可能會發生同樣的情況。不要考慮將 spar
或控件 low
和 high
設置在這樣的安全範圍之外,除非您知道自己在做什麽!同樣,指定 lambda
而不是 spar
也很微妙,特別是 lambda
的 “safe” 值的範圍不是比例不變的,因此完全依賴於數據。
當 x
中存在重複點時,‘generalized’ 交叉驗證方法 GCV 將正常工作。然而,留一交叉驗證對於重複點的含義並不明確,並且內部代碼使用涉及省略重複點組的近似值。在這種情況下最好避免cv = TRUE
。
值
帶有組件的 "smooth.spline"
類的對象
x |
不同的 |
y |
對應於 |
w |
在 |
yin |
用於唯一 |
tol |
|
data |
僅當 |
n |
一個整數; (原始)樣本量。 |
lev |
(當 |
cv |
使用的 |
cv.crit |
交叉驗證分數,‘generalized’ 或 true,具體取決於 |
pen.crit |
懲罰標準,一個非負數;隻是(加權)殘差平方和 (RSS), |
crit |
底層標準值最小化 |
df |
使用等效自由度。請注意,(目前)當真實的 |
spar |
計算或給出的 |
ratio |
(當上麵的 |
lambda |
|
iparms |
命名的整數(3)向量,其中 |
auxMat |
實驗性的;當 |
fit |
供
|
call |
匹配的調用。 |
method(class = "smooth.spline")
顯示了基於上麵lev
向量的hatvalues()
方法。
注意
唯一 x
值的數量 由 tol
參數確定,相當於
nx <- length(x) - sum(duplicated( round((x - mean(x)) / tol) ))
默認all.knots = FALSE
和nknots = .nknots.smspl
,隻需要使用 結而不是 為了 。這降低了速度和內存需求,但不再大幅降低,因為R版本 1.5.1 僅適用於 其中 是節數。
在這種情況下,並非所有唯一的 x
值都用作結,結果是回歸樣條而不是嚴格意義上的平滑樣條,但非常接近,除非使用較小的平滑參數(或較大的 df
)。
例子
require(graphics)
plot(dist ~ speed, data = cars, main = "data(cars) & smoothing splines")
cars.spl <- with(cars, smooth.spline(speed, dist))
cars.spl
## This example has duplicate points, so avoid cv = TRUE
lines(cars.spl, col = "blue")
ss10 <- smooth.spline(cars[,"speed"], cars[,"dist"], df = 10)
lines(ss10, lty = 2, col = "red")
legend(5,120,c(paste("default [C.V.] => df =",round(cars.spl$df,1)),
"s( * , df = 10)"), col = c("blue","red"), lty = 1:2,
bg = 'bisque')
## Residual (Tukey Anscombe) plot:
plot(residuals(cars.spl) ~ fitted(cars.spl))
abline(h = 0, col = "gray")
## consistency check:
stopifnot(all.equal(cars$dist,
fitted(cars.spl) + residuals(cars.spl)))
## The chosen inner knots in original x-scale :
with(cars.spl$fit, min + range * knot[-c(1:3, nk+1 +1:3)]) # == unique(cars$speed)
## Visualize the behavior of .nknots.smspl()
nKnots <- Vectorize(.nknots.smspl) ; c.. <- adjustcolor("gray20",.5)
curve(nKnots, 1, 250, n=250)
abline(0,1, lty=2, col=c..); text(90,90,"y = x", col=c.., adj=-.25)
abline(h=100,lty=2); abline(v=200, lty=2)
n <- c(1:799, seq(800, 3490, by=10), seq(3500, 10000, by = 50))
plot(n, nKnots(n), type="l", main = "Vectorize(.nknots.smspl) (n)")
abline(0,1, lty=2, col=c..); text(180,180,"y = x", col=c..)
n0 <- c(50, 200, 800, 3200); c0 <- adjustcolor("blue3", .5)
lines(n0, nKnots(n0), type="h", col=c0)
axis(1, at=n0, line=-2, col.ticks=c0, col=NA, col.axis=c0)
axis(4, at=.nknots.smspl(10000), line=-.5, col=c..,col.axis=c.., las=1)
##-- artificial example
y18 <- c(1:3, 5, 4, 7:3, 2*(2:5), rep(10, 4))
xx <- seq(1, length(y18), length.out = 201)
(s2 <- smooth.spline(y18)) # GCV
(s02 <- smooth.spline(y18, spar = 0.2))
(s02. <- smooth.spline(y18, spar = 0.2, cv = NA))
plot(y18, main = deparse(s2$call), col.main = 2)
lines(s2, col = "gray"); lines(predict(s2, xx), col = 2)
lines(predict(s02, xx), col = 3); mtext(deparse(s02$call), col = 3)
## Specifying 'lambda' instead of usual spar :
(s2. <- smooth.spline(y18, lambda = s2$lambda, tol = s2$tol))
## The following shows the problematic behavior of 'spar' searching:
(s2 <- smooth.spline(y18, control =
list(trace = TRUE, tol = 1e-6, low = -1.5)))
(s2m <- smooth.spline(y18, cv = TRUE, control =
list(trace = TRUE, tol = 1e-6, low = -1.5)))
## both above do quite similarly (Df = 8.5 +- 0.2)
作者
R implementation by B. D. Ripley and Martin Maechler
(spar/lambda
, etc).
來源
該函數基於 T. Hastie 和 R. Tibshirani 編寫的 GAMFIT
Fortran 程序中的代碼(最初取自 http://lib.stat.cmu.edu/general/gamfit ),該程序使用 Finbarr O'Sullivan 的樣條代碼。其設計與 Chambers & Hastie (1992) 的 smooth.spline
函數類似。
參考
Chambers, J. M. and Hastie, T. J. (1992) Statistical Models in S, Wadsworth & Brooks/Cole.
Green, P. J. and Silverman, B. W. (1994) Nonparametric Regression and Generalized Linear Models: A Roughness Penalty Approach. Chapman and Hall.
Hastie, T. J. and Tibshirani, R. J. (1990) Generalized Additive Models. Chapman and Hall.
也可以看看
predict.smooth.spline
用於評估樣條曲線及其導數。
相關用法
- R smooth Tukey 的(運行中值)平滑
- R smoothEnds 端點平滑(用於運行中位數)
- R stlmethods STL 對象的方法
- R summary.nls 總結非線性最小二乘模型擬合
- R summary.manova 多元方差分析的匯總方法
- R summary.lm 總結線性模型擬合
- R screeplot 屏幕圖
- R sortedXyData 創建一個sortedXyData對象
- R sigma 提取殘餘標準差“Sigma”
- R setNames 設置對象中的名稱
- R stat.anova GLM 方差分析統計
- R scatter.smooth 黃土擬合的平滑曲線散點圖
- R splinefun 插值樣條曲線
- R spec.taper 通過餘弦鍾錐化時間序列
- R summary.princomp 主成分分析的匯總方法
- R symnum 符號數字編碼
- R se.contrast 模型術語對比的標準誤差
- R summary.aov 方差模型分析總結
- R stepfun Step Functions - 創建和類
- R shapiro.test 夏皮羅-威爾克正態性檢驗
- R selfStart 構建自啟動非線性模型
- R spec.pgram 通過平滑周期圖估計時間序列的譜密度
- R spec.ar 通過 AR Fit 估計時間序列的頻譜密度
- R supsmu 弗裏德曼的超級平滑
- R stl Loess 時間序列的季節分解
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Fit a Smoothing Spline。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。