Ho esplorato una serie di strumenti per le previsioni e ho scoperto che i modelli di additivi generalizzati (GAM) hanno il massimo potenziale per questo scopo. I GAM sono fantastici! Consentono di specificare in modo molto succinto modelli complessi. Tuttavia, quella stessa sintonia mi sta creando confusione, in particolare per quanto riguarda il modo in cui i GAM concepiscono termini di interazione e covariate.
Considera un set di dati di esempio (codice riproducibile alla fine del post) in cui y
è una funzione monotonica perturbata da un paio di gaussiani, oltre ad alcuni rumori:
Il set di dati ha alcune variabili predittive:
x
: L'indice dei dati (1-100).w
: Una funzione secondaria che segna le sezioni iny
cui è presente un gaussiano.w
ha valori compresi tra 1x
e 20, compresi tra 11 e 30 e tra 51 e 70. Altrimenti,w
è 0.w2
:w + 1
, in modo che non ci siano 0 valori.
Il mgcv
pacchetto di R rende semplice specificare un numero di possibili modelli per questi dati:
I modelli 1 e 2 sono abbastanza intuitivi. La previsione y
solo dal valore dell'indice nella x
levigatezza predefinita produce qualcosa di vagamente corretto, ma troppo regolare. Prevedere y
solo dai w
risultati in un modello del "gaussiano medio" presente y
e nessuna "consapevolezza" degli altri punti dati, che hanno tutti un w
valore di 0.
Il modello 3 usa entrambi x
e w
come smooth 1D, producendo una buona vestibilità. Il modello 4 utilizza x
e w
in un 2D liscio, dando anche una buona vestibilità. Questi due modelli sono molto simili, sebbene non identici.
Modelli modello 5 x
"by" w
. Il modello 6 fa il contrario. mgcv
La documentazione afferma che "l'argomento by assicura che la funzione smooth venga moltiplicata per [la covariata fornita nell'argomento 'by']". Quindi i modelli 5 e 6 non dovrebbero essere equivalenti?
I modelli 7 e 8 usano uno dei predittori come termine lineare. Questi hanno un senso intuitivo per me, poiché stanno semplicemente facendo ciò che un GLM farebbe con questi predittori, e quindi aggiungendo l'effetto al resto del modello.
Infine, il Modello 9 è uguale al Modello 5, tranne per il fatto che x
viene smussato "da" w2
(che è w + 1
). La cosa strana per me qui è che l'assenza di zeri in w2
produce un effetto notevolmente diverso nell'interazione "by".
Quindi, le mie domande sono queste:
- Qual è la differenza tra le specifiche nei modelli 3 e 4? C'è qualche altro esempio che evidenzierebbe la differenza più chiaramente?
- Cosa sta facendo esattamente "by" qui? Gran parte di ciò che ho letto nel libro di Wood e in questo sito web suggerisce che "by" produce un effetto moltiplicativo, ma ho difficoltà a comprenderne l'intuizione.
- Perché ci sarebbe una differenza così notevole tra i modelli 5 e 9?
Segue Reprex, scritto in 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)