首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为smooth.spline()选择平滑参数?

如何为smooth.spline()选择平滑参数?
EN

Stack Overflow用户
提问于 2013-02-18 11:59:33
回答 3查看 16.7K关注 0票数 10

我知道平滑参数(λ)对于拟合平滑样条相当重要,但我在这里没有看到任何关于如何选择合理的λ(spar=?)的帖子,有人告诉我spar通常在0到1之间。有人能分享你使用smooth.spline()的经验吗?谢谢。

代码语言:javascript
复制
    smooth.spline(x, y = NULL, w = NULL, df, spar = NULL,
          cv = FALSE, all.knots = FALSE, nknots = NULL,
          keep.data = TRUE, df.offset = 0, penalty = 1,
          control.spar = list(), tol = 1e-6 * IQR(x))
EN

回答 3

Stack Overflow用户

发布于 2013-02-18 14:29:56

agstudy提供了一种选择spar的可视化方法。我记得我从线性模型类(但不是精确的)中学到的是使用交叉验证来挑选“最佳”spar。以下是从agstudy中借用的一个玩具示例:

代码语言:javascript
复制
x = seq(1:18)
y = c(1:3,5,4,7:3,2*(2:5),rep(10,4))
splineres <- function(spar){
  res <- rep(0, length(x))
  for (i in 1:length(x)){
    mod <- smooth.spline(x[-i], y[-i], spar = spar)
    res[i] <- predict(mod, x[i])$y - y[i]
  }
  return(sum(res^2))
}

spars <- seq(0, 1.5, by = 0.001)
ss <- rep(0, length(spars))
for (i in 1:length(spars)){
  ss[i] <- splineres(spars[i])
}
plot(spars, ss, 'l', xlab = 'spar', ylab = 'Cross Validation Residual Sum of Squares' , main = 'CV RSS vs Spar')
spars[which.min(ss)]
R > spars[which.min(ss)]
[1] 0.381

代码不是最整洁的,但对你来说很容易理解。另外,如果在smooth.spline中指定cv=T

代码语言:javascript
复制
R > xyspline <- smooth.spline(x, y, cv=T)
R > xyspline$spar
[1] 0.3881
票数 10
EN

Stack Overflow用户

发布于 2013-02-18 13:34:20

smooth.spline的帮助下,您可以获得以下内容:

使用的计算代码(作为\λ{spar}的函数)为λ=r* 256^(3*spar - 1)

spar可以大于1(但我猜不会太大)。我认为你可以改变这个参数,并通过绘制不同支柱的拟合值来图形化地选择它。例如:

代码语言:javascript
复制
spars <- seq(0.2,2,length.out=10)          ## I will choose between 10 values 
dat <- data.frame(
  spar= as.factor(rep(spars,each=18)),    ## spar to group data(to get different colors)
  x = seq(1:18),                          ## recycling here to repeat x and y 
  y = c(1:3,5,4,7:3,2*(2:5),rep(10,4)))
xyplot(y~x|spar,data =dat, type=c('p'), pch=19,groups=spar,
       panel =function(x,y,groups,...)
       {
          s2  <- smooth.spline(y,spar=spars[panel.number()])
          panel.lines(s2)
          panel.xyplot(x,y,groups,...)
       })

例如,在这里,当spars = 0.4时,我获得最佳结果

票数 5
EN

Stack Overflow用户

发布于 2013-02-18 14:02:12

如果你在相同的x值上没有重复的点,那么尝试设置GCV=TRUE --通用交叉验证(GCV)过程是一个聪明的方法,可以很好地为λ(span)选择一个好的值。关于GCV的一个很好的细节是,它实际上不必像Simon Wood的书中强调的那样,为每一组遗漏的点进行计算。有关这方面的更多细节,请查看西蒙伍德在MGCV的网页上的注释。

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

https://stackoverflow.com/questions/14929268

复制
相关文章

相似问题

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