Alice Hobbs
Alice Hobbs

Reputation: 1215

Bayesian Time Series Analysis with MCMC using the Function bsts() in the bsts Package

Problem:

I have a data frame called FID (see below) that contains two columns for Year & Month, and Sighting_Frequency.

The data frame contains 3 years of observations between 2015-2017, indicating I have 36 months of data. I want to run a Bayesian time series analysis with MCMC using the bsts() function in the bsts package (see the R-code below) by following the tutorial below. However, I am experiencing problems running the model because I keep on getting this error message:-

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

If this is possible, I was wondering if anyone could advise as I am struggling to find a solution and I am not an advanced R coder. I have researched many tutorials, placed my problem on R Studio Facebook pages, and I have read the user guide by the author.

If anyone can help, I would be deeply appreciative.

Many thanks in advance.

Tutorial

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

enter image description here

R-code

##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 Dataframe

   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
))

Upvotes: 0

Views: 770

Answers (1)

tester
tester

Reputation: 1692

I also get an error if I use poisson with your data.

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)

Upvotes: 1

Related Questions