Múltiples predictores: cuando uno no basta
La fórmula con múltiples predictores
La sintaxis es la misma que en regresión simple, separando predictores con +:
modelo <- lm(mpg ~ wt + hp, data = mtcars)
summary(modelo)
#> ...
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) 37.22727 1.59879 23.285 < 2e-16 ***
#> wt -3.87783 0.63273 -6.129 1.12e-06 ***
#> hp -0.03177 0.00903 -3.519 0.00145 **Ahora hay dos predictores. La recta ha pasado a ser un plano (en general, un hiperplano en k dimensiones).
Interpretación: “ajustando por las demás”
Esto es la clave conceptual que separa entender regresión múltiple de hacer copy-paste. Lee el coeficiente de wt:
“Manteniendo
hpconstante, un incremento de 1 unidad enwtse asocia, en media, con una reducción de 3.88 unidades enmpg”.
La frase “manteniendo X constante” (o “ajustando por X” o “controlando por X”) es lo crítico. El coeficiente de wt en este modelo no es el mismo que en el modelo lm(mpg ~ wt) solo. ¿Por qué?
Porque wt y hp están correlacionados. En la regresión simple, parte del efecto de hp se cuela en el coeficiente de wt (variables omitidas). Al añadir hp al modelo, el coeficiente de wt se ajusta para reflejar solo la contribución única de wt.
Esto es lo que hace la regresión múltiple útil: separa contribuciones únicas cuando los predictores están correlacionados.
Variables categóricas como predictores
Cuando un predictor es un factor, R crea automáticamente variables dummy:
mtcars$cyl <- factor(mtcars$cyl) # convertir a factor
modelo <- lm(mpg ~ wt + cyl, data = mtcars)
summary(modelo)
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) 33.9908 1.8878 18.006 < 2e-16 ***
#> wt -3.2056 0.7559 -4.241 0.000222 ***
#> cyl6 -4.2556 1.3861 -3.070 0.004718 **
#> cyl8 -6.0709 1.6520 -3.674 0.000999 ***Lectura:
- Intercept ahora corresponde al nivel de referencia (
cyl4, el primero alfabéticamente). cyl6(−4.26): cuandocylpasa de 4 a 6,mpgbaja 4.26 unidades en media, controlando porwt.cyl8(−6.07): lo mismo paracyl8vscyl4.
R elige el primer nivel como referencia. Para cambiarla:
mtcars$cyl <- relevel(mtcars$cyl, ref = "8") # ahora cyl8 es la referenciaO con forcats::fct_relevel:
library(forcats)
mtcars$cyl <- fct_relevel(mtcars$cyl, "8")Centrar variables: cuándo y por qué
Cuando un predictor continuo no incluye cero en su rango (peso, presión, edad), el intercept carece de sentido físico. Centrar la variable resuelve esto:
mtcars$wt_c <- mtcars$wt - mean(mtcars$wt)
modelo_centrado <- lm(mpg ~ wt_c + hp, data = mtcars)Ahora el intercept es “el mpg esperado en un coche con peso medio y hp = 0”, ya tiene sentido. Si centras también hp, el intercept se vuelve la predicción para el “coche promedio”.
Centrar también ayuda con interacciones (siguiente sección): reduce la correlación entre el término de interacción y los términos principales.
Centrar no cambia los coeficientes de las variables ni los p-values asociados. Solo cambia el intercept y la interpretación.
Interacciones con *
A veces el efecto de X sobre Y depende del valor de Z. Eso es una interacción.
modelo_inter <- lm(mpg ~ wt * hp, data = mtcars)
summary(modelo_inter)
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) 49.808084 3.605549 13.816 5.01e-14 ***
#> wt -8.216746 1.269971 -6.470 5.20e-07 ***
#> hp -0.120100 0.024695 -4.863 4.04e-05 ***
#> wt:hp 0.027850 0.007420 3.753 0.000811 ***wt * hp se expande automáticamente a wt + hp + wt:hp, los efectos principales más el término de interacción.
Lectura del coeficiente de interacción (wt:hp = 0.028):
“Por cada incremento de 1 unidad en
hp, el efecto dewtsobrempgse incrementa en 0.028 unidades”.
O equivalentemente: “el efecto de wt no es constante, depende del nivel de hp”.
Interpretación práctica: si tienes una interacción significativa, no puedes interpretar wt y hp por separado. Hay que hablar del efecto conjunto.
Regla mental: si necesitas explicar el resultado con la frase “depende del nivel de la otra variable”, hay interacción.
Colinealidad: VIF y qué hacer
Cuando dos o más predictores están muy correlacionados entre sí (colinealidad), los coeficientes individuales se vuelven inestables, pequeños cambios en los datos producen grandes cambios en los coeficientes, y los errores estándar se inflan.
El diagnóstico clásico es el VIF (Variance Inflation Factor):
library(car)
modelo <- lm(mpg ~ wt + hp + disp, data = mtcars)
vif(modelo)
#> wt hp disp
#> 4.844618 2.736633 7.324517Interpretación heurística:
- VIF = 1: sin colinealidad.
- VIF entre 1 y 5: colinealidad moderada, generalmente aceptable.
- VIF > 5: colinealidad notable, considera revisar.
- VIF > 10: colinealidad seria, hay que actuar.
disp aquí tiene VIF = 7.3, está muy correlacionada con wt y hp. Opciones:
- Eliminar una de las variables redundantes (la menos teóricamente importante).
- Combinar las correlacionadas en un índice (PCA, suma estandarizada).
- Regularizar con ridge o lasso (
glmnet).
Si tu objetivo es predicción, la colinealidad importa menos, el modelo predice bien aunque los coeficientes individuales sean inestables. Si tu objetivo es interpretación de coeficientes, la colinealidad importa mucho.
Comparar modelos anidados con anova()
¿Vale la pena añadir un predictor? El test F para modelos anidados responde:
modelo_simple <- lm(mpg ~ wt, data = mtcars)
modelo_completo <- lm(mpg ~ wt + hp + cyl, data = mtcars)
anova(modelo_simple, modelo_completo)
#> Analysis of Variance Table
#>
#> Model 1: mpg ~ wt
#> Model 2: mpg ~ wt + hp + cyl
#> Res.Df RSS Df Sum of Sq F Pr(>F)
#> 1 30 278.32
#> 2 27 158.31 3 120.02 6.8228 0.001434 **Lectura: añadir hp y cyl reduce significativamente la suma de cuadrados residual. El modelo completo es preferible.
Restricciones del test F anidado:
- Solo válido para modelos donde uno es un caso particular del otro (mismas observaciones, predictores del simple ⊆ predictores del completo).
- Para comparar modelos no anidados, usa AIC (
AIC(modelo)) o BIC (BIC(modelo)).
Trampas habituales
- Añadir todas las variables disponibles (“modelo del fregadero”). Con muchas variables y
nmodesto, sobreajustas: los coeficientes ajustan ruido. La parsimonia (menos variables, mejor justificadas) gana en interpretación y suele ganar también en predicción fuera de muestra. - Interpretar coeficientes en presencia de interacción. Si
wt:hpes significativo, no digas “el efecto de wt es −3.88”. Habla del efecto conjunto. - Ignorar
vif()cuando hay correlación alta entre predictores. Coeficientes inestables y errores estándar inflados pueden esconder efectos reales o inventar ruido. - Comparar modelos con distinto número de observaciones. Si dos modelos tienen distintos
NAfiltrados, sus RSS no son comparables. Usana.action = na.omitconsistentemente o filtra explícitamente antes.
En la siguiente entrega
Has aprendido a ajustar modelos con múltiples predictores. Falta verificar que el modelo es válido: que los residuos cumplen los supuestos, que no hay puntos influyentes que distorsionen los coeficientes. Ese es el diagnóstico del modelo, el siguiente tutorial.