Неудивительно, что вы видите неправильный ответ ... При установке 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)
Вы можете увидеть разницу в размещении узлов.
Настройка ваших собственных узлов мест:
Вы также можете предоставить свои индивидуальные места сучков через 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)
Тем не менее, как правило, нет необходимости устанавливать сучков самостоятельно. Но если вы хотите это сделать, вы должны четко понимать, что делаете. Кроме того, количество предоставленных вами узлов должно соответствовать k
в s()
.
Это очень насыщенный ответ. Длина 'bs_knots' равна 24.« Размерность »сплайнового базиса находится в' bs_fit $ smooth [[1]] $ bs.dim'. –
@ 42- Да, потому что для построения B-сплайна или порядка требуется 2 дополнительных пограничных узла на каждой стороне. Поэтому 'bs_knots [3:22]' - внутренние узлы, которые согласуются с 'узлами', если мы его установим. Граничные узлы не влияют на количество параметров; поэтому есть еще 20 базиса. –