# ══════════════════════════════════════════════════ # T01 · Series Temporales — Introducción y componentes # Abre primero mSeriesTemporales.Rproj en RStudio # ══════════════════════════════════════════════════ library(tidyverse) library(forecast) pausa <- function(msg = "\n [Pulsa ENTER para continuar...]") { if (interactive()) { cat(msg); invisible(readline()) } } # ── 1. QUÉ ES UNA SERIE TEMPORAL ────────────────── # Una serie temporal es una secuencia ordenada de observaciones # tomadas a intervalos regulares. Simulamos una serie mensual con # tendencia + estacionalidad + ruido para ilustrar sus componentes. set.seed(2026) n <- 120 t <- 1:n tendencia <- 100 + 0.4 * t estacional <- 6 * sin(2 * pi * t / 12) irregular <- rnorm(n, 0, 2) y_add <- tendencia + estacional + irregular # esquema aditivo serie <- ts(y_add, start = c(2015, 1), frequency = 12) cat(sprintf("Serie simulada: %d observaciones mensuales\n", n)) cat(sprintf("Media: %.2f | Desv. típica: %.2f\n", mean(serie), sd(serie))) pausa() # ── 2. COMPONENTES: ADITIVO VS MULTIPLICATIVO ───── # En el esquema aditivo la amplitud estacional es constante; # en el multiplicativo crece con el nivel de la serie. y_mult <- tendencia * (1 + 0.05 * sin(2 * pi * t / 12)) + irregular op <- par(mfrow = c(1, 2)) plot(serie, main = "Aditivo", ylab = "y", col = "steelblue") plot(ts(y_mult, start = c(2015, 1), frequency = 12), main = "Multiplicativo", ylab = "y", col = "darkorange") par(op) pausa() # ── 3. DESCOMPOSICIÓN CLÁSICA ───────────────────── desc <- decompose(serie, type = "additive") plot(desc) cat("Componentes estimados: tendencia, estacional e irregular.\n") pausa() # ── 4. SUAVIZADO POR MEDIAS MÓVILES ─────────────── ma12 <- forecast::ma(serie, order = 12) # media móvil centrada de orden 12 plot(serie, col = "grey60", ylab = "y", main = "Media móvil de orden 12") lines(ma12, col = "black", lwd = 2) cat("La media móvil de orden 12 filtra la estacionalidad anual.\n") pausa() # ── 5. FILTRO DE HODRICK-PRESCOTT ───────────────── hp_filter <- function(x, lambda = 14400) { x <- as.numeric(x); m <- length(x) D <- diff(diag(m), differences = 2) as.numeric(solve(diag(m) + lambda * crossprod(D), x)) } tend_hp <- hp_filter(y_add, lambda = 14400) ciclo_hp <- y_add - tend_hp op <- par(mfrow = c(2, 1), mar = c(3, 4, 2, 1)) plot(y_add, type = "l", col = "grey60", ylab = "y", main = "Tendencia HP") lines(tend_hp, col = "black", lwd = 2) plot(ciclo_hp, type = "l", col = "black", ylab = "ciclo", main = "Ciclo HP") abline(h = 0, col = "grey70") par(op) cat(sprintf("Amplitud del ciclo HP: [%.2f, %.2f]\n", min(ciclo_hp), max(ciclo_hp))) # === FIN Script T01 — Introducción y componentes ===