← Catálogo
· Capítulo 6
T06_mST_CP_Macro.R
# ══════════════════════════════════════════════════
# 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) ===