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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。