← Catálogo
· Capítulo 1
T01_mST_Script_Introduccion.R
# ══════════════════════════════════════════════════
# 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 ===