# ══════════════════════════════════════════════════ # T06 · Caso práctico Macro — IPC de España (INE) # Abre primero mSeriesTemporales.Rproj en RStudio # Datos: data/ipc_mensual_espana.RData (INE, serie IPC290751) # ══════════════════════════════════════════════════ library(tidyverse) library(forecast) library(seasonal) pausa <- function(msg = "\n [Pulsa ENTER para continuar...]") { if (interactive()) { cat(msg); invisible(readline()) } } # ── 1. CARGA Y PREPARACION ──────────────────────── load("data/ipc_mensual_espana.RData") ipc <- ipc_mensual_espana ipc$fecha <- as.Date(ipc$fecha) ipc_ts <- ts(ipc$ipc, start = c(2002, 1), frequency = 12) lipc_ts <- ts(log(ipc$ipc), start = c(2002, 1), frequency = 12) pausa("\n [Datos cargados. Pulsa ENTER...]") # ── 2. IDENTIFICACION: d, D Y CORRELOGRAMA ──────── cat(sprintf("ndiffs (regular) : %d\n", ndiffs(lipc_ts))) cat(sprintf("nsdiffs OCSB : %d\n", nsdiffs(lipc_ts, test = "ocsb"))) cat(sprintf("nsdiffs seas (fuerza) : %d\n", nsdiffs(lipc_ts, test = "seas"))) d1D1 <- diff(diff(lipc_ts, lag = 1), lag = 12) op <- par(mfrow = c(1, 2)) acf(d1D1, lag.max = 24, main = "FAC tras (1-L)(1-L^12)") pacf(d1D1, lag.max = 24, main = "FACP tras (1-L)(1-L^12)") par(op) cat("Pico claro en el retardo 12 -> componente SMA(1) estacional.\n") pausa() # ── 3. MODELO AIRLINE Y SU VALIDACION ───────────── m_airline <- Arima(lipc_ts, order = c(0, 1, 1), seasonal = list(order = c(0, 1, 1), period = 12), method = "ML") res_air <- residuals(m_airline) lb_air <- Box.test(res_air, lag = 24, type = "Ljung-Box", fitdf = 2) cat(sprintf("Airline (0,1,1)(0,1,1)[12]: AIC=%.1f | LB(24) Q=%.2f p=%.4f -> %s\n", AIC(m_airline), lb_air$statistic, lb_air$p.value, ifelse(lb_air$p.value > 0.05, "supera validacion", "NO supera validacion"))) pausa() # ── 4. REFINAMIENTO CON auto.arima() ────────────── auto_ipc <- auto.arima(lipc_ts, seasonal = TRUE, stepwise = FALSE, approximation = FALSE) res_auto <- residuals(auto_ipc) lb_auto <- Box.test(res_auto, lag = 24, type = "Ljung-Box", fitdf = length(coef(auto_ipc))) cat("Modelo de auto.arima():\n") print(auto_ipc) cat(sprintf("LB(24) Q=%.2f p=%.4f -> %s\n", lb_auto$statistic, lb_auto$p.value, ifelse(lb_auto$p.value > 0.05, "supera validacion", "NO supera validacion"))) pausa() # ── 5. AJUSTE ESTACIONAL CON X-13ARIMA-SEATS ────── m_x13 <- seas(ipc_ts) cat("Resumen del modelo regARIMA seleccionado por X-13:\n") summary(m_x13) cat("\nContraste QS (estacionalidad residual), original vs ajustada:\n") print(qs(m_x13)[c("qsori", "qssadj"), ]) plot(ts.union(original = ipc_ts, ajustada = final(m_x13)), plot.type = "single", col = c("grey60", "black"), lwd = c(1, 2), main = "IPC original vs desestacionalizado (X-13ARIMA-SEATS)") legend("topleft", legend = c("Original", "Ajustada"), col = c("grey60", "black"), lwd = c(1, 2)) # === FIN Caso Práctico Macro — Tema 06 (IPC, SARIMA y ajuste estacional) ===