Módulo 8·Validación completa del modelo de regresión

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.

Pruebas t para βₚ, δᵢ, αⱼ/γⱼPrueba F global (ANOVA)Normalidad: Shapiro-Wilk, Jarque-BeraAutocorrelación: DW, Ljung-BoxHomocedasticidad: Breusch-PaganEstacionariedad: ADF9 gráficos diagnósticos con ggplot2

¿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: Et∼iidN(0,σ2)E_t \overset{\text{iid}}{\sim} N(0,\sigma^2). 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

▶ setup.R — funciones auxiliares del módulo 8

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 tpt^p contribuye significativamente a la tendencia, o si podría reducirse a grado p−1p-1.

Modelo: Yt=β0+∑j=1pβjtj+EtY_t = \beta_0 + \sum_{j=1}^p \beta_j t^j + E_t, con Et∼iidN(0,σ2)E_t \overset{\text{iid}}{\sim} N(0,\sigma^2).

Hipótesis:

  • H0H_0: βp=0\beta_p = 0 (el grado pp no es necesario)
  • H1H_1: βp≠0\beta_p \neq 0 (el grado pp es significativo)

T0=β^ps.e.(β^p)∼tn−kT_0 = \frac{\hat{\beta}_p}{\text{s.e.}(\hat{\beta}_p)} \sim t_{n-k}

donde k=p+(n∘ de paraˊmetros estacionales)+1k = p + (\text{n}^\circ \text{ de parámetros estacionales}) + 1.

Regla de decisión: Si P(∣tn−k∣>∣T0∣)<αP(|t_{n-k}| > |T_0|) < \alpha (usualmente α=0.05\alpha = 0.05), se rechaza H0H_0 y el grado pp se justifica. En caso contrario, reducir a p−1p - 1.

▶ LakeHuron — prueba t de tendencia

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 β^p\hat{\beta}_p. Si su columna Pr(>|t|) es menor a 0.05, el grado pp se mantiene. Si es mayor, prueba con p−1p-1.

T·02 — Prueba t para δᵢ: efectos estacionales con indicadoras

Objetivo: Verificar si la estación ii tiene un nivel medio que difiere significativamente de la estación de referencia ss.

Hipótesis:

  • H0H_0: δi=0\delta_i = 0 (la estación ii no difiere de la referencia)
  • H1H_1: δi≠0\delta_i \neq 0 (la estación ii tiene efecto propio)

T0=δ^is.e.(δ^i)∼tn−kT_0 = \frac{\hat{\delta}_i}{\text{s.e.}(\hat{\delta}_i)} \sim t_{n-k}

Nota en modelos multiplicativos: La interpretación en escala original usa exp⁡(δ^i)\exp(\hat{\delta}_i): si exp⁡(δ^1)=0.877\exp(\hat{\delta}_1) = 0.877, la estación 1 tiene un nivel 12.3% menor que la de referencia.

▶ nottem — prueba t de efectos estacionales

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 FjF_j contribuye al patrón estacional.

Hipótesis por parámetro:

  • H0H_0: αj=0\alpha_j = 0 (o γj=0\gamma_j = 0)
  • H1H_1: αj≠0\alpha_j \neq 0 (o γj≠0\gamma_j \neq 0)

Regla de decisión: Si al menos uno de los dos parámetros αj\alpha_j o γj\gamma_j es significativo, la onda jj debe conservarse. Solo si ambos son no significativos se puede eliminar.

▶ USAccDeaths — periodograma + modelo trigonométrico

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:

  • H0H_0: β1=⋯=βp=δ1=⋯=δs−1=0\beta_1 = \cdots = \beta_p = \delta_1 = \cdots = \delta_{s-1} = 0
  • H1H_1: Al menos un coeficiente es ≠0\neq 0

F0=MSRMSE=SCR/(k−1)SCE/(n−k)∼Fk−1, n−kF_0 = \frac{MSR}{MSE} = \frac{SCR/(k-1)}{SCE/(n-k)} \sim F_{k-1,\, n-k}

Relación con R²

El estadístico F también se puede expresar como F0=R2/(k−1)(1−R2)/(n−k)F_0 = \frac{R^2/(k-1)}{(1-R^2)/(n-k)}. Un R2R^2 alto no garantiza significancia individual de cada predictor, pero sí global.

