# ══════════════════════════════════════════════════ # 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 ===