Después de leer esta publicación de blog sobre los modelos de series de tiempo estructurales bayesianas, quería analizar su implementación en el contexto de un problema para el que había usado ARIMA anteriormente.
Tengo algunos datos con algunos componentes estacionales conocidos (pero ruidosos): definitivamente hay componentes anuales, mensuales y semanales para esto, y también algunos efectos debido a días especiales (como feriados federales o religiosos).
He utilizado el bsts
paquete para implementar esto y, por lo que puedo decir, no he hecho nada malo, aunque los componentes y la predicción simplemente no se ven como esperaba. No me queda claro si mi implementación es incorrecta, está incompleta o tiene algún otro problema.
La serie a tiempo completo se ve así:
Puedo entrenar el modelo en algún subconjunto de datos, y el modelo generalmente se ve bien en términos de ajuste (la gráfica está abajo). El código que estoy usando para hacer esto está aquí:
library(bsts)
predict_length = 90
training_cut_date <- '2015-05-01'
test_cut_date <- as.Date(training_cut_date) + predict_length
df = read.csv('input.tsv', sep ='\t')
df$date <- as.Date(as.character(df$date),format="%Y-%m-%d")
df_train = df[df$date < training_cut_date,]
yts <- xts(log10(df_train$count), order.by=df_train$date)
ss <- AddLocalLinearTrend(list(), yts)
ss <- AddSeasonal(ss, yts, nseasons = 7)
ss <- AddSeasonal(ss, yts, nseasons = 12)
ss <- AddNamedHolidays(ss, named.holidays = NamedHolidays(), yts)
model <- bsts(yts, state.specification = ss, niter = 500, seed=2016)
El modelo se ve razonable:
Pero si trazo la predicción, en primer lugar, la tendencia es completamente incorrecta, y en segundo lugar, la incertidumbre crece MUY rápidamente, hasta el punto en que no puedo mostrar la banda de incertidumbre en el mismo diagrama que las predicciones sin hacer que el eje y esté en un registro. escala. El código para esta parte está aquí:
burn <- SuggestBurn(0.1, model)
pred <- predict(model, horizon = predict_length, burn = burn, quantiles = c(.025, .975))
La predicción pura se ve así:
Y luego, cuando se reduce a la distribución inicial (con la línea de puntos que muestra la transición del entrenamiento a la predicción, los problemas son obvios:
Intenté agregar más tendencias estacionales, eliminar tendencias estacionales, agregar un término AR, cambiar AddLocalLinearModel a AddGeneralizedLocalLinearTrend y varias otras cosas relacionadas con ajustar el modelo, pero nada ha resuelto los problemas y ha hecho que las predicciones sean más significativas. En algunos casos, la dirección cambia, por lo que, en lugar de caer a 0, la predicción continúa aumentando en función del tiempo. Definitivamente no entiendo por qué el modelo se está rompiendo de esta manera. Cualquier sugerencia sería muy bienvenida.