The RI-CLPM decomposes each observed score into a stable between-person random intercept and a within-person deviation (innovation). The within-person deviations follow a lag-1 (cross-lagged) structure over time. In this implementation the innovations and the random intercepts are modeled as latent variables under the lvm framework, with the latent covariance matrix being block-diagonal over time, so that the within-person (contemporaneous) and between-person covariance structures can each be modeled as a covariance matrix, a Cholesky decomposition, a precision matrix, or a Gaussian graphical model (GGM).
The RI-CLPN. When the innovation and between-person structures are parameterized as Gaussian graphical models (type = "ggm"), the RI-CLPM becomes the random-intercept cross-lagged panel network model (RI-CLPN): the contemporaneous and the between-person relations are then partial-correlation networks rather than covariance matrices, while the temporal (cross-lagged) structure is the directed lag-1 network in either case. The function ri_clpn is a thin wrapper around ri_clpm that uses type = "ggm" as its default (the type argument can still be overridden), mirroring how panelgvar wraps panelvar. Because ri_clpm_stationary and ri_clpm_search operate on an already specified model object, no parameterization is involved there, and ri_clpn_stationary and ri_clpn_search are pure aliases of those functions, provided so that a network-parameterized analysis can be written entirely in RI-CLPN notation.
The stationarity search. ri_clpm_search formalizes the typical analysis workflow as a guarded decision tree over the four stationarity constraints, closed off by the panel(G)VAR model. The steps are visited in the order "temporal", "contemporaneous", "intercepts", "innovation", "wave1_endogenous", and each step is tested against the current working model (the base model plus all constraints retained so far). A constraint is retained if it does not worsen fit according to criterion: with criterion = "Chisq" when the likelihood-ratio test has \(p \ge\) alpha, and with "AIC" or "BIC" when that criterion does not increase. A candidate model that did not converge, or that produced a negative or non-finite chi-square or a non-finite criterion, is never retained; such a fit counts as a rejection of its constraint and the reason is reported in the verdict table.
The tree treats the steps differently according to the targets of inference:
"temporal" is the only hard gate. The temporal (cross-lagged) effects are the primary target of inference in a cross-lagged panel analysis. If they are not stationary there is no single lag-1 temporal network to report, and the target of inference changes to a set of per-transition temporal networks (one for each wave-to-wave step). The search therefore stops entirely, the unconstrained base model is selected, and the remaining steps are recorded as "not tested", since each of them would only be interpretable conditional on a temporal structure that does not hold. When this happens, check whether the waves are equally spaced in time: unequal measurement intervals produce wave-varying lag-1 effects even when the underlying process is perfectly stationary, and so mimic temporal non-stationarity.
"contemporaneous", "intercepts" and "innovation" are nuisance- or secondary-structure questions, so a rejection is released rather than fatal: the constraint is not imposed (that set of parameters stays wave-specific) but the search continues to the next step. Each of these constraints is therefore tested exactly once, conditional only on the constraints that survived their own test. This reaches endpoints that a strict chain cannot reach, for example wave-varying contemporaneous relations combined with stationary intercepts and stationary innovation variances.
"wave1_endogenous" tests the panel(G)VAR model, which additionally treats the first wave as a draw from the stationary distribution of the within-person process. It is gated on covariance stationarity and therefore requires the temporal, contemporaneous and innovation constraints to all have been retained: a within-person process whose innovation covariance structure varies over waves has no stationary distribution, so there is nothing for an endogenous first wave to be drawn from and the step is undefined. In that case the step is reported as "not applicable" and the search finishes. When the step does apply, the working model is compared to panelvar(vars = ..., sampleStats = ..., within_latent = type, between_latent = type, baseline = "none"); if the intercept constraint was released, that panel model is fit with stationary_means = FALSE, so that both models carry a saturated (wave-specific) mean structure and the comparison isolates the wave-1 block. The panel model is the constrained special case here: it has \(m(m+1)/2\) fewer free parameters, and hence \(m(m+1)/2\) more degrees of freedom, than the working RI-CLPM, namely the freed exogenous wave-1 within-person covariance block (\(m\) = number of variables). The likelihood-ratio test is thus the chi-square of the panel model minus the chi-square of the working model on \(m(m+1)/2\) degrees of freedom. This degrees-of-freedom gap is verified at run time and a warning is issued when it differs, which indicates that the constraint bookkeeping of the working model was disturbed upstream (for example by prune or fixpar).
Setting on_rejection = "stop" reproduces the pre-0.17.2 behavior exactly: the same tree is walked but the search breaks at the first rejection, so no constraint is ever released and the panel(G)VAR step is only reached when all four constraints are retained.
With the default type = "cor" parameterization the contemporaneous (correlation) step and the innovation-variance (standard deviation) step are cleanly separated and nested; the innovation variances are never equated with the exogenous wave-1 variances nor with the between-person random-intercept variances.
Extracting and plotting the networks. Because the model is set up in the lvm framework, its matrices span all waves at once and the temporal, contemporaneous and between-person networks are blocks of those matrices. Those blocks can be addressed directly, using the same matrix names as panelvar / panelgvar together with a time argument:
getmatrix(x, "beta", time = 2) # temporal network, wave 2 -> 3
getmatrix(x, "PDC", time = 2) # ... as partial directed correlations
getmatrix(x, "omega_zeta_within", time = 3) # contemporaneous network at wave 3
getmatrix(x, "omega_zeta_between") # between-person network
getmatrix(x, "nu_between") # random-intercept means
CIplot(x, "omega_zeta_within", time = 3) # confidence intervals of that block
Blocks carry the variable names of the design matrix, so they can be passed straight to qgraph. Omitting time returns one block per wave, with waves that were equated by ri_clpm_stationary collapsed into a single entry. See getmatrix and CIplot for the details.
Structural missing waves (NA entries in the vars design matrix, i.e. a variable not measured at a particular wave) are not yet supported. Incomplete cases (missing data for some subjects) are handled automatically through full-information maximum likelihood.