mgcv:如何设置样条曲线的节数和/或位置

时间:2016-10-15 07:54:48

标签: r regression spline gam mgcv

我想在gam个包中使用函数mgcv

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

我可以在s()中设置结的数字吗?然后我可以知道花键使用的结点在哪里?谢谢!

1 个答案:

答案 0 :(得分:14)

看到错误答案总是令人失望......设置?>是正确的方法,k肯定是不对的:它会强制使用纯回归样条而不会受到惩罚。< / p>

结的位置

对于惩罚回归样条,只要确切位置并不重要:

  • fx = TRUE足够大;
  • 结的传播具有良好,合理的覆盖范围。

默认情况下:

  • 自然立方回归样条k分位数放置结;
  • B-splines系列(bs = 'cr'bs = 'bs'bs = 'ps')将结点均匀

比较以下内容:

bs = 'ad'

enter image description here

您可以看到结点位置的差异。

设置自己的结位置

您还可以通过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) 的{​​{1}}参数提供您的自定义结位置(是的,结不会输入knots,而是输入gam())。例如,您可以为s()执行均匀间隔的结:

gam()

现在您可以看到:

cr

enter image description here

但是,通常不需要自己设置结。但如果你想这样做,你必须清楚自己在做什么。此外,您提供的结数必须与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) 匹配。