Introducción

En este documento se presentan simulaciones de diferentes modelos de series de tiempo utilizando modelos espacio-estado (estado-estocástico) y su análisis mediante filtrado y suavizado con el paquete dlm. Se incluye la interpretación de los resultados.

1. Caminata aleatoria más ruido

La caminata aleatoria es un modelo simple de series de tiempo donde el estado subyacente se acumula a partir de ruido blanco. En este caso, agregamos ruido adicional a la observación.

# Simulación
n <- 200
v <- rnorm(n, 0, 5) # Ruido de observación
w <- rnorm(n, 0, 2) # Ruido del estado
mu <- w[1]
for(i in 2:n){
  mu[i] <- mu[i-1] + w[i]
}
y1 <- mu + v

# Visualización
par(mfrow = c(2,1))
ts.plot(y1, main="Serie observada con ruido")
ts.plot(mu, main="Estado subyacente (mu)")

  • La serie \(y_1\) refleja la caminara aleatoria más el ruido de observación

  • El estado \(mu\) muestra la trayectoria subyacente sin el ruido de la observación

  • Se observa cómo el filtrado puede ayudar a estimar \(mu\) a partir de \(y_1\)

Filtrado y suavizado

#install.packages("dlm")
library(dlm)

mod1 <- dlmModPoly(order = 1, dV = 5^2, dW = 2^2)
y1.filtro <- dlmFilter(y1, mod1)
y1.suave <- dlmSmooth(y1, mod1)


par(mfrow = c(1,1))
ts.plot(y1, col = "darkgrey", main="Filtrado y suavizado")
lines(dropFirst(y1.filtro$m), lty = "longdash", col = 2) # Filtro
lines(dropFirst(y1.suave$s), lty = "longdash", col = 3)   # Suavizado
legend("topleft", legend=c("Observada","Filtrada","Suavizada"), col=c("darkgrey",2,3), lty=c(1,2,2))

  • Este filtro esta estimando el estado en el tiempo t usando información hasta t

  • El suavizamiento estima el estado usando toda la información de la serie, resultando en una estimación más suave y cercana al estado real.

2. Tendencia linea local (local linear trend)

Este modelo permte que la serie tenga una tendencia estocástica que cambia en el tiempo.

n <- 100
v <- rnorm(n, 0, 10)
w1 <- rnorm(n, 0, 5)
w2 <- rnorm(n, 0, 1)
mu <- w1[1]
beta <- w2[1]
for(i in 2:n){
  beta[i] <- beta[i-1] + w2[i]
  mu[i] <- mu[i-1] + beta[i-1] + w1[i]
}
y2 <- mu + v

mod2 <- dlmModPoly(order = 2, dV = 10^2, dW = c(5,1)^2)
y2.filtro <- dlmFilter(y2, mod2)
y2.suave <- dlmSmooth(y2, mod2)

par(mfrow = c(1,1))
ts.plot(y2, col = "darkgrey", main="Tendencia lineal local")
lines(dropFirst(y2.filtro$m)[,1], lty="longdash", col=2)
lines(dropFirst(y2.suave$s)[,1], lty="longdash", col=3)
legend("topleft", legend=c("Observada","Filtrada","Suavizada"), col=c("darkgrey",2,3), lty=c(1,2,2))

  • mu representa la tendencia y beta es la pendiente local.

  • El suavizado permite capturar la tendencia real, es decir, más suavemente que el filtro

3. Modelo sin tendencia con estacionalidad

En este caso solo estoy simulando una serie que solo tiene la componente estacional

n <- 100
v <- rnorm(n, 0, 1)
S <- c(0.5,1.2,-0.4,-1.3)
S_t <- rep(S, length.out = n)
y3 <- S_t + v

par(mfrow = c(2,1))
ts.plot(y3, main="Serie observada con estacionalidad")
ts.plot(S_t, main="Componente estacional")

  • La serie sigue un patrón periódico con un pequeño ruido

  • El estado subyacente es solo la estacionalidad.

Filtrado y suavizamiento

mod3 <- dlmModSeas(4, dV=1)
y3.filtro <- dlmFilter(y3, mod3)
y3.suave <- dlmSmooth(y3, mod3)

ts.plot(y3, col="darkgrey", main="Filtrado y suavizado estacional")
lines(dropFirst(y3.filtro$m)[,1], lty="longdash", col=2)
lines(dropFirst(y3.suave$s)[,1], lty="longdash", col=3)
legend("topleft", legend=c("Observada","Filtrada","Suavizada"), col=c("darkgrey",2,3), lty=c(1,2,2))

  • Acá puedo extraer la estacionalidad de la serie observada

  • Nuevamente, el suavizamiento proporciona estimaciones más cercanas al estado verdadero

4. Modelos con Tendencia y Estacionalidad

Acá puedo combinar la tendencia local y estacionalidad para capturar series más complejas.

# Ejemplo: tendencia lineal + estacionalidad fija
n <- 100
v <- rnorm(n,0,2)
w1 <- rnorm(n,0,2)
w2 <- rnorm(n,0,1)
mu <- w1[1]
beta <- w2[1]
S <- c(1,2.4,-0.8,-2.6)*20
S_t <- rep(S,length.out=n)
for(i in 2:n){
  beta[i] <- beta[i-1] + w2[i]
  mu[i] <- mu[i-1] + beta[i-1] + w1[i]
}
y4 <- mu + S_t + v

par(mfrow=c(3,1))
ts.plot(y4, main="Serie observada con tendencia y estacionalidad")
ts.plot(mu, main="Tendencia")
ts.plot(S_t, main="Estacionalidad")

  • Se observan claramente los 2 componenetes: la tendencia creciente y la estacionalidad periódica

  • Este tipo de modelo es muy útil para series, como por ejemplo, ventas mensuales con crecimiento.

En resumen

1- Los modelos espacio - estado permiten separar componenetes de la serie de tiempo: tendencia, estacionaliedad y ruido

2- El filtro estima el estado con la información disponible hasta el tiempo t

3- El suavizado utiliza toda la información de la serie y produce estimaciónes más precisas del estado.

4- La simulación permite comprender visualmente cómo cada componenete afecta la serie observada y cómo los métodos de estimación recuperan el estado subyacente