Apunte 12 — Diagnóstico de regresión: residuos, VIF y supuestos

Analítica de Personas · Semestre otoño 2026 · Semana 5 · Prof. René Gempp

1. Por qué necesitamos diagnosticar el modelo

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.

2. Los cuatro supuestos clásicos del modelo lineal

SupuestoQué diceCómo se chequea
LinealidadLa relación entre cada VI y la VD es aproximadamente lineal.Gráfico de residuos vs. valores ajustados.
IndependenciaLas observaciones son independientes entre sí.Conocimiento del diseño del estudio (no es un test estadístico).
HomocedasticidadLa varianza de los residuos es constante a lo largo de los valores ajustados.Gráfico de residuos vs. valores ajustados (de nuevo).
Normalidad de residuosLos 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.

3. broom::augment(): extraer residuos y diagnósticos

El 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():

ColumnaQué contiene
.fittedValor predicho por el modelo (ŷ)
.residResiduo: y − ŷ
.std.residResiduo estandarizado (dividido por su error estándar)
.hatLeverage: cuán "extremo" es el caso en sus predictores
.cooksdDistancia de Cook: influencia del caso sobre el modelo
.sigmaError estándar residual del modelo si ese caso fuera eliminado

4. Gráfico residuos vs. valores ajustados

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 vesLo 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.

5. QQ-plot: normalidad de los residuos

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ónDiagnó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.
Nota tranquilizadora: Con muestras grandes (N > 200, lo que es la regla en RRHH), el modelo lineal es bastante robusto a desviaciones moderadas de la normalidad. No hay que entrar en pánico si el QQ-plot no es perfecto.

6. Multicolinealidad: 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 VIFInterpretación
VIF ≈ 1Predictor no correlacionado con los demás. Ideal.
1 < VIF < 5Correlación moderada. Sin problema.
5 ≤ VIF < 10⚠️ Atención. Revisar si hay redundancia.
VIF ≥ 10⛔ Problema serio. Eliminar uno de los predictores correlacionados.
Para variables categóricas con más de 2 niveles: 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.

7. Observaciones influyentes: la distancia de Cook

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)
NO eliminar observaciones a ciegas: Un caso influyente no es "un error". Puede ser un dato perfectamente válido que cuenta una historia importante (por ejemplo: el único gerente de un departamento, una empleada con un sueldo excepcional). La regla profesional es: investigar caso por caso, documentar la decisión y, si se decide excluir, reportarlo explícitamente en el memo.

8. Cuándo no preocuparse demasiado

El modelo lineal es razonablemente robusto. En la práctica de people analytics, con muestras de cientos o miles de empleados:

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?".

9. Resumen: el chequeo mínimo antes de reportar

PasoFunciónQué buscar
1. Multicolinealidadcar::vif(modelo)VIFs < 5
2. Residuos vs. ajustadosaugment() + geom_point()Nube sin patrón sistemático
3. Normalidad de residuosstat_qq()Puntos cerca de la diagonal
4. Influyentesarrange(desc(.cooksd))Cook's D < 4/n