Po przeczytaniu tego postu na blogu o Bayesowskich modelach strukturalnych szeregów czasowych, chciałem spojrzeć na wdrożenie tego w kontekście problemu, w którym wcześniej korzystałem z ARIMA.
Mam pewne dane z niektórymi znanymi (ale hałaśliwymi) komponentami sezonowymi - z pewnością są to komponenty roczne, miesięczne i tygodniowe, a także pewne efekty ze względu na specjalne dni (takie jak święta federalne lub religijne).
Użyłem tego bsts
pakietu, aby to zaimplementować i, o ile mogę stwierdzić, nie zrobiłem nic złego, chociaż komponenty i przewidywania po prostu nie wyglądają tak, jak się spodziewałem. Nie jest dla mnie jasne, czy moja implementacja jest błędna, niekompletna lub ma jakiś inny problem.
Cały szereg czasowy wygląda następująco:
Mogę trenować model na pewnym podzbiorze danych, a model ogólnie wygląda dobrze pod względem dopasowania (wykres poniżej). Kod, którego używam do tego celu, znajduje się tutaj:
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)
Model wygląda rozsądnie:
Ale jeśli wykreślę prognozę, to po pierwsze trend będzie całkowicie błędny, a po drugie niepewność rośnie BARDZO szybko - do tego stopnia, że nie mogę pokazać pasma niepewności na tym samym wykresie, co prognozy bez wykonania osi y na log- skala. Kod tej części znajduje się tutaj:
burn <- SuggestBurn(0.1, model)
pred <- predict(model, horizon = predict_length, burn = burn, quantiles = c(.025, .975))
Czysta prognoza wygląda następująco:
A potem, gdy przeskalowano z powrotem do rozkładu początkowego (z kropkowaną linią pokazującą przejście od treningu do przewidywania, problemy są oczywiste:
Próbowałem dodać więcej trendów sezonowych, usunąć trendy sezonowe, dodać termin AR, zmienić AddLocalLinearModel na AddGeneralizedLocalLinearTrend i kilka innych rzeczy dotyczących ulepszenia modelu, ale nic nie rozwiązało problemów i nie uczyniło prognoz bardziej sensownymi. W niektórych przypadkach kierunek zmienia się, więc zamiast spadać do zera, prognoza nadal rośnie w funkcji czasu. Zdecydowanie nie rozumiem, dlaczego model tak się psuje. Wszelkie sugestie byłyby bardzo mile widziane.