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

11

我知道平滑参数(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是平滑因子的覆盖范围。 - N8TRO
嗨,Nathan,我问的原因是因为我可以选择相当多的数字(从0到1),我需要找到一种方法来证明我选择的参数是合理的。 - user001
3个回答

10

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... - agstudy

5

通过使用smooth.spline,您可以得到以下结果:

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

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

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 时得到了最佳结果。

enter image description here


3
如果您在相同的x值上没有重复的点,则尝试设置GCV = TRUE - 广义交叉验证(GCV)过程是选择lambda(跨度)的很好的方法。 GCV的一个巧妙之处在于,它实际上不必费力地计算每个单一集合的点集 - 正如Simon Wood的书中所强调的那样。有关此详细信息,请查看Simon Wood的MGCV网页上的注释。

Adrian Bowman的(sm)r软件包具有一个函数h.select(),专门用于选择lambda的值(虽然我不确定它是否与基本软件包中的smooth.spline()函数兼容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接