← Catálogo · Capítulo 6

T06_mST_CP_Macro.R

Ver crudo
# ══════════════════════════════════════════════════
# 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) ===