Modelos aditivos generalizados (GAM)

Los Modelos Aditivos Generalizados (GAM) amplían la regresión lineal sustituyendo los efectos lineales \(\beta_j x_j\) por funciones suaves no paramétricas \(f_j(x_j)\). Cada función se estima automáticamente a partir de los datos con un parámetro de suavizado que equilibra fidelidad y rugosidad. Los GAM mantienen la interpretabilidad de los modelos lineales (cada predictor tiene su propio gráfico de efecto) mientras capturan relaciones no lineales complejas.

El modelo

\[g\!\left(E[y \mid \mathbf{x}]\right) = \beta_0 + f_1(x_1) + f_2(x_2) + \cdots + f_k(x_k)\]

donde \(g\) es la función de enlace (identidad para respuesta continua, logit para binaria, log para recuentos) y cada \(f_j\) es una función suave a estimar. El modelo es aditivo: los efectos de los predictores se suman. Esto es más flexible que la regresión lineal pero más restrictivo que las interacciones arbitrarias.

Cada función \(f_j\) se representa como una combinación lineal de funciones de base spline penalizadas. La penalización controla la suavidad de \(f_j\) y su intensidad (el parámetro de suavizado \(\lambda_j\)) se estima automáticamente maximizando la verosimilitud marginal restringida (REML).

Estimación y grados de libertad efectivos

Para un GAM con respuesta gaussiana, minimizar la deviance penalizada produce:

\[\hat{\mathbf{f}} = \arg\min_{\mathbf{f}} \left\{\|\mathbf{y} - \mathbf{X}\mathbf{f}\|^2 + \sum_j \lambda_j \int [f_j''(x)]^2 dx\right\}\]

Los grados de libertad efectivos (edf) de una función suave miden su complejidad:

  • edf \(\approx 1\): la función es aproximadamente lineal.
  • edf \(\approx 2\): aproximadamente cuadrática.
  • edf alto: curva muy ondulada.

Los grados de libertad efectivos aparecen en la salida de summary(gam) y permiten identificar qué predictores tienen efectos no lineales.

Tres gráficos de efectos parciales de un GAM mostrando funciones suaves estimadas con sus intervalos de confianza para tres predictores

La función suave de \(x_1\) captura el patrón sinusoidal (edf alto), la de \(x_2\) la forma cuadrática, y la de \(x_3\) el efecto aproximadamente lineal (edf \(\approx 1\)). La zona sombreada es el intervalo de confianza al 95 %.

Concavidad

La concavidad (análogo multivariante de la colinealidad) mide si alguna función suave puede aproximarse por una combinación de las demás. Una concavidad alta indica que los efectos de predictores relacionados son difíciles de separar, igual que la multicolinealidad dificulta estimar coeficientes individuales en regresión lineal. Comprueba con concurvity(fit_gam) en R.

Interacciones: suavizados de producto tensorial

Para modelar interacciones no lineales entre dos predictores, usa suavizados de producto tensorial te(x1, x2) o ti(x1, x2) (interacción pura sin efectos principales). Esto ajusta una superficie suave en el espacio 2D de \((x_1, x_2)\).

Mapa de calor de la superficie de interacción de un GAM bidimensional entre dos predictores continuos

⚠️ El supuesto de aditividad puede no cumplirse

Los GAM asumen que los efectos de los predictores se suman sin interacciones (salvo las modeladas explícitamente). Si la relación real tiene interacciones fuertes entre predictores, un GAM sin términos de interacción puede ajustar mal.

Comprueba siempre el gráfico de residuos del GAM. Si hay patrones sistemáticos en función de dos predictores simultáneamente, considera añadir te(x1, x2). Sin embargo, los suavizados de producto tensorial consumen muchos grados de libertad: limítalos a las interacciones más plausibles desde un punto de vista sustantivo.

💡 GAM en R

library(mgcv)

# Ajuste básico con REML
fit <- gam(y ~ s(x1) + s(x2) + s(x3),
           data = df, method = "REML")

summary(fit)      # edf, p-valores, R² ajustado, deviance explicada
plot(fit, pages=1) # gráficos de efectos parciales con IC
gam.check(fit)    # diagnósticos de residuos

# Verificar concavidad
concurvity(fit, full=FALSE)  # < 0.8 es razonable

# Interacción suave entre dos predictores
fit_int <- gam(y ~ s(x1) + s(x2) + te(x1, x2), data=df, method="REML")

# GAM para respuesta binaria (logit)
fit_bin <- gam(y ~ s(x1) + x2, data=df,
               family=binomial, method="REML")