Байесовский анализ временных рядов с помощью MCMC с использованием функции bsts () в пакете bsts

#r #time-series #bayesian #predict #mcmc

#r #временные ряды #байесовский #прогнозировать #mcmc

Вопрос:

Проблема:

У меня есть фрейм данных с именем FID (см. Ниже), который содержит два столбца для Year amp; Month и Sighting_Frequency.

Фрейм данных содержит 3 года наблюдений за период 2015-2017 годов, что указывает на то, что у меня есть данные за 36 месяцев. Я хочу запустить байесовский анализ временных рядов с помощью MCMC с использованием функции bsts () в пакете bsts (см. R-код ниже), следуя приведенному ниже руководству. Однако у меня возникают проблемы с запуском модели, потому что я продолжаю получать это сообщение об ошибке:-

     Error in .FormatBstsDataAndOptions(family, response, predictors, model.options,  : 
  all(abs(response - as.integer(response)) < 1e-08, na.rm = TRUE) is not TRUE
  

Если это возможно, мне было интересно, может ли кто-нибудь посоветовать, поскольку я изо всех сил пытаюсь найти решение, и я не продвинутый программист R. Я изучил множество руководств, разместил свою проблему на страницах R Studio в Facebook и прочитал руководство пользователя автора.

Если кто-нибудь может помочь, я был бы глубоко признателен.

Заранее большое спасибо.

Учебник

https://multithreaded.stitchfix.com/blog/2016/04/21/forget-arima/?fbclid=IwAR1q6QD5j6AW21FY2_gqDEq-bwBKDJNtg9alKm3bDytzS51w-dVkDZMdbT4

введите описание изображения здесь

R-код

 ##Open packages for the time series analysis

library(lubridate)
library(bsts)
library(dplyr)
library(ggplot2)

* 500 MCMC draws.
* Use 2015 as the holdout period.
* Trend and seasonality.
* Forecast created by averaging across the MCMC draws. 
* Credible interval generated from the distribution of the MCMC draws.
* Discarding the first MCMC iterations (burn-in).
* Using a log transformation to make the model multiplicative

##Produce a time series analysis
myts <- ts(BSTS_Dataframe, start=c(2015, 1), end=c(2017, 12), frequency=12)

# subset the time series (Jan 2015 to December 2017)
x <- window(myts, start=c(2015, 01), end=c(2017, 12))
y <- log(x)

### Run the bsts model
ss <- AddLocalLinearTrend(list(), y)
ss <- AddSeasonal(ss, y, nseasons = 15)
bsts.model <- bsts(y, state.specification = ss, family = "poisson", niter = 500, ping=0, seed=2015)

##Error message

Error in .FormatBstsDataAndOptions(family, response, predictors, model.options,  : 
  all(abs(response - as.integer(response)) < 1e-08, na.rm = TRUE) is not TRUE
  

Фрейм данных FID

    structure(list(Year = structure(1:32, .Label = c("2015-01", "2015-02", 
"2015-03", "2015-04", "2015-05", "2015-08", "2015-09", "2015-10", 
"2015-11", "2015-12", "2016-01", "2016-02", "2016-03", "2016-04", 
"2016-05", "2016-07", "2016-08", "2016-09", "2016-10", "2016-11", 
"2016-12", "2017-01", "2017-02", "2017-03", "2017-04", "2017-05", 
"2017-07", "2017-08", "2017-09", "2017-10", "2017-11", "2017-12"
), class = "factor"), Sightings_Frequency = c(36L, 28L, 39L, 
46L, 5L, 22L, 10L, 15L, 8L, 33L, 33L, 29L, 31L, 23L, 8L, 9L, 
40L, 41L, 40L, 30L, 30L, 44L, 37L, 41L, 42L, 20L, 7L, 27L, 35L, 
27L, 43L, 38L)), class = "data.frame", row.names = c(NA, -32L
))
  

Комментарии:

1. Код работает, если вы переключите свой пример на family = "logit" . Ошибка возникает из ‘bsts:::.FormatBstsDataAndOptions’. Обязательно ли вам соответствовать модели Пуассона?

2. Спасибо, что ответили мне, я действительно оценил это, поскольку я действительно испытываю здесь трудности. Это количество птиц в месяц, поэтому я подумал, что это будет модель Пуассона.

3. Я просто изменил пример на family = «logit’, и я получил то же сообщение об ошибке:

4. Ошибка в . FormatBstsDataAndOptions(family, response, predictors, model.options, : all(abs(response — as.integer(response)) < 1e-08, na.rm = TRUE) неверно

5. У вас есть какие-либо предложения? Я был бы очень благодарен, если вы сможете помочь!

Ответ №1:

Я также получаю сообщение об ошибке, если использую poisson с вашими данными.

 myts2 <- ts(BSTS_Dataframe$Sightings_Frequency, start=c(2015, 1), end=c(2017, 12), frequency=12)

x <- window(myts2, start=c(2015, 01), end=c(2017, 12))
y <- log(x)

### Run the bsts model
ss <- AddLocalLinearTrend(list(), y)
ss <- AddSeasonal(ss, y, nseasons = 3)
# bsts.model <- bsts(y, state.specification = ss, family = "poisson", niter = 2, ping=0, seed=1234)
bsts.model <- bsts(y, state.specification = ss, family = "logit",  niter = 100, ping = 0, seed = 123)
plot(bsts.model)
plot(bsts.model)