Setelah membaca posting blog ini tentang model deret waktu struktural Bayesian, saya ingin melihat penerapan ini dalam konteks masalah yang sebelumnya saya gunakan untuk ARIMA.
Saya memiliki beberapa data dengan beberapa komponen musiman yang diketahui (tetapi berisik) - pasti ada komponen tahunan, bulanan dan mingguan untuk ini, dan juga beberapa efek karena hari-hari khusus (seperti hari libur federal atau keagamaan).
Saya telah menggunakan bsts
paket untuk mengimplementasikan ini dan sejauh yang saya tahu saya tidak melakukan kesalahan, meskipun komponen dan prediksi tidak terlihat seperti yang saya harapkan. Tidak jelas bagi saya jika implementasi saya salah, tidak lengkap atau memiliki masalah lain.
Seri penuh waktu terlihat seperti ini:
Saya dapat melatih model pada beberapa bagian data, dan model umumnya terlihat bagus dalam hal kecocokan (plot di bawah). Kode yang saya gunakan untuk melakukan ini ada di sini:
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)
Modelnya terlihat masuk akal:
Tetapi jika saya memplot prediksi maka pertama tren benar-benar salah, dan kedua ketidakpastian tumbuh SANGAT cepat - ke titik di mana saya tidak dapat menunjukkan pita ketidakpastian pada plot yang sama dengan prediksi tanpa membuat sumbu y pada log- skala. Kode untuk bagian ini ada di sini:
burn <- SuggestBurn(0.1, model)
pred <- predict(model, horizon = predict_length, burn = burn, quantiles = c(.025, .975))
Prediksi murni terlihat seperti ini:
Dan kemudian ketika diturunkan ke distribusi awal (dengan garis putus-putus menunjukkan transisi dari pelatihan ke prediksi, masalahnya jelas:
Saya telah mencoba menambahkan lebih banyak tren musiman, menghapus tren musiman, menambahkan istilah AR, mengubah AddLocalLinearModel menjadi AddGeneralizedLocalLinearTrend dan beberapa hal lain tentang mengubah model, tetapi tidak ada yang menyelesaikan masalah dan membuat prediksi lebih bermakna. Dalam beberapa kasus arah berubah, jadi daripada turun ke 0 prediksi hanya terus meningkat sebagai fungsi waktu. Saya benar-benar tidak mengerti mengapa model mogok dengan cara ini. Setiap saran akan sangat disambut.