params <-
list(EVAL = TRUE)

## ----echo = FALSE----------------------------------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  message = FALSE,
  warning = FALSE,
  eval = if (isTRUE(exists("params"))) params$EVAL else FALSE
)


## ----setup, include=FALSE--------------------------------------------------------------------
knitr::opts_chunk$set(
  echo = TRUE,
  dpi = 100,
  fig.asp = 0.8,
  fig.width = 6,
  out.width = "60%",
  fig.align = "center"
)
library(mvgam)
library(ggplot2)
theme_set(theme_bw(base_size = 12, base_family = "serif"))


## --------------------------------------------------------------------------------------------
set.seed(1)
simdat <- sim_mvgam(
  T = 100,
  n_series = 3,
  mu = 2,
  trend_model = GP(),
  prop_trend = 0.75,
  family = poisson(),
  prop_missing = 0.10
)


## --------------------------------------------------------------------------------------------
str(simdat)


## ----fig.alt = "Plotting time series features for GAM models in mvgam"-----------------------
plot_mvgam_series(
  data = simdat$data_train,
  series = "all"
)


## ----fig.alt = "Plotting time series features for GAM models in mvgam"-----------------------
plot_mvgam_series(
  data = simdat$data_train,
  newdata = simdat$data_test,
  series = 1
)


## ----include=FALSE---------------------------------------------------------------------------
mod1 <- mvgam(
  y ~ s(season, bs = "cc", k = 8) +
    s(time, by = series, k = 20),
  knots = list(season = c(0.5, 12.5)),
  trend_model = "None",
  data = simdat$data_train,
  newdata = simdat$data_test
)


## ----eval=FALSE------------------------------------------------------------------------------
# mod1 <- mvgam(
#   y ~ s(season, bs = "cc", k = 8) +
#     s(time, by = series, bs = "cr", k = 20),
#   knots = list(season = c(0.5, 12.5)),
#   trend_model = "None",
#   data = simdat$data_train,
#   silent = 2
# )


## --------------------------------------------------------------------------------------------
summary(mod1, include_betas = FALSE)


## ----fig.alt = "Plotting GAM smooth functions using mvgam"-----------------------------------
conditional_effects(mod1, type = "link")


## ----include=FALSE, message=FALSE------------------------------------------------------------
mod2 <- mvgam(y ~ 1,
  trend_formula = ~ s(season, bs = "cc", k = 8) - 1,
  trend_knots = list(season = c(0.5, 12.5)),
  trend_model = AR(cor = TRUE),
  noncentred = TRUE,
  data = simdat$data_train,
  silent = 1
)


## ----eval=FALSE------------------------------------------------------------------------------
# mod2 <- mvgam(y ~ 1,
#   trend_formula = ~ s(season, bs = "cc", k = 8) - 1,
#   trend_knots = list(season = c(0.5, 12.5)),
#   trend_model = AR(cor = TRUE),
#   noncentred = TRUE,
#   data = simdat$data_train,
#   silent = 1
# )


## --------------------------------------------------------------------------------------------
summary(mod2, include_betas = FALSE)


## ----fig.alt = "Summarising latent Gaussian Process parameters in mvgam"---------------------
mcmc_plot(mod2, variable = "ar", regex = TRUE, type = "areas")


## ----fig.alt = "Summarising latent Gaussian Process parameters in mvgam"---------------------
mcmc_plot(mod2, variable = "sigma", regex = TRUE, type = "areas")


## ----fig.alt = "Plotting latent Gaussian Process effects in mvgam and marginaleffects"-------
conditional_effects(mod2, type = "link")


## --------------------------------------------------------------------------------------------
fc_mod1 <- forecast(mod1, newdata = simdat$data_test)
fc_mod2 <- forecast(mod2, newdata = simdat$data_test)


## --------------------------------------------------------------------------------------------
str(fc_mod1)


## --------------------------------------------------------------------------------------------
plot(fc_mod1, series = 1)
plot(fc_mod2, series = 1)

plot(fc_mod1, series = 2)
plot(fc_mod2, series = 2)


