10 abr 2024

Midiendo la persistencia de una serie temporal en R a partir de un Autoregresivo

Suponga que el promedio de una serie temporal es el valor de referencia de largo plazo de la misma, la persistencia mide el tiempo medio que tarda una serie en regresar a ese nivel medio. En la siguiente figura se simulan en R dos series temporales con distintos grados de persistencia, asumiendo que una aproximación se puede obtener a partir del coeficiente autoregresivo de primer orden de la serie, verificándose que la serie con mayor coeficiente, pasa menor cantidad de veces por su promedia y tarda más tiempo en regresar posterior a un choque.

# Establecer semilla para reproducibilidad
set.seed(123)
library(ggplot)
 
# Número de observaciones
n <- 100
 
# Media y desviación estándar de las series
media <- 0
volatilidad <- 1
 
# Coeficientes de autocorrelación
coef_ar1 <- c(0.1, 0.95)
 
# Simulación de los procesos autoregresivos
serie1 <- arima.sim(model = list(ar = coef_ar1[1]), n = n, sd = volatilidad)
serie2 <- arima.sim(model = list(ar = coef_ar1[2]), n = n, sd = volatilidad)
 
# Calcular el promedio de las series
promedio <- mean(c(serie1, serie2))
 
# Crear el gráfico
datos <- data.frame(
  Tiempo = 1:n,
  Serie1 = serie1,
  Serie2 = serie2
)
 
# Graficar las series con ggplot2
ggplot(datos) +
  geom_line(aes(x = Tiempo, y = Serie1, color = "AR(0.1)")) +
  geom_line(aes(x = Tiempo, y = Serie2, color = "AR(0.9)")) +
  geom_hline(yintercept = mean(serie1), linetype = "dashed", color = "gray") +
  geom_hline(yintercept = mean(serie2), linetype = "dashed", color = "black") +
  labs(x = "Tiempo", y = "Valor", title = element_blank()) +
  scale_color_manual(name = "Modelo", values = c("AR(0.1)" = "gray", "AR(0.9)" = "black")) +
  theme_classic() +
  theme(legend.title = element_blank(),
        legend.position = c(0.2,0.8))

 1.       Estimar el coeficiente autoregresivo de una serie o conjunto de series

Una primera medida de persistencia de las series anteriores, se obtiene a partir de coeficientes autoregresivo de primer orden. En el siguiente ejemplo se colocan una estimación vectorizada del mismo. Primero se crea una matriz de datos con serie1 y serie2, para luego usar la función apply para calcular los coeficientes autorregresivos de primer orden para cada columna. Como ha de esperarse, la serie más persistente ha mostrado mayor persistencia.

# AR(1) de una serie temporal
arima(serie1, order = c(1,0,0)) |>
coef()
  ar1  intercept
0.07822495 0.07983069
 
# AR(1) de múltiples series temperoales
datos <- cbind(serie1, serie2)
apply(datos, 2, function(x) coef(arima(x, order = c(1,0,0)))["ar1"])
    serie1     serie2
0.07822495 0.91674843

2.       Obtener una estimación histórica del nivel de persistencia

Para series largas, igual Podemos estudiar la evolución histórica sobre resistencia usando la función rollapply del paquete zoo. Esta función estima una ventana móvil de tamaño width, donde a cada segmento de la muestra se le aplica una función propia (FUN). Si se aplica para la serie.      .

#ar(1) histórico de una serie temporal
library(zoo)
his_ar1 <- function(x) coef(arima(x, order = c(1,0,0)))["ar1"]
ar_t1 <- rollapply(serie1, width=20, FUN=his_ar1)
 
data1 <- data.frame(t = 1:length(ar_t1),
                    arh = ar_t1)
 
ggplot(data1, aes(t,arh)) +
  geom_line() +
  theme_classic()
plot(ar_t1, type="l")

 


En caso de sesear estimar la dinámica de la persistencia histórica de múltiples series a la vez, podemos aplicar la misma lógica de la función apply, anidando rollapply.

 #ar(1) histórico de múltiples series temporales
data_ar <- apply(datos, 2, function(x){rollapply(x, width=20,FUN=his_ar1)})
 
data1 <- data.frame(t = 1:length(ar_t1),
                    data_ar)
 
ggplot(data1, aes(t)) +
  geom_line(aes(t,serie1)) +
  geom_line(aes(t,serie2)) +
  theme_classic()



Creando variables por grupos en dplyr (group_by + mutate)

  Simulemos una base de hogares, donde se identifica el hogar, el sexo (1 mujer) y provincia y edad para cada miembro.   # Definir la lista ...