【问题标题】:how do I select the smoothing parameter for smooth.spline()?如何为 smooth.spline() 选择平滑参数?
【发布时间】:2013-02-02 11:14:35
【问题描述】:

我知道平滑参数 (lambda) 对于拟合平滑样条非常重要,但我在这里没有看到任何关于如何选择合理的 lambda (spar=?) 的帖子,我被告知 spar 通常范围从0 到 1。任何人都可以分享您在使用 smooth.spline() 时的经验吗?谢谢。

    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))

【问题讨论】:

  • 你在想span吗,span是平滑因子达到的程度。
  • 嗨,Nathan,我之所以问是因为我可以选择的数字很多(从 0 到 1),我需要找到一种方法来证明我选择的参数是合理的。

标签: r lambda smooth spline smoothing


【解决方案1】:

agstudy 提供了一种直观的方式来选择spar。我记得我从线性模型类(但不准确)中学到的是使用交叉验证来选择“最佳”spar。这是从 agstudy 借来的一个玩具示例:

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

R > xyspline <- smooth.spline(x, y, cv=T)
R > xyspline$spar
[1] 0.3881

【讨论】:

  • +1 漂亮的插图!只是要注意,当 x 中有重复点时,应避免 cv=TRUE...
【解决方案2】:

smooth.spline 的帮助下,您获得了以下信息:

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

spar 可以大于 1(但我猜不会太多)。我认为您可以通过绘制不同翼梁的拟合值来更改此参数并以图形方式选择它。例如:

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

【讨论】:

    【解决方案3】:

    如果您在相同的 x 值处没有重复点,请尝试设置 GCV=TRUE - 广义交叉验证 (GCV) 程序是一种聪明的方法,可以很好地选择一个很好的 lambda 值(跨度)。关于 GCV 的一个简洁细节是,它实际上不必费心为每一组遗漏的点进行计算——正如 Simon Wood 的书中所强调的那样。有关这方面的更多详细信息,请查看 Simon Wood 网页 MGCV 上的注释。

    Adrian Bowman 的 (sm) r-package 有一个函数 h.select() 专门用于选择 lambda 值的繁琐工作(尽管我不能 100% 确定它与 smooth.spline() 兼容基础包中的函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多