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(1111)
N <- 200
beta_temp <- mvgam:::sim_gp(rnorm(1), alpha_gp = 0.75, rho_gp = 10, h = N) + 0.5
## ----fig.alt = "Simulating time-varying effects in mvgam and R"------------------------------
plot(
beta_temp,
type = "l",
lwd = 3,
bty = "l",
xlab = "Time",
ylab = "Coefficient",
col = "darkred"
)
box(bty = "l", lwd = 2)
## --------------------------------------------------------------------------------------------
temp <- rnorm(N, sd = 1)
## ----fig.alt = "Simulating time-varying effects in mvgam and R"------------------------------
out <- rnorm(N, mean = 4 + beta_temp * temp, sd = 0.25)
time <- seq_along(temp)
plot(
out,
type = "l",
lwd = 3,
bty = "l",
xlab = "Time",
ylab = "Outcome",
col = "darkred"
)
box(bty = "l", lwd = 2)
## --------------------------------------------------------------------------------------------
data <- data.frame(out, temp, time)
data_train <- data[1:190, ]
data_test <- data[191:200, ]
## ----include=FALSE---------------------------------------------------------------------------
mod <- mvgam(
out ~ dynamic(temp, rho = 8, stationary = TRUE, k = 40),
family = gaussian(),
data = data_train,
silent = 2
)
## ----eval=FALSE------------------------------------------------------------------------------
# mod <- mvgam(out ~ dynamic(temp, rho = 8, stationary = TRUE, k = 40),
# family = gaussian(),
# data = data_train,
# silent = 2
# )
## --------------------------------------------------------------------------------------------
summary(mod, include_betas = FALSE)
## --------------------------------------------------------------------------------------------
plot_mvgam_smooth(mod, smooth = 1, newdata = data)
abline(v = 190, lty = "dashed", lwd = 2)
lines(beta_temp, lwd = 2.5, col = "white")
lines(beta_temp, lwd = 2)
## --------------------------------------------------------------------------------------------
require(marginaleffects)
range_round <- function(x) {
round(range(x, na.rm = TRUE), 2)
}
plot_predictions(
mod,
newdata = datagrid(
time = unique,
temp = range_round
),
by = c("time", "temp", "temp"),
type = "link"
)
## --------------------------------------------------------------------------------------------
fc <- forecast(mod, newdata = data_test)
plot(fc)
## ----include=FALSE---------------------------------------------------------------------------
mod <- mvgam(
out ~ dynamic(temp, k = 40),
family = gaussian(),
data = data_train,
silent = 2
)
## ----eval=FALSE------------------------------------------------------------------------------
# mod <- mvgam(out ~ dynamic(temp, k = 40),
# family = gaussian(),
# data = data_train,
# silent = 2
# )
## --------------------------------------------------------------------------------------------
summary(mod, include_betas = FALSE)
## --------------------------------------------------------------------------------------------
plot_mvgam_smooth(mod, smooth = 1, newdata = data)
abline(v = 190, lty = "dashed", lwd = 2)
lines(beta_temp, lwd = 2.5, col = "white")
lines(beta_temp, lwd = 2)
## --------------------------------------------------------------------------------------------
load(url("https://github.com/atsa-es/MARSS/raw/master/data/SalmonSurvCUI.rda"))
dplyr::glimpse(SalmonSurvCUI)
## --------------------------------------------------------------------------------------------
SalmonSurvCUI %>%
# create a time variable
dplyr::mutate(time = dplyr::row_number()) %>%
# create a series variable
dplyr::mutate(series = as.factor("salmon")) %>%
# z-score the covariate CUI.apr
dplyr::mutate(CUI.apr = as.vector(scale(CUI.apr))) %>%
# convert logit-transformed survival back to proportional
dplyr::mutate(survival = plogis(logit.s)) -> model_data
## --------------------------------------------------------------------------------------------
dplyr::glimpse(model_data)
## --------------------------------------------------------------------------------------------
plot_mvgam_series(data = model_data, y = "survival")
## ----include = FALSE-------------------------------------------------------------------------
mod0 <- mvgam(
formula = survival ~ 1,
trend_model = AR(),
noncentred = TRUE,
priors = prior(normal(-3.5, 0.5), class = Intercept),
family = betar(),
data = model_data,
silent = 2
)
## ----eval = FALSE----------------------------------------------------------------------------
# mod0 <- mvgam(
# formula = survival ~ 1,
# trend_model = AR(),
# noncentred = TRUE,
# priors = prior(normal(-3.5, 0.5), class = Intercept),
# family = betar(),
# data = model_data,
# silent = 2
# )
## --------------------------------------------------------------------------------------------
summary(mod0)
## --------------------------------------------------------------------------------------------
plot(mod0, type = "trend")
## ----include=FALSE---------------------------------------------------------------------------
mod1 <- mvgam(
formula = survival ~ 1,
trend_formula = ~ dynamic(CUI.apr, k = 25, scale = FALSE) - 1,
trend_model = AR(),
noncentred = TRUE,
priors = prior(normal(-3.5, 0.5), class = Intercept),
family = betar(),
data = model_data,
control = list(adapt_delta = 0.99),
silent = 2
)
## ----eval=FALSE------------------------------------------------------------------------------
# mod1 <- mvgam(
# formula = survival ~ 1,
# trend_formula = ~ dynamic(CUI.apr, k = 25, scale = FALSE) - 1,
# trend_model = AR(),
# noncentred = TRUE,
# priors = prior(normal(-3.5, 0.5), class = Intercept),
# family = betar(),
# data = model_data,
# silent = 2
# )
## --------------------------------------------------------------------------------------------
summary(mod1, include_betas = FALSE)
## --------------------------------------------------------------------------------------------
plot(mod1, type = "trend")
## --------------------------------------------------------------------------------------------
plot(mod1, type = "forecast")
## --------------------------------------------------------------------------------------------
# Extract estimates of the process error 'sigma' for each model
mod0_sigma <- as.data.frame(mod0, variable = "sigma", regex = TRUE) %>%
dplyr::mutate(model = "Mod0")
mod1_sigma <- as.data.frame(mod1, variable = "sigma", regex = TRUE) %>%
dplyr::mutate(model = "Mod1")
sigmas <- rbind(mod0_sigma, mod1_sigma)
# Plot using ggplot2
require(ggplot2)
ggplot(sigmas, aes(y = `sigma[1]`, fill = model)) +
geom_density(alpha = 0.3, colour = NA) +
coord_flip()
## --------------------------------------------------------------------------------------------
plot(mod1, type = "smooths", trend_effects = TRUE)
## --------------------------------------------------------------------------------------------
loo_compare(mod0, mod1)
## ----include=FALSE---------------------------------------------------------------------------
lfo_mod0 <- lfo_cv(mod0, min_t = 30)
lfo_mod1 <- lfo_cv(mod1, min_t = 30)
## ----eval=FALSE------------------------------------------------------------------------------
# lfo_mod0 <- lfo_cv(mod0, min_t = 30)
# lfo_mod1 <- lfo_cv(mod1, min_t = 30)
## --------------------------------------------------------------------------------------------
sum(lfo_mod0$elpds)
sum(lfo_mod1$elpds)
## ----fig.alt = "Comparing forecast skill for dynamic beta regression models in mvgam and R"----
plot(
x = 1:length(lfo_mod0$elpds) + 30,
y = lfo_mod0$elpds - lfo_mod1$elpds,
ylab = "ELPDmod0 - ELPDmod1",
xlab = "Evaluation time point",
pch = 16,
col = "darkred",
bty = "l"
)
abline(h = 0, lty = "dashed")
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.