Depois de ler esta postagem no blog sobre modelos estruturais de séries temporais bayesianas, eu queria analisar isso no contexto de um problema para o qual eu havia usado o ARIMA anteriormente.
Eu tenho alguns dados com alguns componentes sazonais conhecidos (mas barulhentos) - existem definitivamente componentes anuais, mensais e semanais para isso e também alguns efeitos devido a dias especiais (como feriados federais ou religiosos).
Eu usei o bsts
pacote para implementar isso e, até onde sei, não fiz nada de errado, embora os componentes e a previsão simplesmente não pareçam como eu esperaria. Não está claro para mim se minha implementação está errada, incompleta ou tem algum outro problema.
A série completa fica assim:
Eu posso treinar o modelo em alguns subconjuntos de dados, e o modelo geralmente parece bom em termos de ajuste (o gráfico está abaixo). O código que estou usando para fazer isso está aqui:
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)
O modelo parece razoável:
Mas se eu traçar a previsão, em primeiro lugar, a tendência estará completamente errada e, em segundo lugar, a incerteza aumentará MUITO rapidamente - a ponto de não poder mostrar a banda de incerteza no mesmo gráfico que as previsões sem fazer o eixo y em um log- escala. O código para esta parte está aqui:
burn <- SuggestBurn(0.1, model)
pred <- predict(model, horizon = predict_length, burn = burn, quantiles = c(.025, .975))
A previsão pura é assim:
E então, quando redimensionados para a distribuição inicial (com a linha pontilhada mostrando a transição do treinamento para a previsão, os problemas são óbvios:
Tentei adicionar mais tendências sazonais, remover tendências sazonais, adicionar um termo de AR, alterar o AddLocalLinearModel para AddGeneralizedLocalLinearTrend e várias outras coisas relacionadas ao ajuste do modelo, mas nada resolveu os problemas e tornou as previsões mais significativas. Em alguns casos, a direção muda; portanto, em vez de cair para 0, a previsão continua a aumentar em função do tempo. Definitivamente, não entendo por que o modelo está se deteriorando dessa maneira. Qualquer sugestão seria muito bem-vinda.