Sélection de nœuds pour un GAM

9

Lors de la sélection d'un nombre approprié de nœuds pour un GAM, on peut vouloir prendre en compte le nombre de données et d'incréments sur l'axe des x.

Et si nous avons 100 incréments sur l'axe des x avec 1000 points de données à chaque incrément.

L'info ici dit:

S'ils ne sont pas fournis, les nœuds de la spline sont placés uniformément dans les valeurs de covariables auxquelles le terme se réfère: Par exemple, si l'ajustement de 101 données avec une spline de 11 nœuds de x, il y aurait un nœud à chaque 10ème (ordonné) valeur x.

Donc, un départ de base devrait être de 9 nœuds dans cet exemple? Je ne suis tout simplement pas sûr de la plage de nœuds qui conviendrait à cet ensemble de données, car il est possible d'adapter des nombres très petits à très grands.

set.seed(1)
dat <- data.frame(y = rnorm(10000), x = 100)

library(ggplot)
ggplot(dat, aes(x = x, y = y)) + 
              geom_point(size= 0.5) +                      
stat_smooth(method = "gam", 
            formula = y ~ s(x, bs = "cs"),k=9, col = "black")

Si k = 25 fournissait un ajustement utile, serait-il raisonnable pour ces données?

user1320502
la source

Réponses:

12

Une bien meilleure option consiste à adapter votre modèle à l'aide de gam () dans le package mgcv, qui contient une méthode appelée validation croisée généralisée (GCV). GCV choisira automatiquement le nombre de nœuds pour votre modèle afin que la simplicité soit équilibrée par rapport au pouvoir explicatif. Lorsque vous utilisez gam () en mgcv, activez GCV en définissant k à -1.

Juste comme ça:

set.seed(1)
dat <- data.frame(y = rnorm(10000), x = rnorm(10000))

library(mgcv)
G1 <- gam(y ~ s(x, k = -1, bs = "cs"), data = dat)
summary(G1) # check the significance of your smooth term
gam.check(G1) # inspect your residuals to evaluate if the degree of smoothing is good

Pour tracer votre ligne lisse, vous devrez extraire l'ajustement du modèle. Cela devrait faire l'affaire:

plot(y~x, data = dat, cex = .1)
G1pred <- predict(G1)
I1 <- order(dat$y)
lines(dat$x, G1pred)

Vous pouvez également ajuster k manuellement et voir quel nombre de k vous rapproche le plus de la valeur k définie automatiquement par GCV.

Ira S
la source
Que fait le bs = "cs"terme dans la spline?
user321627
1
"cs" spécifie que la base du lissage doit être une spline cubique.
Manuel Bickel
N'est-ce pas spécifier kéquivaut à spécifier k=-1?
Nakx
Je ne suis pas sûr de bien comprendre Nakx, mais je préciserai que k = -1 permettra au modèle de déterminer un nombre optimal de nœuds à l'aide de la validation croisée généralisée. Un ajustement manuel permettra de comparer la façon dont l'ajustement du modèle change en fonction du nombre de nœuds. Cela peut être perspicace et peut aider à dépeindre le phénomène d'intérêt.
Ira S
+1 Excellente réponse! Comment visualisez-vous comment s'est déroulée la spline? Je veux dire, le graphique des coefficients?
Erosennin
6

D'où vient l'idée que GCV choisira automatiquement le nombre de nœuds? Le nombre de nœuds (c'est-à-dire la dimension de base) est fixe et ne peut pas être modifié pendant l'ajustement du modèle. Ce que le score GCV dans la fonction gam () fait "automatiquement" n'est pas de choisir la dimension de base k, comme le dit Ira S, mais de choisir le niveau lisse de chaque spline de base en introduisant une pénalité de lueur dans le minimiseur ou l'objectif d'ajustement. Pour choisir le nombre de nœuds k, vous devez utiliser une valeur supérieure au nombre de degrés de liberté que vous attendez. Citant l'aide de choose.k: "le choix exact de k n'est généralement pas critique: il doit être choisi suffisamment grand pour que vous soyez raisonnablement sûr d'avoir suffisamment de degrés de liberté pour représenter raisonnablement bien la" vérité "sous-jacente, mais assez petit pour maintenir une efficacité de calcul raisonnable ". Donc, augmentez essentiellement k par grandes étapes jusqu'à ce que vous ne voyiez aucun changement dans votre tracé, par exemple. En résumé: il n'y a rien de tel qu'un choix "automatique" pour k comme le dit Ira S, l'utilisateur devraitchoisissez toujours une valeur k dans le cadre de la conception du modèle. Sinon, vous sous-adaptez probablement votre modèle!

nukimov
la source
juste une autre question de clarification. Dans le fichier de vignette mgcv du package, il indique que k est la dimension de la base des variables dont le lissage est fonction. Lors de l'utilisation de bs = "cr", les splines de régression cubique, je pensais que la dimension de la base était 3. Autrement dit, k = 3 lorsque bs = "cr", avais-je tort?
vtshen
Presque à droite mais pas tout à fait. Ce que vous dites serait vrai si une spline consistait en un seul polynôme du 3ème degré, qui n'est qu'un cas particulier d'une spline. Une spline est une série de polynômes concaténés (normalement plus d'un). Les splines de base utilisées pour construire les splines de lissage sont constituées de nombreux polynômes se rejoignant sur les nœuds, plus vous avez de nœuds, plus vous avez de degrés de liberté. C'est pourquoi k est intrinsèquement lié au nombre de nœuds, qui est décrit en détail dans le livre de Simon Woods.
nukimov