BSTS modelinden (R cinsinden) tahminler tamamen başarısız oluyor


15

Bayes yapısal zaman serisi modelleri hakkındaki bu blog yazısını okuduktan sonra , bunu daha önce ARIMA için kullandığım bir sorun bağlamında uygulamaya bakmak istedim.

Bilinen bazı (ancak gürültülü) mevsimsel bileşenlerle ilgili bazı verilerim var - bunun kesinlikle yıllık, aylık ve haftalık bileşenleri ve ayrıca özel günlerden (federal veya dini bayramlar gibi) bazı etkiler var.

Bunu bstsuygulamak için paketi kullandım ve söyleyebildiğim kadarıyla, yanlış bir şey yapmadım, ancak bileşenler ve tahminler beklediğim gibi görünmüyor. Uygulamamın yanlış, eksik veya başka bir sorunu olup olmadığı bana açık değil.

Tam zamanlı seriler şöyle görünür:

Tam veri

Modeli verilerin bazı alt kümelerinde eğitebilirim ve model genellikle uyum açısından iyi görünüyor (grafik aşağıdadır). Bunu yapmak için kullanıyorum kodu burada:

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 makul görünüyor:

Model Grafiği

Ama eğer öngörü çizersem, o zaman ilk önce eğilim tamamen yanlıştır ve ikincisi belirsizlik ÇOK hızla büyür - belirsizlik bandını tahminler ile aynı grafikte gösteremediğim noktaya kadar - ölçeği. Bu bölümün kodu burada:

burn <- SuggestBurn(0.1, model)
pred <- predict(model, horizon = predict_length, burn = burn, quantiles = c(.025, .975))

Saf tahmin şuna benzer:

saf tahmin

Ve sonra ilk dağılıma geri ölçeklendiğinde (noktalı çizgi eğitimden tahmine geçişi gösterirken, problemler açıktır:

tam dağıtım

Daha fazla mevsimsel eğilimler eklemeyi, mevsimsel eğilimleri kaldırmayı, bir AR terimi eklemeyi, AddLocalLinearModel'i AddGeneralizedLocalLinearTrend'e değiştirmeyi ve modeli değiştirmeye ilişkin diğer bazı şeyleri denedim, ancak hiçbir şey sorunları çözmedi ve tahminleri daha anlamlı hale getirmedi. Bazı durumlarda yön değişir, bu nedenle 0'a düşmek yerine, zamanın bir fonksiyonu olarak tahmin artmaya devam eder. Modelin neden bu şekilde parçalandığını kesinlikle anlamıyorum. Herhangi bir öneri çok hoş olurdu.


2
Verilerinizi neden göndermiyorsunuz ve denemeye ve yardımcı olmaya çalışacağım ... Çok fazla varsayım olduğu için bu yaklaşımı kullanmadığım için modelin neden çöktüğünü yanıtlayamayacağım. Lütfen kaç değerin saklandığına, başlangıç ​​tarihine ve menşe ülkesine göre kesin.
IrishStat

Yorumunuz için çok teşekkürler. Bir göz atmak için zamanınız olması durumunda ham verileri buraya yükledim . Veriler 2013'ün başından bu yılın sonuna kadar değişmektedir. Ayrıca bir ARIMA modeliyle tahmin yapmaya çalıştım, ancak bununla ilgili tahminler de uzak tutma verileriyle eşleşmedi. Bekletme verileri, kullanmak istediğim eğitim verisine bağlı olarak temel olarak 2015 veya 2016'nın sadece bir kısmıdır.
anthr

Yanıtlar:


26

Steve Scott burada. Ben bsts paketini yazdım. Sana birkaç önerim var. İlk olarak, mevsimlik bileşenleriniz düşündüklerinizi yapmıyor. Günlük verileriniz olduğunu düşünüyorum, çünkü düzgün çalışması gereken 7 sezonluk bir bileşen eklemeye çalışıyorsunuz. Ancak yıllık mevsimsel bileşeninize her 12 günde bir tekrarlanmasını söylediniz. Günlük verilerle aylık bir mevsimsel bileşen almak biraz zor, ancak 52 haftalık bir mevsimsel yapabilirsiniz AddSeasonal(..., nseasons = 52, season.duration = 7).

seasonal.durationArgüman birçok zaman sürmelidir her sezon işaret nasıl modelini anlatır. nseasonsArgüman birçok mevsim bir döngüde nasıl söyler. Bir döngüdeki toplam zaman noktası sayısı season.duration * nseasons.

İkinci öneri, trend için farklı bir model düşünmek isteyebileceğinizdir. LocalLinearTrendModel çok esnektir, ancak bu esnekliği uzun vadeli tahminleri istenmeyen varyans olarak gösterilebilir. Biraz daha fazla yapı içeren başka trend modelleri de var. GeneralizedLocalLinearTrend(tanımlayıcı olmayan ad için üzgünüm) trendin "eğim" bileşeninin rastgele bir yürüyüş yerine bir AR1 işlemi olduğunu varsayar. Geleceği tahmin etmek istersem varsayılan seçeneğim. Eğer deneyebilirsiniz böylece zaman serisi varyasyon çoğu, mevsimsellik gelmiş gibi gözüküyor AddLocalLevelhatta veya AddAryerine AddLocalLinearTrend.

Son olarak, genel olarak garip tahminler alıyorsanız ve modelin hangi kısmının suçlanacağını bulmak plot(model, "components")istiyorsanız, modeli istediğiniz parçalara ayrıştırılmış olarak görmeye çalışın .


FYI: Verilerimle çok benzer sorunlar yaşıyorum, ki bu da günlük. Burada listelenen tüm önerilerinizi uyguladım ve hiçbiri yardımcı görünmüyor.
ZakJ

1
@Steve Scott Sizi rahatsız ettiğim için özür dilerim, size şunu sormak istiyorum: Birden fazla zaman serisini modellemeye çalışıyorsam ve Hiyerarşik Karışık bir model çerçevesindeysem, bunu paketinizi kullanarak modelleyebilir miyim? Bu arada: paketiniz için çok teşekkür ederim!
Tommaso Guerrini

4

Bence varsayılan yanığı da değiştirebilirsiniz. Ben bsts kullandığım için bekleme süresi istatistiğim olarak MAPE ile yanık ve niter değerler ızgarası oluşturdum. Ayrıca, modelinizin bu tür bir değişiklik beklemesi için verilerinizde büyük bir değişiklik varsa AddStudentLocalLinearTrend kullanmayı deneyin.


1
Çok az veri
noktam
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.