## ----include=FALSE---------------------------------------------------------------------------
mod2 <- mvgam(y ~ 1,
  trend_formula = ~ s(season, bs = "cc", k = 8) - 1,
  trend_knots = list(season = c(0.5, 12.5)),
  trend_model = AR(cor = TRUE),
  noncentred = TRUE,
  data = simdat$data_train,
  newdata = simdat$data_test,
  silent = 2
)


## ----eval=FALSE------------------------------------------------------------------------------
# mod2 <- mvgam(y ~ 1,
#   trend_formula = ~ s(season, bs = "cc", k = 8) - 1,
#   trend_knots = list(season = c(0.5, 12.5)),
#   trend_model = AR(cor = TRUE),
#   noncentred = TRUE,
#   data = simdat$data_train,
#   newdata = simdat$data_test,
#   silent = 2
# )


## --------------------------------------------------------------------------------------------
fc_mod2 <- forecast(mod2)


## ----warning=FALSE, fig.alt = "Plotting posterior forecast distributions using mvgam and R"----
plot(fc_mod2, series = 1)


## ----warning=FALSE---------------------------------------------------------------------------
crps_mod1 <- score(fc_mod1, score = "crps")
str(crps_mod1)
crps_mod1$series_1


## ----warning=FALSE---------------------------------------------------------------------------
crps_mod1 <- score(fc_mod1, score = "crps", interval_width = 0.6)
crps_mod1$series_1


## --------------------------------------------------------------------------------------------
link_mod1 <- forecast(mod1, newdata = simdat$data_test, type = "link")
score(link_mod1, score = "elpd")$series_1


## --------------------------------------------------------------------------------------------
energy_mod2 <- score(fc_mod2, score = "energy")
str(energy_mod2)


## --------------------------------------------------------------------------------------------
energy_mod2$all_series


## --------------------------------------------------------------------------------------------
crps_mod1 <- score(fc_mod1, score = "crps")
crps_mod2 <- score(fc_mod2, score = "crps")

diff_scores <- crps_mod2$series_1$score -
  crps_mod1$series_1$score
plot(diff_scores,
  pch = 16, cex = 1.25, col = "darkred",
  ylim = c(
    -1 * max(abs(diff_scores), na.rm = TRUE),
    max(abs(diff_scores), na.rm = TRUE)
  ),
  bty = "l",
  xlab = "Forecast horizon",
  ylab = expression(CRPS[AR1] ~ -~ CRPS[spline])
)
abline(h = 0, lty = "dashed", lwd = 2)
ar1_better <- length(which(diff_scores < 0))
title(main = paste0(
  "AR(1) better in ",
  ar1_better,
  " of ",
  length(diff_scores),
  " evaluations",
  "\nMean difference = ",
  round(mean(diff_scores, na.rm = TRUE), 2)
))


diff_scores <- crps_mod2$series_2$score -
  crps_mod1$series_2$score
plot(diff_scores,
  pch = 16, cex = 1.25, col = "darkred",
  ylim = c(
    -1 * max(abs(diff_scores), na.rm = TRUE),
    max(abs(diff_scores), na.rm = TRUE)
  ),
  bty = "l",
  xlab = "Forecast horizon",
  ylab = expression(CRPS[AR1] ~ -~ CRPS[spline])
)
abline(h = 0, lty = "dashed", lwd = 2)
ar1_better <- length(which(diff_scores < 0))
title(main = paste0(
  "AR(1) better in ",
  ar1_better,
  " of ",
  length(diff_scores),
  " evaluations",
  "\nMean difference = ",
  round(mean(diff_scores, na.rm = TRUE), 2)
))

diff_scores <- crps_mod2$series_3$score -
  crps_mod1$series_3$score
plot(diff_scores,
  pch = 16, cex = 1.25, col = "darkred",
  ylim = c(
    -1 * max(abs(diff_scores), na.rm = TRUE),
    max(abs(diff_scores), na.rm = TRUE)
  ),
  bty = "l",
  xlab = "Forecast horizon",
  ylab = expression(CRPS[AR1] ~ -~ CRPS[spline])
)
abline(h = 0, lty = "dashed", lwd = 2)
ar1_better <- length(which(diff_scores < 0))
title(main = paste0(
  "AR(1) better in ",
  ar1_better,
  " of ",
  length(diff_scores),
  " evaluations",
  "\nMean difference = ",
  round(mean(diff_scores, na.rm = TRUE), 2)
))