Prueba F para modelo AirPassengers
1data("AirPassengers")
2yt <- AirPassengers; n <- length(yt); t <- 1:n
3poli <- 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: H0H_0: los residuos E^t\hat{E}_t provienen de una distribución normal. H1H_1: no normalidad.

El estadístico W∈(0,1]W \in (0, 1]: valores cercanos a 1 indican normalidad. Con n>5000n > 5000 usar Jarque-Bera.

Shapiro-Wilk + Jarque-Bera sobre residuos de AirPassengers

Colas pesadas (puntos se alejan en extremos) indican distribución leptocúrtica.

Cuidado con muestras grandes

Con n>100n > 100, 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 nn suficientemente grande.

8.3 Pruebas de autocorrelación (independencia)

T·06 — Durbin-Watson: autocorrelación de orden 1

Hipótesis:

  • H0H_0: ρ(1)=0\rho(1) = 0 (no autocorrelación de primer orden)
  • H1H_1: ρ(1)≠0\rho(1) \neq 0 (autocorrelación de primer orden)

DW=∑t=2n(E^t−E^t−1)2∑t=1nE^t2≈2(1−ρ^(1))DW = \frac{\sum_{t=2}^n (\hat{E}_t - \hat{E}_{t-1})^2}{\sum_{t=1}^n \hat{E}_t^2} \approx 2(1 - \hat{\rho}(1))

Rango: DW∈[0,4]DW \in [0, 4]. Cerca de 2 → no autocorrelación. DW < 2 → autocorrelación positiva. DW > 2 → negativa.

Durbin-Watson sobre modelo UKDriverDeaths

T·07 — Ljung-Box: autocorrelación hasta el rezago m

Hipótesis:

  • H0H_0: ρ(1)=ρ(2)=⋯=ρ(m)=0\rho(1) = \rho(2) = \cdots = \rho(m) = 0
  • H1H_1: ∃ k≤m:ρ(k)≠0\exists\, k \leq m : \rho(k) \neq 0

QLB=n(n+2)∑k=1mρ^k2n−k∼χm2(bajo H0)Q_{LB} = n(n+2) \sum_{k=1}^{m} \frac{\hat{\rho}_k^2}{n-k} \sim \chi^2_m \quad \text{(bajo } H_0\text{)}

Elección de m: Para series estacionales usar m=2sm = 2s (dos periodos). Series mensuales → m=24m = 24.

Ljung-Box con gráfico de p-valores por rezago

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:

  • H0H_0: Var(Et)=σ2∀ t\text{Var}(E_t) = \sigma^2 \quad \forall\,t (homocedasticidad)
  • H1H_1: Var(Et)\text{Var}(E_t) depende de los predictores

Breusch-Pagan: regresa E^t2\hat{E}_t^2 sobre los predictores. El estadístico BP=nR2∼χk−12BP = nR^2 \sim \chi^2_{k-1}.

Breusch-Pagan (manual) + gráfico de residuos vs ajustados

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:

  • H0H_0: ϕ=1\phi = 1 (raíz unitaria — no estacionario)
  • H1H_1: ∣ϕ∣<1|\phi| < 1 (estacionario)

El modelo aumentado: ΔE^t=μ+ϕE^t−1+∑j=1pγjΔE^t−j+εt\Delta \hat{E}_t = \mu + \phi \hat{E}_{t-1} + \sum_{j=1}^p \gamma_j \Delta \hat{E}_{t-j} + \varepsilon_t.

ADF sobre residuos y serie original co2

Si los residuos son estacionarios (ADF rechaza H₀), la tendencia fue correctamente eliminada.

8.6 Guía completa de gráficos diagnósticos

Panel diagnóstico — AirPassengers

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 ±1.96/n\pm 1.96/\sqrt{n}. Barras en múltiplos de ss 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.
Periodograma y boxplot estacional — nottem
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

Instalación de todos los paquetes del curso
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 Yt=Tt+St+EtY_t = T_t + S_t + E_t es:

  1. Panel visual: gráficos de serie, residuos, Q-Q, ACF
  2. Normalidad: shapiro.test(resid) + Q-Q plot
  3. Independencia: Box.test(resid, lag=2s) + ACF
  4. Homocedasticidad: bptest(mod) + gráfico resid vs ajust.
  5. Estacionariedad: adf.test(resid) si hay dudas
  6. 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.