## ----setup, include = FALSE---------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  fig.width = 10,
  fig.height = 6,
  dpi = 120,
  out.width = "100%",
  warning = FALSE,
  message = FALSE
)

## -----------------------------------------------------------------------------
library(VARcheck)
set.seed(35032)

## ----simulate-----------------------------------------------------------------
# Simulate a VAR(1) process
T  <- 150
p  <- 4
phi <- matrix(c(0.5, 0.1, 0.0, 0.0,
                0.2, 0.4, 0.0, 0.1,
                0.0, 0.0, 0.6, 0.0,
                0.1, 0.0, 0.2, 0.3), nrow = p, byrow = TRUE)

emp <- matrix(0, T, p)
for (t in 2:T) {
  emp[t, ] <- phi %*% emp[t - 1, ] + rnorm(p, sd = 0.5)
}

# Fit a simple lag-1 linear model per variable (stand-in for a real VAR fit)
pred <- matrix(NA, T, p)
res  <- matrix(NA, T, p)
for (j in seq_len(p)) {
  fit        <- lm(emp[-1, j] ~ emp[-T, j])
  pred[-1, j] <- predict(fit)
  res[-1, j]  <- residuals(fit)
}

# Simulate from the fitted model for the posterior predictive check
sim <- matrix(0, T, p)
for (t in 2:T) {
  sim[t, ] <- phi %*% sim[t - 1, ] + rnorm(p, sd = 0.5)
}

## ----vd-----------------------------------------------------------------------
vd <- new_var_data(
  empirical  = emp,
  predicted  = pred,
  residuals  = res,
  simulated  = sim,
  var_names  = c("Mood", "Energy", "Fatigue", "Anxiety")
)

vd

## ----basic-plot, fig.height = 9-----------------------------------------------
plot_var_check(vd)

## ----vars, fig.height = 5-----------------------------------------------------
plot_var_check(vd, vars = c("Mood", "Fatigue"))

## ----panels, fig.height = 9---------------------------------------------------
plot_var_check(vd, panels = c("data", "residuals"))

## ----multi-subject, fig.height = 9--------------------------------------------
emp2  <- emp + matrix(rnorm(T * p, sd = 0.2), T, p)
pred2 <- pred + matrix(rnorm(T * p, sd = 0.1), T, p)
res2  <- emp2 - pred2

vd_multi <- new_var_data(
  empirical = list(emp, emp2),
  predicted = list(pred, pred2),
  residuals = list(res, res2),
  simulated = list(sim, sim),
  var_names = c("Mood", "Energy", "Fatigue", "Anxiety")
)

plot_var_check(vd_multi, subject = 2)

## ----colours, fig.height = 9--------------------------------------------------
plot_var_check(vd, colors = list(predicted = "steelblue4"))

## ----theme, fig.height = 9----------------------------------------------------
plot_var_check(
  vd,
  theme = ggplot2::theme(
    text      = ggplot2::element_text(size = 9, family = "sans"),
    panel.grid.minor = ggplot2::element_blank()
  )
)

## ----ylim, fig.height = 9-----------------------------------------------------
plot_var_check(vd, ylim_data = c(-3, 3), ylim_res = c(-2, 2))

## ----mlvar-fit, eval = FALSE--------------------------------------------------
# library(mlVAR)
# 
# vars <- c("A", "B", "C", "D")
# 
# mlVAR_out <- mlVAR(data, vars = c("A", "B", "C", "D"),
#                    idvar = "id", lags = 1,
#                    dayvar = "day", beepvar = "beep")
# 
# pred_df <- predict(mlVAR_out)
# res_df  <- residuals(mlVAR_out)
# sim_out <- mlVAR:::resimulate(mlVAR_out, keep_missing = TRUE,
#                               variance = "empirical")

## ----mlvar-single, eval = FALSE-----------------------------------------------
# i <- 1  # subject index
# unique_ids <- unique(data$id)
# 
# check_df <- new_var_data(
#   empirical = as.matrix(data[data$id == unique_ids[i], vars]),
#   predicted = as.matrix(pred_df[pred_df$id == unique_ids[i], vars]),
#   residuals = as.matrix(res_df[res_df$id == unique_ids[i], vars]),
#   simulated = as.matrix(sim_out[sim_out$id == unique_ids[i], vars])
# )
# 
# plot_var_check(check_df)

## ----mlvar-multi, eval = FALSE------------------------------------------------
# n_subj   <- length(unique_ids)
# 
# check_df_all <- new_var_data(
#   empirical = lapply(unique_ids, \(id) as.matrix(data[data$id == id, vars])),
#   predicted = lapply(unique_ids, \(id) as.matrix(pred_df[pred_df$id == id, vars])),
#   residuals = lapply(unique_ids, \(id) as.matrix(res_df[res_df$id == id, vars])),
#   simulated = lapply(unique_ids, \(id) as.matrix(sim_out[sim_out$id == id, vars]))
# )
# 
# plot_var_check(check_df_all, subject = 3)

