2016-10-15 10 views
4

Я хочу использовать функцию gam в mgcv пакетов:mgcv: Как установить количество и/или расположение узлов для сплайнов

x <- seq(0,60, len =600) 
y <- seq(0,1, len=600) 
prova <- gam(y ~ s(x, bs='cr') 

можно установить количество узлов в s()? и тогда я могу знать, где узлы, используемые сплайном? Благодаря!

ответ

6

Неудивительно, что вы видите неправильный ответ ... При установке k это правильный путь, fx = TRUE определенно не прав: он заставит использовать чип регрессии без штрафа.


расположение узлов

Для наказываться регрессионного сплайна, точное местонахождение не важно, до тех пор, как:

  • k адекватно большой;
  • Распространение узлов имеет хорошее, разумное покрытие.

По умолчанию:

  • естественной кубической регрессии сплайн bs = 'cr' места узлов по квантиль;
  • B-сплайны семейства (bs = 'bs', bs = 'ps', bs = 'ad') место узлы равномерно.

Сравните следующие:

library(mgcv) 

## toy data 
set.seed(0); x <- sort(rnorm(400, 0, pi)) ## note, my x are not uniformly sampled 
set.seed(1); e <- rnorm(400, 0, 0.4) 
y0 <- sin(x) + 0.2 * x + cos(abs(x)) 
y <- y0 + e 

## fitting natural cubic spline 
cr_fit <- gam(y ~ s(x, bs = 'cr', k = 20)) 
cr_knots <- cr_fit$smooth[[1]]$xp ## extract knots locations 

## fitting B-spline 
bs_fit <- gam(y ~ s(x, bs = 'bs', k = 20)) 
bs_knots <- bs_fit$smooth[[1]]$knots ## extract knots locations 

## summary plot 
par(mfrow = c(1,2)) 
plot(x, y, col= "grey", main = "natural cubic spline"); 
lines(x, cr_fit$linear.predictors, col = 2, lwd = 2) 
abline(v = cr_knots, lty = 2) 
plot(x, y, col= "grey", main = "B-spline"); 
lines(x, bs_fit$linear.predictors, col = 2, lwd = 2) 
abline(v = bs_knots, lty = 2) 

enter image description here

Вы можете увидеть разницу в размещении узлов.


Настройка ваших собственных узлов мест:

Вы также можете предоставить свои индивидуальные места сучков через knots аргумент gam() (да, сучки не питались в s(), но к gam()). Например, вы можете сделать равномерно разнесенные узлы для cr:

xlim <- range(x) ## get range of x 
myfit <- gam(y ~ s(x, bs = 'cr', k =20), 
     knots = list(x = seq(xlim[1], xlim[2], length = 20))) 

Теперь вы можете видеть, что:

my_knots <- myfit$smooth[[1]]$xp 
plot(x, y, col= "grey", main = "my knots"); 
lines(x, myfit$linear.predictors, col = 2, lwd = 2) 
abline(v = my_knots, lty = 2) 

enter image description here

Тем не менее, как правило, нет необходимости устанавливать сучков самостоятельно. Но если вы хотите это сделать, вы должны четко понимать, что делаете. Кроме того, количество предоставленных вами узлов должно соответствовать k в s().

+1

Это очень насыщенный ответ. Длина 'bs_knots' равна 24.« Размерность »сплайнового базиса находится в' bs_fit $ smooth [[1]] $ bs.dim'. –

+1

@ 42- Да, потому что для построения B-сплайна или порядка требуется 2 дополнительных пограничных узла на каждой стороне. Поэтому 'bs_knots [3:22]' - внутренние узлы, которые согласуются с 'узлами', если мы его установим. Граничные узлы не влияют на количество параметров; поэтому есть еще 20 базиса. –

 Смежные вопросы

  • Нет связанных вопросов^_^