Pruebas de Hipótesis y Gráficos Diagnósticos
Siete pruebas formales (t, F, Shapiro-Wilk, Jarque-Bera, Durbin-Watson, Ljung-Box, Breusch-Pagan, ADF) y nueve gráficos diagnósticos. Código R autocontenido con AirPassengers, nottem, UKDriverDeaths y más.
¿Por qué el diagnóstico es el paso más importante?
Hay un patrón común en los análisis de series de tiempo: mucho esfuerzo ajustando modelos y eligiendo parámetros, pero muy poco revisando los residuos. El resultado: modelos con R² alto que producen pronósticos pobres, o con inferencias estadísticas inválidas porque se violaron supuestos.
Los residuos son la huella del error de especificación. Si el modelo es correcto, los residuos no deberían tener ninguna estructura —deberían parecer ruido aleatorio. Cualquier patrón visible en los residuos es una señal de que el modelo se puede mejorar.
Un analista experimentado revisa los residuos antes de comunicar cualquier resultado. Esta es la prueba de fuego del modelo.
Un modelo de regresión para series de tiempo solo es válido si sus residuos se comportan como ruido blanco gaussiano: . Este módulo reúne todas las pruebas formales y gráficos diagnósticos para verificarlo, con ejemplos reproducibles usando datasets de R base.
Los cuatro supuestos que verificarás — en orden de importancia
1. Independencia
Si los residuos están correlacionados, los errores estándar son incorrectos y las pruebas t no son válidas. Es el supuesto más crítico en series de tiempo.
ACF, Ljung-Box, Durbin-Watson
2. Homocedasticidad
Si la varianza cambia con el tiempo o con el nivel, los intervalos de predicción serán mal calibrados.
Gráfico residuos vs ajustados, Breusch-Pagan
3. Media cero
Si los residuos tienen sesgo sistemático, el modelo está subestimando o sobreestimando en alguna región.
Gráfico residuos vs tiempo
4. Normalidad
Necesaria para las pruebas t y los IC exactos. Con n grande (>30), el TCL suaviza las violaciones moderadas.
Q-Q plot, Shapiro-Wilk
Configuración inicial — funciones auxiliares y paquetes
Copia este bloque al inicio de cualquier script del curso para tener todas las funciones disponibles.
8.1 Pruebas sobre los parámetros del modelo
T·01 — Prueba t para βₚ: grado del polinomio de tendencia
Objetivo: Determinar si la potencia más alta contribuye significativamente a la tendencia, o si podría reducirse a grado .
Modelo: , con .
Hipótesis:
- : (el grado no es necesario)
- : (el grado es significativo)
donde .
Regla de decisión: Si (usualmente ), se rechaza y el grado se justifica. En caso contrario, reducir a .
El grado cuyo p-valor > 0.05 puede eliminarse.
Cómo leer la salida de R
En summary(mod)$coef, la última fila antes de los coeficientes estacionales corresponde a . Si su columna Pr(>|t|) es menor a 0.05, el grado se mantiene. Si es mayor, prueba con .
T·02 — Prueba t para δᵢ: efectos estacionales con indicadoras
Objetivo: Verificar si la estación tiene un nivel medio que difiere significativamente de la estación de referencia .
Hipótesis:
- : (la estación no difiere de la referencia)
- : (la estación tiene efecto propio)
Nota en modelos multiplicativos: La interpretación en escala original usa : si , la estación 1 tiene un nivel 12.3% menor que la de referencia.
Todos los meses resultan significativos para nottem: máximo en julio (+21°F vs diciembre).
T·03 — Prueba t para αⱼ y γⱼ: parámetros trigonométricos
Objetivo: Decidir si la onda senoidal de frecuencia contribuye al patrón estacional.
Hipótesis por parámetro:
- : (o )
- : (o )
Regla de decisión: Si al menos uno de los dos parámetros o es significativo, la onda debe conservarse. Solo si ambos son no significativos se puede eliminar.
La prueba F de anova() compara el modelo con y sin la onda j. Si p > 0.05, la onda puede eliminarse.
T·04 — Prueba F global (ANOVA): significancia conjunta del modelo
Objetivo: Evaluar si el conjunto completo de predictores explica una proporción significativa de la variabilidad.
Hipótesis:
- :
- : Al menos un coeficiente es
Relación con R²
El estadístico F también se puede expresar como . Un alto no garantiza significancia individual de cada predictor, pero sí global.
1data("AirPassengers")2yt <- AirPassengers; n <- length(yt); t <- 1:n3poli <- Mipoly(t, 1); mdum <- seasonaldummy(yt)4mod <- lm(log(as.numeric(yt)) ~ ., data = cbind(poli, mdum))5sm <- summary(mod)6cat("F =", round(sm$fstatistic[1], 2), " gl =", sm$fstatistic[2], "y", sm$fstatistic[3], "7")8cat("P-valor =", format.pval(pf(sm$fstatistic[1], sm$fstatistic[2], sm$fstatistic[3], lower.tail=FALSE), digits=4), "9")10cat("R² ajustado =", round(sm$adj.r.squared, 4), "11")12print(anova(mod))
Para AirPassengers, R² ≈ 0.995 y F >> 1000.
8.2 Pruebas de normalidad de residuos
T·05a — Shapiro-Wilk
Hipótesis: : los residuos provienen de una distribución normal. : no normalidad.
El estadístico : valores cercanos a 1 indican normalidad. Con usar Jarque-Bera.
Colas pesadas (puntos se alejan en extremos) indican distribución leptocúrtica.
Cuidado con muestras grandes
Con , Shapiro-Wilk detecta desviaciones pequeñas de la normalidad que son irrelevantes en la práctica. Siempre complementar con el Q-Q plot visual y recordar que el TCL garantiza aproximación normal para suficientemente grande.
8.3 Pruebas de autocorrelación (independencia)
T·06 — Durbin-Watson: autocorrelación de orden 1
Hipótesis:
- : (no autocorrelación de primer orden)
- : (autocorrelación de primer orden)
Rango: . Cerca de 2 → no autocorrelación. DW < 2 → autocorrelación positiva. DW > 2 → negativa.
T·07 — Ljung-Box: autocorrelación hasta el rezago m
Hipótesis:
- :
- :
Elección de m: Para series estacionales usar (dos periodos). Series mensuales → .
Puntos rojos bajo la línea α=0.05 indican autocorrelación significativa.
8.4 Prueba de homocedasticidad
T·08 — Breusch-Pagan / White: varianza constante
Hipótesis:
- : (homocedasticidad)
- : depende de los predictores
Breusch-Pagan: regresa sobre los predictores. El estadístico .
Patrón de embudo indica heterocedasticidad → aplicar log(Yt).
8.5 Prueba de estacionariedad — Dickey-Fuller Aumentada
T·09 — ADF: raíz unitaria
Contexto: Si el modelo no elimina completamente la tendencia, los residuos pueden ser no estacionarios.
Hipótesis:
- : (raíz unitaria — no estacionario)
- : (estacionario)
El modelo aumentado: .
Si los residuos son estacionarios (ADF rechaza H₀), la tendencia fue correctamente eliminada.
8.6 Guía completa de gráficos diagnósticos
Ejecuta este bloque para ver la serie ajustada.
Guía de gráficos individuales
- G·01 — Serie observada vs ajustada: La curva ajustada debe seguir el centro de los datos. Desviaciones sistemáticas indican mala especificación.
- G·02 — Residuos vs tiempo: Nube horizontal centrada en cero. Ciclos → autocorrelación. Embudo → heterocedasticidad.
- G·03 — Residuos vs ajustados: Dispersión aleatoria. Curvatura → término cuadrático omitido. Embudo → varianza proporcional al nivel.
- G·04 — Q-Q plot normal: Si los puntos siguen la diagonal, los residuos son normales. Colas pesadas o asimetría indican desviaciones.
- G·05/06 — ACF y PACF de residuos: Ninguna barra debe superar las bandas . Barras en múltiplos de indican estacionalidad residual.
- G·07 — Boxplots por estación: Si las medianas son distintas de cero para algunas estaciones, el modelo estacional no captura bien esas estaciones.
1data("nottem")2mod_n <- lm(as.numeric(nottem) ~ seasonaldummy(nottem))3e_n <- residuals(mod_n)4esp_n <- spec.pgram(diff(as.numeric(nottem)), taper=0, log="no", plot=FALSE)5df_esp <- data.frame(freq=esp_n$freq, spec=esp_n$spec)6g_period <- ggplot(df_esp, aes(x=freq, y=spec)) +7geom_line(color="#475569", linewidth=0.7) +8geom_vline(xintercept=(1:6)/12, color="#ef4444", linetype="dashed", alpha=0.8) +9labs(title="Periodograma — diff(nottem)", x="Frecuencia", y="Potencia") + theme_bw(base_size=12)10df_bx <- data.frame(resid=e_n, mes=factor(month.abb[cycle(nottem)], levels=month.abb))11g_box <- ggplot(df_bx, aes(x=mes, y=resid, fill=mes)) +12geom_boxplot(show.legend=FALSE) + geom_hline(yintercept=0, linetype="dashed", color="#ef4444") +13labs(title="Residuos por mes", x="Mes", y="Ehat") + theme_bw(base_size=12)14g_period / g_box
Medianas distintas de cero por mes sugieren añadir interacciones o STL.
8.7 Tabla de referencia rápida
| Prueba / Gráfico | ¿Cuándo usarla? | Función R | Problema si falla |
|---|---|---|---|
| t para βₚ | Al decidir grado del polinomio | summary(lm) | Sobreparametrización |
| t para δᵢ | Validar cada efecto estacional | summary(lm) | Estacionalidad irrelevante |
| t para αⱼ/γⱼ | Validar cada armónico Fj | summary(lm) + anova() | Onda innecesaria |
| F global (ANOVA) | Significancia conjunta del modelo | summary(lm)$fstatistic | Modelo inútil |
| Shapiro-Wilk | Normalidad (n < 5000) | shapiro.test(resid) | Tests t e IC inválidos |
| Jarque-Bera | Normalidad (n grande) | jarque.bera.test(resid) | Asimetría/curtosis excesiva |
| Durbin-Watson | Autocorrelación orden 1 | durbinWatsonTest(mod) | DW ≠ 2 → AR(1) residual |
| Ljung-Box | Autocorrelación hasta rezago m | Box.test(resid, lag, type) | Estructura temporal no modelada |
| Breusch-Pagan | Homocedasticidad | bptest(mod) | Heterocedasticidad → log() |
| ADF | Estacionariedad de residuos | adf.test(resid) | Raíz unitaria → modelo incompleto |
| G: Serie vs ajust. | Calidad de ajuste visual | ggplot | Desviaciones sistemáticas |
| G: Resid vs t | Ciclos, tendencia residual | ggplot | Autocorrelación, heterocedasticidad |
| G: Q-Q plot | Normalidad visual | stat_qq() | Colas pesadas, asimetría |
| G: ACF/PACF | Estructura de correlación | acf(), pacf() | Modelo insuficiente |
| G: Boxplot estac. | Ajuste por estación | ggplot + geom_boxplot | Efecto estacional mal modelado |
| G: Periodograma | Identificar frecuencias | spec.pgram(diff(y)) | Omitir frecuencias importantes |
8.8 Datasets y paquetes del curso
Datasets utilizados
| Dataset | Paquete | Frecuencia | Período | Descripción |
|---|---|---|---|---|
| AirPassengers | datasets | Mensual | 1949–1960 | Pasajeros aéreos EE.UU. (multiplicativo) |
| nottem | datasets | Mensual | 1920–1939 | Temperatura Nottingham Castle (estacional puro) |
| UKDriverDeaths | datasets | Mensual | 1969–1984 | Muertes en carretera Reino Unido |
| USAccDeaths | datasets | Mensual | 1973–1978 | Muertes accidentales EE.UU. |
| co2 | datasets | Mensual | 1959–1997 | CO₂ Mauna Loa (tendencia fuerte) |
| LakeHuron | datasets | Anual | 1875–1972 | Nivel del Lago Hurón |
| sunspot.year | datasets | Anual | 1700–1988 | Manchas solares (ciclos ~11 años) |
| taylor | forecast | 30-min | 2000 | Demanda eléctrica (doble estacionalidad) |
| gas | forecast | Mensual | 1956–1995 | Producción de gas Australia |
Paquetes de R requeridos
1paquetes_curso <- c(2"forecast", "tseries", "TSA",3"lmtest", "car", "skedastic",4"ggplot2", "patchwork", "viridis",5"dplyr", "tidyr", "lubridate"6)7install.packages(paquetes_curso)8invisible(lapply(paquetes_curso, library, character.only = TRUE))
Ejecuta este bloque una sola vez. Si ya tienes los paquetes, solo ejecuta library().
Resumen del ciclo de validación
El flujo completo de diagnóstico para un modelo es:
- Panel visual: gráficos de serie, residuos, Q-Q, ACF
- Normalidad:
shapiro.test(resid)+ Q-Q plot - Independencia:
Box.test(resid, lag=2s)+ ACF - Homocedasticidad:
bptest(mod)+ gráfico resid vs ajust. - Estacionariedad:
adf.test(resid)si hay dudas - Significancia:
summary(mod)para cada coeficiente
Si alguna prueba falla, consulta la columna "Problema si falla" de la tabla anterior para la acción correctiva.