Mgcv: How to Set the Number and / or Location of Nodes for Splines

I want to use the function gamin packages mgcv:

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

Is it possible to set the number of nodes in s()? and then I can know where the nodes used by the spline are? Thank!

+4
source share
1 answer

It is unsuccessful to see the wrong answer ... Although tuning kis the right way, it is fx = TRUEdefinitely wrong: it will force the use of a pure regression spline without penalty.


node locations

For a fined regression spline, exact locations are not important if:

  • k big enough;
  • , .

:

  • 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().

+6

Source: https://habr.com/ru/post/1657842/


All Articles