как выбрать параметр сглаживания для smooth.spline()?

Я знаю, что параметр сглаживания (лямбда) очень важен для настройки сглаживающего сплайна, но я не видел здесь ни одного поста о том, как выбрать разумную лямбду (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))

person user001    schedule 18.02.2013    source источник
comment
Вы думаете о размахе, где размах - это то, насколько далеко достигает фактор сглаживания.   -  person N8TRO    schedule 18.02.2013
comment
Привет, Натан, причина, по которой я спросил, заключается в том, что я могу выбрать довольно много чисел (от 0 до 1), мне нужно найти способ доказать, что выбранный мной параметр является разумным.   -  person user001    schedule 18.02.2013


Ответы (3)


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

введите здесь описание изображения

Код не самый аккуратный, но простой для понимания. Кроме того, если вы укажете cv=T в smooth.spline:

R > xyspline <- smooth.spline(x, y, cv=T)
R > xyspline$spar
[1] 0.3881
person liuminzhao    schedule 18.02.2013
comment
+1 хорошая иллюстрация! просто чтобы отметить, что cv=TRUE следует избегать, когда есть дублирующиеся точки в x... - person agstudy; 18.02.2013

Из помощи 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.

введите здесь описание изображения

person agstudy    schedule 18.02.2013

Если у вас нет повторяющихся точек с одним и тем же значением x, попробуйте установить GCV=TRUE — процедура обобщенной перекрестной проверки (GCV) — это умный способ выбрать довольно хороший способ выбора хорошего значения для лямбда (диапазон). Одна интересная деталь о GCV заключается в том, что на самом деле ему не нужно утруждать себя выполнением вычислений для каждого отдельного набора точек с одним исключением, как это подчеркивается в книге Саймона Вуда. Подробнее об этом см. в примечаниях на веб-странице Саймона Вуда на MGCV.

В r-пакете Адриана Боумана (sm) есть функция h.select(), которая предназначена специально для черновой работы по выбору значения лямбда (хотя я не уверен на 100%, что она совместима с функцией smooth.spline() в базовом пакете.

person Sean    schedule 18.02.2013