J'ai exploré un certain nombre d'outils de prévision et j'ai trouvé que les modèles additifs généralisés (GAM) avaient le plus de potentiel à cette fin. Les GAM sont super! Ils permettent de spécifier très succinctement des modèles complexes. Cependant, cette même concision me cause une certaine confusion, en particulier en ce qui concerne la façon dont les GAM conçoivent les termes d'interaction et les covariables.
Prenons un exemple d'ensemble de données (code reproductible à la fin de l'article) dans lequel se y
trouve une fonction monotone perturbée par quelques gaussiens, plus du bruit:
L'ensemble de données comporte quelques variables prédictives:
x
: L'index des données (1-100).w
: Une caractéristique secondaire qui délimite les sectionsy
où un gaussien est présent.w
a des valeurs de 1 à 20 où sex
situe entre 11 et 30, et 51 à 70. Sinon,w
est 0.w2
:w + 1
, pour qu'il n'y ait pas de valeur 0.
Le mgcv
package de R facilite la spécification d'un certain nombre de modèles possibles pour ces données:
Les modèles 1 et 2 sont assez intuitifs. Prédire y
uniquement à partir de la valeur d'index dans x
le lissage par défaut produit quelque chose de vaguement correct, mais trop lisse. Prédire y
uniquement à partir des w
résultats dans un modèle de la «moyenne gaussienne» présente dans y
les autres points de données, et aucune «prise de conscience», qui ont tous une w
valeur de 0.
Le modèle 3 utilise à la fois x
et en w
tant que lisses 1D, produisant un ajustement agréable. Le modèle 4 utilise x
et w
dans un 2D lisse, donnant également un bon ajustement. Ces deux modèles sont très similaires, mais pas identiques.
Modèle 5 modèles x
"par" w
. Le modèle 6 fait le contraire. mgcv
La documentation de 'stipule que "l'argument by garantit que la fonction lisse est multipliée par [la covariable donnée dans l'argument" by "]". Les modèles 5 et 6 ne devraient-ils donc pas être équivalents?
Les modèles 7 et 8 utilisent l'un des prédicteurs comme terme linéaire. Cela a un sens intuitif pour moi, car ils font simplement ce qu'un GLM ferait avec ces prédicteurs, puis ajoutent l'effet au reste du modèle.
Enfin, le modèle 9 est le même que le modèle 5, sauf qu'il x
est lissé "par" w2
(qui est w + 1
). Ce qui est étrange pour moi ici, c'est que l'absence de zéros dans w2
produit un effet remarquablement différent dans l'interaction "par".
Donc, mes questions sont les suivantes:
- Quelle est la différence entre les spécifications des modèles 3 et 4? Y a-t-il un autre exemple qui ferait mieux ressortir la différence?
- Que fait exactement "en" ici? Une grande partie de ce que j'ai lu dans le livre de Wood et ce site Web suggère que "par" produit un effet multiplicatif, mais j'ai du mal à en saisir l'intuition.
- Pourquoi y aurait-il une différence aussi notable entre les modèles 5 et 9?
Reprex suit, écrit en R.
library(magrittr)
library(tidyverse)
library(mgcv)
set.seed(1222)
data.ex <- tibble(
x = 1:100,
w = c(rep(0, 10), 1:20, rep(0, 20), 1:20, rep(0, 30)),
w2 = w + 1,
y = dnorm(x, mean = rep(c(20, 60), each = 50), sd = 3) + (seq(0, 1, length = 100)^2) / 2 + rnorm(100, sd = 0.01)
)
models <- tibble(
model = 1:9,
formula = c('y ~ s(x)', 'y ~ s(w)', 'y ~ s(x) + s(w)', 'y ~ s(x, w)', 'y ~ s(x, by = w)', 'y ~ s(w, by = x)', 'y ~ x + s(w)', 'y ~ w + s(x)', 'y ~ s(x, by = w2)'),
gam = map(formula, function(x) gam(as.formula(x), data = data.ex)),
data.to.plot = map(gam, function(x) cbind(data.ex, predicted = predict(x)))
)
plot.models <- unnest(models, data.to.plot) %>%
mutate(facet = sprintf('%i: %s', model, formula)) %>%
ggplot(data = ., aes(x = x, y = y)) +
geom_point() +
geom_line(aes(y = predicted), color = 'red') +
facet_wrap(facets = ~facet)
print(plot.models)