---
title: "5. Multilevel VAR"
output:
  rmarkdown::html_vignette:
    toc: true
bibliography: references.bib
link-citations: true
vignette: >
  %\VignetteIndexEntry{4. Multilevel VAR}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(
  collapse = TRUE, comment = "#>", message = FALSE, warning = FALSE,
  fig.width = 7, fig.height = 5.5
)
library(idiographic)
data(srl)
has_cograph <- requireNamespace("cograph", quietly = TRUE)
# fit_mlvar(estimator = "lmer") needs lme4, which is only Suggested.
# Every chunk that fits or inspects the model is gated on it so the
# vignette still builds where lme4 is unavailable (CRAN's noSuggests
# check flavour, for one).
has_lme4 <- requireNamespace("lme4", quietly = TRUE)
```

The multilevel vector autoregression models the intensive longitudinal series
of an entire panel jointly, decomposing each person's observations into a
stable person-specific mean and momentary deviations around that mean, and
fitting a first-order dynamic process to the deviations
[@epskamp2018mlvar]. Its estimand differs from that of the single-subject
estimators in this package: where `fit_var()` and `fit_graphical_var()`
recover one individual's dynamics, `fit_mlvar()` pools across individuals and
recovers the average within-person process — the lag-one structure a typical
member of the panel follows — together with a separate description of how the
stable person-level means covary. It presumes weak stationarity of each
person's series, meaning that the mean, variance, and autocovariance are
constant across the observation window; linear, lag-one dynamics;
approximately Gaussian residuals; equally spaced measurement occasions; and a
correctly specified multilevel structure for the pooling.

The model yields three networks over the same variables, and the distinction
between the within-person and between-person layers is central to reading
them. The temporal network is directed and within-person: an edge
`from -> to` is the fixed effect of `from` at occasion $t-1$ on `to` at
occasion $t$, holding the other lagged variables constant — the average
lag-one prediction across the panel, expressed on within-person deviations.
The contemporaneous network is undirected and also within-person: after the
previous occasion has explained what it can, the residuals within the same
occasion may still be associated, and the contemporaneous edges are the
average within-person partial correlations among these same-occasion
residuals. The between-person network is a different estimand altogether. Its
edges are partial correlations among the stable person-level means —
associations among who scores high on average, not among what fluctuates
within anyone — and it must not be interpreted as a within-person process
[@epskamp2018mlvar]. The two levels answer different
questions, are estimated from different sources of variance, and are under no
obligation to agree: a pair of variables can be positively coupled within
persons and negatively associated between them, or the reverse, and the fit
below contains exactly such a sign reversal.

The multilevel model therefore targets the group-average within-person
structure, not any single person's network. On the idiographic premise that
within-person dynamics need not match the structure of the group, the average
process is a summary of the panel, not a portrait of any member: a
fixed-effect temporal network can be weak or null while individual students
carry strong, mutually cancelling dynamics. `fit_mlvar()` accordingly
complements rather than replaces the single-subject estimators — it is the
appropriate tool when the question concerns the typical process and the panel
is large, and the subject-by-subject fits remain the appropriate tool when
individual differences in dynamics are themselves the target.

# Data and preprocessing

The estimator expects long format: one row per person-occasion, an id column,
and numeric time-varying indicators ordered within person. The bundled `srl`
data hold self-regulated-learning indicators for 36 students measured over
156 occasions each; the multilevel model uses the full panel on five
indicators: `efficacy`, `value`, `planning`, `monitoring`, and `effort`.
Because the estimators absorb assumption violations silently — a trending
series inflates its autoregressive coefficient rather than producing an
error — the stationarity screen precedes the fit, with `min_obs = 100`
requiring at least one hundred usable occasions per student.

```{r vars-audit}
vars <- c("efficacy", "value", "planning", "monitoring", "effort")
preprocess(srl, vars = vars, id = "name", min_obs = 100)
```

The 36 students contribute 5616 ordered rows, of which 5548 survive as
complete current/lagged pairs: each student loses the first occasion to the
initial lag, and a few lose more to missing values. Ten subject-series trip
the linear-trend flag and one shows drift between the halves of its window —
a stationarity caution to carry into interpretation — but no series shows
zero variance, near-unit-root persistence, or a unit root, so the model is
fitted on the series as they stand.

# Fitting the model

The call specifies the mixed-model backend (`estimator = "lmer"`), a common
temporal matrix across students (`temporal = "fixed"`), a common residual
partial-correlation layer (`contemporaneous = "fixed"`), and the full set of
lagged predictors rather than autoregressions only (`AR = FALSE`). The
fixed-effect specification is deliberately conservative: it estimates the
average temporal network without random slopes, which keeps the model fast
and estimable at the cost of any statement about how individual students
deviate from the average.

```{r fit, eval=has_lme4}
mlvar_fit <- fit_mlvar(
  srl, vars = vars, id = "name",
  estimator = "lmer", temporal = "fixed", contemporaneous = "fixed",
  AR = FALSE
)
mlvar_fit
```

The fitted object pools 36 subjects and 5548 observations on five variables
into the three layers. The temporal layer is weak: only 2 of the 25 fixed
lag-one effects (self-loops included) reach significance at $p < .05$, and
the weights, self-loops included, span -0.049 to 0.044. The contemporaneous
layer is dense and entirely positive, with within-occasion partial
correlations reaching 0.274. The between-person layer is the strongest of the
three, spanning -0.086 to 0.553 with eight positive and two negative edges.

# Reading the output

The `summary()` method reports one row per network layer, with the edge
count, density, and mean absolute weight.

```{r summary, eval=has_lme4}
summary(mlvar_fit)
```

No layer is pruned — the model is unregularized, so every off-diagonal cell
carries an estimate and each density is 1 — which makes the mean absolute
weight the informative column. The temporal mean of 0.012 is an order of
magnitude below the contemporaneous 0.165 and the between-person 0.209: on
average, a student's state one occasion earlier predicts little, while
variables co-move within occasions and, above all, stable student averages
covary. The `edges()` accessor lists the edges of a layer in decreasing
magnitude.

```{r edges-temporal, eval=has_lme4}
edges(mlvar_fit, network = "temporal", n = 5)
```

The strongest average lag-one effects between distinct variables run from
monitoring at $t-1$ to effort at $t$ (0.029), from value to effort (0.029),
and from monitoring to efficacy (0.024); the strongest negative effect runs
from effort to value (-0.022). Each is an average within-person effect — a
claim about the typical student's occasion-to-occasion prediction, not a
claim that holds for every student.

```{r edges-contemporaneous, eval=has_lme4}
edges(mlvar_fit, network = "contemporaneous", n = 5)
```

The contemporaneous layer is led by planning–effort (0.274),
efficacy–planning (0.241), and efficacy–effort (0.208). Each is an average
within-person, within-occasion conditional association: on occasions when a
student reports more planning than their own average, they also report more
effort at the same occasion, over and above what the other indicators and the
previous occasion explain.

```{r edges-between, eval=has_lme4}
edges(mlvar_fit, network = "between", n = 5)
```

The between-person layer reads differently in kind, not merely in strength.
Its strongest edge, efficacy–planning at 0.553, states that students whose
average efficacy is high also report high average planning; value–effort at
0.415 is likewise a statement about stable differences among students.
Nothing in these edges concerns change within any student. The
value–monitoring pair makes the contrast between the two levels concrete: the
association is positive within persons (0.07 in the contemporaneous layer)
and negative between persons (-0.09 in the between layer) — a student
momentarily above their own value average tends also to be above their
monitoring average, while students whose value is high on average tend to
have lower average monitoring than their peers.

Node-level structure follows from the edges through `nodes()`, whose strength
column sums the absolute weights incident to each node within a layer.

```{r nodes, eval=has_lme4}
nodes(mlvar_fit)
```

In the temporal layer monitoring has the largest out-strength (0.078) and
effort the largest in-strength (0.075), so the average lagged signal, weak as
it is, flows from monitoring toward effort; the largest single temporal
coefficients are the self-loops of efficacy (-0.049) and value (0.044),
reported in the `self` column. In the between-person layer efficacy has the
largest strength (1.176), driven by its associations with planning and value,
followed by effort (1.054). The full coefficient tables are available from
`coefs(mlvar_fit)`, and the three layer matrices from `matrices()`.

```{r matrices, eval=has_lme4}
matrices(mlvar_fit)
```

The matrices restate the layer contrast cell by cell: the contemporaneous
matrix is entirely positive with planning–effort (0.274) as its largest
entry, while the between-person efficacy–planning cell (0.553) exceeds every
within-person association in the model — a reminder that the two layers
estimate different quantities and require separate interpretation.

# Visualizing the network

Plotting the fit draws the three layers side by side: arrows in the temporal
panel denote average lag-one prediction, edge width scales with absolute
weight, and colour encodes sign.

```{r plot-all, eval=has_cograph && has_lme4}
plot(mlvar_fit)
```

The contrast between panels restates the summary graphically: thin, diffuse
temporal arrows against dense undirected contemporaneous and between-person
structure. Each layer can also be drawn alone.

```{r plot-temporal, eval=has_cograph && has_lme4}
plot(mlvar_fit, layer = "temporal")
```

The temporal layer is thin throughout; monitoring and value are the clearest
lagged predictors of later effort.

```{r plot-contemporaneous, eval=has_cograph && has_lme4}
plot(mlvar_fit, layer = "contemporaneous")
```

The contemporaneous layer shows uniformly positive within-occasion partial
correlations, led by planning–effort and efficacy–planning.

The two within-person layers combine into a mixed network — directed average
lag-one effects and undirected average contemporaneous partial correlations —
which `plot(mlvar_fit, mixed = TRUE)` draws in one graph, the temporal edges as
curved arrows and the contemporaneous edges as straight lines.

```{r plot-mixed, eval=has_cograph && has_lme4}
plot(mlvar_fit, mixed = TRUE)
```

```{r plot-between, eval=has_cograph && has_lme4}
plot(mlvar_fit, layer = "between")
```

The between-person layer is dominated by efficacy–planning and value–effort.
It describes stable differences among students, not within-student change,
and no edge in it is a temporal mechanism. A parallel caution applies to the
fixed-effect layers themselves: as averages they can mask heterogeneous
individual dynamics, and where those individual differences are the question,
the single-subject estimators of the preceding vignettes are the instrument.

# References
