Прочитавши цю публікацію в блозі про моделі байесівських структурних часових рядів, я хотів розглянути її реалізацію в контексті проблеми, для якої раніше використовував ARIMA.
У мене є деякі дані з деякими відомими (але галасливими) сезонними компонентами - це, безумовно, щорічні, щомісячні та щотижневі компоненти, а також деякі наслідки внаслідок особливих днів (наприклад, федеральних чи релігійних свят).
Я використав bsts
пакет для реалізації цього, наскільки я можу сказати, що я не зробив нічого поганого, хоча компоненти та прогнозування просто не виглядають так, як я очікував. Мені не зрозуміло, чи моя реалізація неправильна, неповна або є якась інша проблема.
Повний часовий ряд виглядає приблизно так:
Я можу тренувати модель на деякому підмножині даних, і модель, як правило, добре виглядає з точки зору відповідності (сюжет нижче). Код, який я використовую для цього, тут:
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)
Модель виглядає розумно:
Але якщо я будувати передбачення, то, по-перше, тенденція є абсолютно неправильною, а по-друге, невизначеність зростає ДУЖЕ швидко - до того моменту, коли я не можу показати смугу невизначеності на тій же графіці, що й прогнози, не перекладаючи вісь y на журнал- масштаб. Код цієї частини тут:
burn <- SuggestBurn(0.1, model)
pred <- predict(model, horizon = predict_length, burn = burn, quantiles = c(.025, .975))
Чистий прогноз виглядає приблизно так:
І тоді, коли масштаб повертається до початкового розподілу (з пунктирною лінією, що показує перехід від тренінгу до прогнозування, проблеми очевидні:
Я спробував додати ще сезонні тренди, видалив сезонні тренди, додав термін AR, змінив AddLocalLinearModel на AddGeneralizedLocalLinearTrend та кілька інших речей, що стосуються налаштування моделі, але нічого не вирішило проблеми та зробило прогнози більш значущими. У деяких випадках напрямок змінюється, тому замість того, щоб знизитись до 0, передбачення просто продовжує зростати як функція часу. Я точно не розумію, чому модель розпадається таким чином. Будь-які пропозиції будуть дуже вітаються.