← Catálogo · Capítulo 4

T04_mST_Script_RaicesUnitarias.R

Ver crudo
# ══════════════════════════════════════════════════
# T04 · Series Temporales — Raíces unitarias y cambios estructurales
# Abre primero mSeriesTemporales.Rproj en RStudio
# ══════════════════════════════════════════════════

library(tidyverse)
library(urca)
library(strucchange)
library(forecast)

pausa <- function(msg = "\n  [Pulsa ENTER para continuar...]") {
  if (interactive()) { cat(msg); invisible(readline()) }
}

set.seed(2026)

# ── 1. TENDENCIA DETERMINISTA (TS) VS ESTOCASTICA (DS) ─
# Mismo choque en t=75: en el TS se disipa, en el DS es permanente.
n <- 150; t_choque <- 75; magnitud <- 6
alpha <- 0; beta <- 0.15; phi_ts <- 0.6; mu_ds <- 0.15

eps_ts <- rnorm(n); eps_ts[t_choque] <- eps_ts[t_choque] + magnitud
u <- numeric(n); u[1] <- eps_ts[1]
for (i in 2:n) u[i] <- phi_ts * u[i - 1] + eps_ts[i]
y_ts <- alpha + beta * (1:n) + u

eps_ds <- rnorm(n); eps_ds[t_choque] <- eps_ds[t_choque] + magnitud
y_ds <- cumsum(mu_ds + eps_ds)

op <- par(mfrow = c(1, 2))
plot(y_ts, type = "l", col = "grey30", main = "Proceso TS (phi=0.6)", ylab = "y")
abline(v = t_choque, lty = 3)
plot(y_ds, type = "l", col = "grey30", main = "Proceso DS (paseo aleatorio)", ylab = "y")
abline(v = t_choque, lty = 3)
par(op)
cat("El choque se disipa en el TS mientras persiste indefinidamente en el DS.\n")
pausa()

# ── 2. CONTRASTE ADF ──────────────────────────────
# H0: raiz unitaria (gamma = 0). H1: estacionario (gamma < 0).
adf_ds <- ur.df(y_ds, type = "trend", selectlags = "AIC")
adf_ts <- ur.df(y_ts, type = "trend", selectlags = "AIC")
cat(sprintf("ADF sobre el DS: tau3 = %.3f (cv 5%% = %.2f) -> %s\n",
            adf_ds@teststat[1], adf_ds@cval["tau3", "5pct"],
            ifelse(adf_ds@teststat[1] > adf_ds@cval["tau3", "5pct"], "no se rechaza H0", "se rechaza H0")))
cat(sprintf("ADF sobre el TS: tau3 = %.3f (cv 5%% = %.2f) -> %s\n",
            adf_ts@teststat[1], adf_ts@cval["tau3", "5pct"],
            ifelse(adf_ts@teststat[1] > adf_ts@cval["tau3", "5pct"], "no se rechaza H0", "se rechaza H0")))
pausa()

# ── 3. CONTRASTE KPSS (hipotesis nula invertida) ──
kpss_ds <- ur.kpss(y_ds, type = "tau")
kpss_ts <- ur.kpss(y_ts, type = "tau")
cat(sprintf("KPSS sobre el DS: %.3f (cv 5%% = %.3f) -> %s\n",
            kpss_ds@teststat, kpss_ds@cval[1, "5pct"],
            ifelse(kpss_ds@teststat > kpss_ds@cval[1, "5pct"], "se rechaza estacionariedad", "no se rechaza")))
cat(sprintf("KPSS sobre el TS: %.3f (cv 5%% = %.3f) -> %s\n",
            kpss_ts@teststat, kpss_ts@cval[1, "5pct"],
            ifelse(kpss_ts@teststat > kpss_ts@cval[1, "5pct"], "se rechaza estacionariedad", "no se rechaza")))
pausa()

# ── 4. ZIVOT-ANDREWS: RUPTURA ENDOGENA ────────────
# Sobre un TS con ruptura de nivel a mitad de muestra.
y_ts_ruptura <- y_ts
y_ts_ruptura[(t_choque + 1):n] <- y_ts_ruptura[(t_choque + 1):n] + 8   # salto de nivel permanente
za <- ur.za(y_ts_ruptura, model = "both", lag = NULL)
cat(sprintf("Zivot-Andrews: ruptura detectada en t=%d (verdadera: t=%d)\n", za@bpoint, t_choque))
cat(sprintf("Estadistico = %.3f (cv 5%% = %.2f)\n", za@teststat, za@cval[2]))
pausa()

# ── 5. MULTIPLES RUPTURAS CON strucchange ─────────
t_idx <- 1:n
bp <- breakpoints(y_ts_ruptura ~ t_idx)
cat("Rupturas estimadas (Bai-Perron, seleccion por BIC):\n")
print(bp$breakpoints)

# === FIN Script T04 — Raíces unitarias y cambios estructurales ===