3 votos

Identificar la estacionalidad en datos de series temporales

Quiero detectar la presencia de estacionalidad en datos de series temporales. Sé que se puede lograr eso trazando la función de autocorrelación, pero necesito un proceso automático para determinar si la serie es estacional o no, algo así como un algoritmo que después de ejecutar la serie temporal me indique 'SÍ' para estacional y 'NO' para no estacional.

¿Hay algo en R que pueda usar?

Si no, ¿cuál es una forma de saber a través de la función de autocorrelación (ACF) para hacer esto?

Gracias

14voto

Senseful Puntos 116

El problema de usar el ACF es que puede haber otras razones para picos significativos, no solo la estacionalidad. Por lo tanto, es indicativo pero no concluyente.

Si los datos tuvieran un período estacional pequeño (como 4 para datos trimestrales o 12 para datos mensuales), entonces un enfoque simple es usar la función ets en el paquete forecast para R. Si hay un patrón estacional, elegirá un modelo estacional.

Pero dado que tus datos son semanales (según los comentarios en la respuesta de Mark T Patterson), eso no funcionará porque el período estacional es demasiado largo y no es entero. X12 tampoco te ayudará (como sugirió @toomuchpj) ya que está diseñado solo para datos trimestrales y mensuales.

El período no entero será un problema para cualquier solución que asuma período=52, porque la diferencia entre 52 y 365/7 se hará evidente con series largas.

Un enfoque es usar el modelo tbats, también en el paquete forecast en R. Manejará la estacionalidad semanal y determinará automáticamente si hay un patrón estacional presente. Por ejemplo:

x <- ts(data, frequency=365/7)
fit <- tbats(x)
seasonal <- !is.null(fit$seasonal)

Luego seasonal será TRUE si se elige un modelo estacional y de lo contrario FALSE.

1voto

gina Puntos 11

@Eva,

Definitivamente creo que R tiene la funcionalidad para ayudarte aquí. La decisión sobre qué herramienta utilizar depende un poco del tipo de estacionalidad que estás tratando de detectar. ¿Puedes contarnos un poco más sobre los datos que estás modelando?

Yo empezaría con algo simple. Por ejemplo, vamos a asumir que tienes una sola observación cada día durante 1000 días, y estás interesada en saber si hay un efecto de mes.

Puedes empezar escribiendo una función que ajuste un modelo de tu variable de resultado en el mes (como factor) y luego informe un 1 si alguno de tus meses es significativo al nivel del 1%. Nota: ten mucho cuidado con las pruebas de hipótesis múltiples en este caso.

Aquí tienes un código de ejemplo, utilizando una variable dependiente que esperamos que no muestre estacionalidad:

time = seq(from = 1, by = 1, length.out = 1000)
month = time %% 12

y = rnorm(1000,0,1)

df = data.frame(time, month, y)

seasonality.func = function(df){
  lm.1 = lm(y ~ factor(month), data = df)
  p.vals = summary(lm.1)$coefficients[,4]
  p.vals.lt.01 = as.numeric(sum(p.vals<.01)>0)
  return(p.vals.lt.01)
}

seasonality.func(df)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X