← Catálogo
· Capítulo 3
T03_mST_CP_Macro.R
# ══════════════════════════════════════════════════
# T03 · Caso práctico Macro — PIB de España (INE)
# Abre primero mSeriesTemporales.Rproj en RStudio
# Datos: data/pib_trimestral_espana.RData (INE CNTR4893 -> nivel)
# ══════════════════════════════════════════════════
library(tidyverse)
library(forecast)
pausa <- function(msg = "\n [Pulsa ENTER para continuar...]") {
if (interactive()) { cat(msg); invisible(readline()) }
}
# ── 1. CARGA Y PREPARACION ────────────────────────
load("data/pib_trimestral_espana.RData")
pib <- pib_trimestral_espana
pib$fecha <- as.Date(pib$fecha)
lpib <- log(pib$pib_indice)
dlpib <- diff(lpib) # tasa de crecimiento trimestral
dlpib_ts <- ts(dlpib, start = c(1995, 2), frequency = 4)
cat(sprintf("diff(log(PIB)): %d obs, media=%.4f, sd=%.4f\n",
length(dlpib_ts), mean(dlpib_ts), sd(dlpib_ts)))
pausa()
# ── 2. IDENTIFICACION: FAC Y FACP ─────────────────
op <- par(mfrow = c(1, 2))
acf(dlpib_ts, lag.max = 12, main = "FAC diff(log(PIB))")
pacf(dlpib_ts, lag.max = 12, main = "FACP diff(log(PIB))")
par(op)
cat("Un unico coeficiente significativo en el retardo 1 (negativo): firma de MA(1).\n")
pausa()
# ── 3. ESTIMACION DEL MA(1) ───────────────────────
m_ma1 <- Arima(dlpib_ts, order = c(0, 0, 1), include.mean = TRUE, method = "ML")
cat(sprintf("MA(1): theta1=%.4f (se=%.4f) mu=%.4f (se=%.4f)\n",
coef(m_ma1)["ma1"], sqrt(diag(vcov(m_ma1)))["ma1"],
coef(m_ma1)["intercept"], sqrt(diag(vcov(m_ma1)))["intercept"]))
pausa()
# ── 4. DIAGNOSTICO DE RESIDUOS ────────────────────
res <- residuals(m_ma1)
op <- par(mfrow = c(1, 2))
plot(res, type = "l", col = "grey30", main = "Residuos MA(1)", ylab = "residuo")
abline(h = 0, lty = 2)
acf(res, main = "FAC de los residuos")
par(op)
lb <- Box.test(res, lag = 8, type = "Ljung-Box", fitdf = 1)
cat(sprintf("Ljung-Box(8) residuos: Q=%.3f p=%.4f -> %s\n", lb$statistic, lb$p.value,
ifelse(lb$p.value > 0.05, "no se rechaza incorrelacion (OK)", "quedan restos de estructura")))
pausa()
# ── 5. COMPARACION POR AIC Y BIC ──────────────────
especificaciones <- list("AR(1)" = c(1,0,0), "MA(1)" = c(0,0,1), "AR(2)" = c(2,0,0),
"MA(2)" = c(0,0,2), "ARMA(1,1)" = c(1,0,1))
comp <- map_dfr(names(especificaciones), function(nm) {
m <- Arima(dlpib_ts, order = especificaciones[[nm]], include.mean = TRUE, method = "ML")
tibble(modelo = nm, AIC = AIC(m), BIC = BIC(m))
}) |> arrange(AIC)
print(comp)
cat(sprintf("Mejor modelo por AIC y BIC: %s\n", comp$modelo[1]))
# === FIN Caso Práctico Macro — Tema 03 (PIB, modelos ARMA) ===