← Catálogo · Capítulo 4

T04_mST_CP_Macro.R

Ver crudo
# ══════════════════════════════════════════════════
# T04 · 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(urca)
library(strucchange)
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_ts  <- ts(log(pib$pib_indice), start = c(1995, 1), frequency = 4)
dlpib    <- diff(log(pib$pib_indice))
dlpib_ts <- ts(dlpib, start = c(1995, 2), frequency = 4)
pausa("\n  [Datos cargados. Pulsa ENTER...]")

# ── 2. BOX-COX: ¿ES EL LOGARITMO LA TRANSFORMACION OPTIMA? ─
lam_g <- forecast::BoxCox.lambda(pib$pib_indice, method = "guerrero")
lam_l <- forecast::BoxCox.lambda(pib$pib_indice, method = "loglik")
cat(sprintf("Lambda (Guerrero) = %.3f   Lambda (log-verosimilitud) = %.3f\n", lam_g, lam_l))
cat("Ninguno coincide exactamente con 0 (logaritmo); se usa log por interpretabilidad economica.\n")
pausa()

# ── 3. ADF: log(PIB) EN NIVELES Y EN DIFERENCIAS ──
adf_niv <- ur.df(lpib_ts, type = "trend", selectlags = "AIC")
adf_dif <- ur.df(dlpib_ts, type = "drift", selectlags = "AIC")
cat(sprintf("ADF log(PIB) niveles    : tau3 = %.3f (cv 5%% = %.2f) -> %s\n",
            adf_niv@teststat[1], adf_niv@cval["tau3", "5pct"],
            ifelse(adf_niv@teststat[1] > adf_niv@cval["tau3", "5pct"], "no se rechaza H0", "se rechaza H0")))
cat(sprintf("ADF diff(log(PIB))      : tau2 = %.3f (cv 5%% = %.2f) -> %s\n",
            adf_dif@teststat[1], adf_dif@cval["tau2", "5pct"],
            ifelse(adf_dif@teststat[1] > adf_dif@cval["tau2", "5pct"], "no se rechaza H0", "se rechaza H0")))
cat("Conclusion: log(PIB) ~ I(1).\n")
pausa()

# ── 4. PHILLIPS-PERRON Y KPSS (CONFIRMACION) ──────
pp_niv   <- ur.pp(lpib_ts, type = "Z-tau", model = "trend")
kpss_niv <- ur.kpss(lpib_ts, type = "tau")
cat(sprintf("PP log(PIB)   : Z-tau = %.3f (cv 5%% = %.2f)\n", pp_niv@teststat, pp_niv@cval[1, "5pct"]))
cat(sprintf("KPSS log(PIB) : %.3f (cv 5%% = %.3f) -> %s\n",
            kpss_niv@teststat, kpss_niv@cval[1, "5pct"],
            ifelse(kpss_niv@teststat > kpss_niv@cval[1, "5pct"], "se rechaza estacionariedad", "no se rechaza")))
pausa()

# ── 5. ZIVOT-ANDREWS: RUPTURA ENDOGENA ────────────
za <- ur.za(lpib_ts, model = "both", lag = NULL)
cat(sprintf("Zivot-Andrews: ruptura en %s | estadistico = %.3f (cv 5%% = %.2f)\n",
            pib$trimestre[za@bpoint], za@teststat, za@cval[2]))
cat("Ni siquiera con la ruptura mas favorable se rechaza la raiz unitaria.\n")
pausa()

# ── 6. MULTIPLES RUPTURAS (BAI-PERRON, strucchange) ─
t_idx <- 1:length(lpib_ts)
bp <- breakpoints(as.numeric(lpib_ts) ~ t_idx)
cat("Rupturas estimadas (BIC):\n")
print(pib$fecha[bp$breakpoints])

plot(lpib_ts, col = "steelblue", main = "log(PIB) con rupturas estimadas")
abline(v = time(lpib_ts)[bp$breakpoints], lty = 2, col = "grey40")

# === FIN Caso Práctico Macro — Tema 04 (PIB, raíces unitarias) ===