Analítica de Personas · Semestre otoño 2026 · Semana 5 · Prof. René Gempp
La regresión lineal estima coeficientes siempre. Le das cualquier dataset y te entrega números. Pero esos números solo son confiables si se cumplen ciertos supuestos. Si los supuestos están seriamente violados, los p-values, los intervalos de confianza y la interpretación del modelo pueden ser engañosos. Diagnosticar el modelo es el equivalente a, en una auditoría contable, revisar que los libros estén cuadrados antes de firmar el informe.
| Supuesto | Qué dice | Cómo se chequea |
|---|---|---|
| Linealidad | La relación entre cada VI y la VD es aproximadamente lineal. | Gráfico de residuos vs. valores ajustados. |
| Independencia | Las observaciones son independientes entre sí. | Conocimiento del diseño del estudio (no es un test estadístico). |
| Homocedasticidad | La varianza de los residuos es constante a lo largo de los valores ajustados. | Gráfico de residuos vs. valores ajustados (de nuevo). |
| Normalidad de residuos | Los residuos siguen aproximadamente una distribución normal. | QQ-plot, histograma de residuos. |
A esto se agrega una preocupación práctica que no es un "supuesto" formal pero sí una condición de buena especificación: la multicolinealidad, que aparece cuando dos o más predictores miden cosas muy similares.
broom::augment(): extraer residuos y diagnósticosEl paquete broom tiene tres funciones principales (Apunte 13). La que nos sirve para diagnóstico es augment(): toma un modelo y devuelve los datos originales enriquecidos con columnas nuevas (residuos, valores ajustados, leverage, etc.).
library(broom)
diagnostico <- augment(modelo_2)
glimpse(diagnostico)
Las columnas que agrega augment():
| Columna | Qué contiene |
|---|---|
.fitted | Valor predicho por el modelo (ŷ) |
.resid | Residuo: y − ŷ |
.std.resid | Residuo estandarizado (dividido por su error estándar) |
.hat | Leverage: cuán "extremo" es el caso en sus predictores |
.cooksd | Distancia de Cook: influencia del caso sobre el modelo |
.sigma | Error estándar residual del modelo si ese caso fuera eliminado |
ggplot(diagnostico, aes(x = .fitted, y = .resid)) +
geom_point(alpha = 0.4) +
geom_hline(yintercept = 0, color = "red") +
geom_smooth(se = FALSE) +
labs(
title = "Residuos vs. valores ajustados",
x = "Valor ajustado", y = "Residuo"
) +
theme_minimal()
Cómo leer este gráfico:
| Lo que ves | Lo que significa |
|---|---|
| Nube simétrica alrededor de cero, sin patrón | ✅ Bien. Linealidad y homocedasticidad razonables. |
| Forma de embudo (varianza crece con ŷ) | ⚠️ Heterocedasticidad. Considera transformar la VD (e.g., log). |
| Curva sistemática en el suavizador | ⚠️ Falta de linealidad. Considera agregar términos cuadráticos o transformar predictores. |
| Puntos muy alejados del resto | ⚠️ Outliers. Investigar caso por caso, no eliminar a ciegas. |
ggplot(diagnostico, aes(sample = .std.resid)) +
stat_qq(alpha = 0.5) +
stat_qq_line(color = "red") +
labs(
title = "Normalidad de los residuos",
x = "Cuantiles teóricos", y = "Cuantiles observados"
) +
theme_minimal()
El QQ-plot compara los cuantiles observados de los residuos contra los cuantiles que esperaríamos si fueran perfectamente normales. Si los puntos caen sobre la línea diagonal, los residuos son aproximadamente normales.
| Patrón | Diagnóstico |
|---|---|
| Puntos sobre la diagonal | ✅ Normalidad razonable. |
| Puntas que se separan en los extremos | ⚠️ Colas más pesadas que la normal (típico con outliers). |
| Forma de "S" | ⚠️ Distribución sesgada. |
car::vif()La multicolinealidad aparece cuando dos o más predictores están altamente correlacionados entre sí. El problema no es que el modelo "se rompa" — los coeficientes siguen siendo insesgados — sino que sus errores estándar se inflan, los coeficientes individuales se vuelven inestables y difíciles de interpretar.
El VIF (Variance Inflation Factor) cuantifica este problema: indica cuánto se infla la varianza del coeficiente de cada predictor por su correlación con los demás predictores del modelo.
library(car)
vif(modelo_2)
| Valor de VIF | Interpretación |
|---|---|
| VIF ≈ 1 | Predictor no correlacionado con los demás. Ideal. |
| 1 < VIF < 5 | Correlación moderada. Sin problema. |
| 5 ≤ VIF < 10 | ⚠️ Atención. Revisar si hay redundancia. |
| VIF ≥ 10 | ⛔ Problema serio. Eliminar uno de los predictores correlacionados. |
vif() reporta el GVIF (Generalized VIF) y la columna GVIF^(1/(2*Df)). Esa última es la que se compara con los umbrales clásicos: el valor 2 equivale a un VIF tradicional de 4, y el valor 3.16 equivale a un VIF de 10.
Una observación es influyente si, al eliminarla, los coeficientes del modelo cambian sustancialmente. La distancia de Cook combina dos cosas: cuán extremo es el residuo y cuán extremo es el caso en sus predictores (leverage).
# Identificar los casos más influyentes
diagnostico |>
arrange(desc(.cooksd)) |>
slice_head(n = 10) |>
select(.cooksd, .fitted, .resid)
# Regla práctica: Cook's D > 4/n merece atención
n <- nrow(diagnostico)
diagnostico |>
filter(.cooksd > 4 / n)
El modelo lineal es razonablemente robusto. En la práctica de people analytics, con muestras de cientos o miles de empleados:
sandwich).El diagnóstico no es un examen que el modelo "aprueba o reprueba". Es una conversación entre el analista y los datos: "¿confío lo suficiente en este modelo como para presentar sus resultados al directorio?".
| Paso | Función | Qué buscar |
|---|---|---|
| 1. Multicolinealidad | car::vif(modelo) | VIFs < 5 |
| 2. Residuos vs. ajustados | augment() + geom_point() | Nube sin patrón sistemático |
| 3. Normalidad de residuos | stat_qq() | Puntos cerca de la diagonal |
| 4. Influyentes | arrange(desc(.cooksd)) | Cook's D < 4/n |