He estado explorando una serie de herramientas para pronosticar, y he encontrado que los Modelos Aditivos Generalizados (GAM) tienen el mayor potencial para este propósito. ¡Los GAM son geniales! Permiten especificar modelos complejos de manera muy sucinta. Sin embargo, esa misma brevedad me está causando cierta confusión, específicamente con respecto a cómo los GAM conciben términos de interacción y covariables.
Considere un conjunto de datos de ejemplo (código reproducible al final de la publicación) en el que y
es una función monotónica perturbada por un par de gaussianos, más algo de ruido:
El conjunto de datos tiene algunas variables predictoras:
x
: El índice de los datos (1-100).w
: Una característica secundaria que marca las secciones dey
donde está presente un gaussiano.w
tiene valores de 1-20 dondex
está entre 11 y 30, y 51 a 70. De lo contrario,w
es 0.w2
:w + 1
para que no haya valores 0.
El mgcv
paquete de R facilita la especificación de una serie de modelos posibles para estos datos:
Los modelos 1 y 2 son bastante intuitivos. Predecir y
solo a partir del valor del índice en la x
suavidad predeterminada produce algo vagamente correcto, pero demasiado suave. Predecir y
solo a partir de los w
resultados en un modelo del "promedio gaussiano" presente en y
, y sin "conocimiento" de los otros puntos de datos, todos los cuales tienen un w
valor de 0.
El modelo 3 usa ambos x
y w
como suaviza 1D, produciendo un buen ajuste. El modelo 4 utiliza x
y w
en un 2D suave, también dando un buen ajuste. Estos dos modelos son muy similares, aunque no idénticos.
Modelo 5 modelos x
"por" w
. El modelo 6 hace lo contrario. mgcv
La documentación indica que "el argumento by asegura que la función suave se multiplique por [la covariable dada en el argumento 'by']". Entonces, ¿no deberían ser equivalentes los modelos 5 y 6?
Los modelos 7 y 8 usan uno de los predictores como un término lineal. Estos tienen un sentido intuitivo para mí, ya que simplemente están haciendo lo que un GLM haría con estos predictores, y luego agregan el efecto al resto del modelo.
Por último, el Modelo 9 es el mismo que el Modelo 5, excepto que x
se suaviza "por" w2
(que es w + 1
). Lo que me resulta extraño aquí es que la ausencia de ceros en w2
produce un efecto notablemente diferente en la interacción "por".
Entonces, mis preguntas son estas:
- ¿Cuál es la diferencia entre las especificaciones en los modelos 3 y 4? ¿Hay algún otro ejemplo que destaque la diferencia más claramente?
- ¿Qué es exactamente "haciendo" aquí? Gran parte de lo que he leído en el libro de Wood y en este sitio web sugiere que "por" produce un efecto multiplicador, pero tengo problemas para comprender su intuición.
- ¿Por qué habría una diferencia tan notable entre los modelos 5 y 9?
Reprex sigue, escrito 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)