--- title: "Bayesian dynamics recipes (ild_brms)" author: "tidyILD authors" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Bayesian dynamics recipes (ild_brms)} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", eval = FALSE ) ``` This article gives **copy-paste templates** for modest **dynamics** extensions with [`ild_brms()`]. It is **not** a substitute for identification work, prior sensitivity, or specialized **DSEM** software when that is your estimand. See `vignette("temporal-dynamics-model-choice", package = "tidyILD")` for how these pieces fit the bigger picture. ## Prerequisites - Packages: **brms**, **Stan** backend (**rstan** or **cmdstanr**). - Data prepared with [`ild_prepare()`]; lag columns from [`ild_lag()`] or [`ild_panel_lag_prepare()`]. ## Recipe 1: Random slope for a lagged predictor ```{r recipe-random-lag-slope} library(tidyILD) set.seed(1) d <- ild_simulate(n_id = 15, n_obs_per = 12, seed = 1) d$x <- rnorm(nrow(d)) x <- ild_prepare(d, id = "id", time = "time") x <- ild_lag(x, x, n = 1L, mode = "gap_aware") tpl <- ild_brms_dynamics_formula("y", "x_lag1", id_var = "id") tpl$formula tpl$notes # Short chains for illustration only: # fit <- ild_brms(tpl$formula, data = x, iter = 500, chains = 2, refresh = 0) # ild_tidy(fit) ``` `ild_brms_dynamics_formula()` returns a **suggested** formula `(lag | id) + (1|id)`; adjust priors via [`ild_prior_ild()`] and check [`ild_diagnose()`] (R-hat, ESS). ## Recipe 2: Bivariate lag sketch (two variables) Build two lag columns, then include both fixed effects (and optionally random slopes). A full **panel VAR** requires more structure than this template; this is a **minimal** associational extension. ```{r recipe-two-lags} x2 <- ild_panel_lag_prepare(x, c("x", "y"), n = c(1L, 1L), mode = "gap_aware") names(x2$data) # Example fixed structure only (not run): # f2 <- y ~ x_lag1 + y_lag1 + (1 | id) # fit2 <- ild_brms(f2, data = x2$data, iter = 500, chains = 2, refresh = 0) ``` ## Recipe 3: Multivariate outcomes with `mvbind` (sketch) For **two or more outcomes measured on the same occasions**, **brms** can model them **jointly** with `mvbind()` so residuals can correlate across outcomes. This is still **not** a full panel VAR / DSEM: you must choose lags, priors, and residual structure deliberately. When the estimand is a **fully specified dynamic system** with feedback, **dynamite** or **lavaan** DSEM (or similar) is often more appropriate than stacking outcomes in a single `brms` formula. ```{r recipe-mvbind} # Not run — requires brms; illustration only: # library(brms) # f_mv <- bf(mvbind(mood, stress) ~ mood_lag1 + stress_lag1 + (1 | id)) + set_rescor(TRUE) # fit_mv <- brm(f_mv, data = x2$data, chains = 2, iter = 500, refresh = 0) # Build mood_lag1 / stress_lag1 with ild_lag() or ild_panel_lag_prepare() first. ``` For routing when joint multivariate dynamics or high-dimensional predictors matter, see `vignette("ild-specialist-backends", package = "tidyILD")`. ## See also - `?ild_brms`, `?ild_prior_ild`, `?ild_diagnose` - `vignette("temporal-dynamics-model-choice", package = "tidyILD")` - `vignette("ild-specialist-backends", package = "tidyILD")` ```{r session-info, echo = FALSE} sessionInfo() ```