06 · Results and reproduction

This vignette renders every released table from tables/ and closes with the exact reproduction ladder. It requires no LISS data.

tbl <- function(f) utils::read.csv(file.path("..", "tables", f), check.names = FALSE)
k <- function(x, ...) knitr::kable(x, digits = 3, ...)

Model comparison: CLPM versus RI-CLPM

k(tbl("clpm_vs_riclpm_fit.csv"), caption = "Pooled sample")
Pooled sample
model CFI TLI RMSEA SRMR AIC BIC
CLPM 0.919 0.875 0.115 0.101 324299.559 325076.907
RI-CLPM 0.993 0.989 0.035 0.025 317876.698 318693.911
difference 0.074 0.114 -0.080 -0.076 -6422.861 -6382.997
k(tbl("clpm_vs_riclpm_fit_grouped.csv"), caption = "Three-group (multigroup) models")
Three-group (multigroup) models
model CFI TLI RMSEA SRMR AIC BIC
CLPM 0.919 0.873 0.116 0.102 323537.56 325869.605
RI-CLPM 0.993 0.988 0.035 0.030 317055.25 319506.887
difference 0.074 0.115 -0.080 -0.072 -6482.31 -6362.718

The RI-CLPM dominates on every descriptive index and by thousands of AIC and BIC points in both the pooled and the multigroup fits: the covariation among the constructs is predominantly between persons.

Between-person (trait-level) associations

bp <- tbl("between_person_covariances.csv")
k(bp, caption = "Random-intercept variances and covariances (unstandardised)")
Random-intercept variances and covariances (unstandardised)
lhs rhs est se z pvalue
riBMI riBMI 17.342 0.495 35.066 0.0
riPA riPA 4.168 0.259 16.087 0.0
riFV riFV 0.269 0.005 52.662 0.0
riBMI riPA -1.123 0.125 -8.962 0.0
riBMI riFV -0.022 0.032 -0.674 0.5
riPA riFV 0.109 0.019 5.831 0.0
v <- setNames(bp$est[bp$lhs == bp$rhs], bp$lhs[bp$lhs == bp$rhs])
cv <- bp[bp$lhs != bp$rhs, ]
cv$r <- cv$est / sqrt(v[cv$lhs] * v[cv$rhs])
k(cv[, c("lhs", "rhs", "est", "r", "z", "pvalue")],
  caption = "Trait covariances with implied correlations")
Trait covariances with implied correlations
lhs rhs est r z pvalue
4 riBMI riPA -1.123 -0.132 -8.962 0.0
5 riBMI riFV -0.022 -0.010 -0.674 0.5
6 riPA riFV 0.109 0.103 5.831 0.0

Trait BMI relates negatively to trait activity, is essentially unrelated to the fruit-and-vegetable trait, and trait activity relates positively to the diet trait.

Within-person dynamics (pooled, time-invariant)

k(tbl("riclpm_dynamics_coefficients_pooled.csv"),
  caption = "Autoregressive and cross-lagged coefficients")
Autoregressive and cross-lagged coefficients
block path est se ci.lower ci.upper pvalue sig
autoregressive BMI -> BMI 0.511 0.019 0.473 0.549 0.000 ***
autoregressive FV -> FV 0.125 0.011 0.104 0.146 0.000 ***
autoregressive PA -> PA 0.281 0.026 0.230 0.332 0.000 ***
cross-lagged BMI -> FV -0.003 0.004 -0.010 0.004 0.402
cross-lagged BMI -> PA -0.070 0.016 -0.102 -0.038 0.000 ***
cross-lagged FV -> BMI -0.060 0.019 -0.098 -0.022 0.002 **
cross-lagged FV -> PA 0.004 0.038 -0.069 0.078 0.913
cross-lagged PA -> BMI -0.017 0.005 -0.026 -0.007 0.001 ***
cross-lagged PA -> FV 0.004 0.002 0.000 0.008 0.067 .

Carry-over is moderate and weakest for diet; among the cross-lags, the BMI-PA pair is reciprocal, with both paths negative and small.

Socioeconomic moderation

k(tbl("focal_covariance_by_ses.csv"),
  caption = "Standardised trait BMI-PA covariance by stratum")
Standardised trait BMI-PA covariance by stratum
group est.std se ci.lower ci.upper pvalue SES
1 -0.120 0.021 -0.161 -0.080 0 ses1
2 -0.129 0.030 -0.188 -0.069 0 ses2
3 -0.113 0.023 -0.158 -0.067 0 ses3
k(tbl("focal_covariance_boot.csv"),
  caption = "Delta-method and bootstrap percentile intervals (R = 1,000)")
Delta-method and bootstrap percentile intervals (R = 1,000)
SES est.std ci.lower ci.upper boot.lower boot.upper n_boot
ses1 -0.120 -0.161 -0.080 -0.162 -0.079 1000
ses2 -0.129 -0.188 -0.069 -0.188 -0.066 1000
ses3 -0.113 -0.158 -0.067 -0.160 -0.065 1000
k(tbl("moderation_lrt.csv"), caption = "Free versus equal across strata (scaled LRT)")
Free versus equal across strata (scaled LRT)
model Df AIC BIC Chisq Chisq diff Df diff Pr(>Chisq)
riBMIriPA free 387 317055.2 319506.9 1160.185 NA NA NA
riBMIriPA equal 389 317052.0 319490.4 1160.978 1.473 2 0.479

The focal covariance is negative and significant in every stratum, tightly clustered, and a model holding it equal is preferred: no socioeconomic moderation.

Supporting tests and per-group detail

k(tbl("time_invariance_lrt.csv"), caption = "Lagged paths free versus time-invariant")
Lagged paths free versus time-invariant
model Df AIC BIC Chisq Chisq diff Df diff Pr(>Chisq)
lagged paths free per wave 387 317055.2 319506.9 1160.185 NA NA NA
lagged paths time-invariant 522 317360.7 318915.4 1735.621 154.242 135 0.123
k(tbl("riclpm_dynamics_coefficients.csv"),
  caption = "Per-group time-invariant dynamics")
Per-group time-invariant dynamics
block group path est se ci.lower ci.upper pvalue sig
autoregressive ses1 BMI -> BMI 0.458 0.028 0.404 0.513 0.000 ***
autoregressive ses2 BMI -> BMI 0.573 0.041 0.493 0.652 0.000 ***
autoregressive ses3 BMI -> BMI 0.521 0.033 0.457 0.585 0.000 ***
autoregressive ses1 FV -> FV 0.102 0.019 0.066 0.139 0.000 ***
autoregressive ses2 FV -> FV 0.134 0.022 0.090 0.178 0.000 ***
autoregressive ses3 FV -> FV 0.138 0.016 0.106 0.169 0.000 ***
autoregressive ses1 PA -> PA 0.204 0.055 0.097 0.311 0.000 ***
autoregressive ses2 PA -> PA 0.356 0.049 0.260 0.451 0.000 ***
autoregressive ses3 PA -> PA 0.289 0.033 0.224 0.355 0.000 ***
cross-lagged ses1 BMI -> FV 0.005 0.006 -0.007 0.018 0.387
cross-lagged ses2 BMI -> FV 0.001 0.007 -0.012 0.014 0.920
cross-lagged ses3 BMI -> FV -0.016 0.006 -0.028 -0.004 0.011 *
cross-lagged ses1 BMI -> PA -0.045 0.031 -0.105 0.015 0.142
cross-lagged ses2 BMI -> PA -0.059 0.030 -0.118 0.001 0.052 .
cross-lagged ses3 BMI -> PA -0.093 0.028 -0.149 -0.038 0.001 **
cross-lagged ses1 FV -> BMI -0.058 0.032 -0.122 0.005 0.071 .
cross-lagged ses2 FV -> BMI -0.058 0.043 -0.142 0.026 0.178
cross-lagged ses3 FV -> BMI -0.067 0.029 -0.124 -0.010 0.021 *
cross-lagged ses1 FV -> PA -0.004 0.060 -0.122 0.114 0.945
cross-lagged ses2 FV -> PA -0.046 0.080 -0.203 0.111 0.569
cross-lagged ses3 FV -> PA 0.044 0.058 -0.070 0.159 0.450
cross-lagged ses1 PA -> BMI -0.018 0.008 -0.033 -0.003 0.020 *
cross-lagged ses2 PA -> BMI -0.004 0.011 -0.026 0.018 0.731
cross-lagged ses3 PA -> BMI -0.021 0.008 -0.036 -0.005 0.008 **
cross-lagged ses1 PA -> FV 0.005 0.003 -0.002 0.011 0.150
cross-lagged ses2 PA -> FV 0.000 0.004 -0.008 0.008 0.991
cross-lagged ses3 PA -> FV 0.005 0.003 -0.001 0.012 0.094 .
k(tbl("ses_group_estimates.csv"), caption = "Per-group estimate overview")
Per-group estimate overview
effect est_SES_1 p_SES_1 est_SES_2 p_SES_2 est_SES_3 p_SES_3
wBMI2 ~ wBMI1 0.534 *** 0.584 *** 0.438 ***
wBMI2 ~ wPA1 -0.005 -0.031 -0.043 *
wBMI2 ~ wFV1 0.016 -0.095 -0.099
wPA2 ~ wBMI1 0.003 -0.103 . -0.217 *
wPA2 ~ wPA1 0.370 *** 0.467 *** 0.493 ***
wPA2 ~ wFV1 0.115 -0.129 0.115
wFV2 ~ wBMI1 0.024 * 0.011 0.011
wFV2 ~ wPA1 0.007 0.001 0.005
wFV2 ~ wFV1 0.120 ** 0.107 * 0.232 ***
wBMI3 ~ wBMI2 0.489 *** 0.425 *** 0.252 **
wBMI3 ~ wPA2 -0.039 * -0.022 -0.059 *
wBMI3 ~ wFV2 -0.025 0.003 0.153 *
wPA3 ~ wBMI2 -0.098 . -0.071 -0.181 .
wPA3 ~ wPA2 0.352 ** 0.397 *** 0.352 ***
wPA3 ~ wFV2 0.210 0.034 0.248 .
wFV3 ~ wBMI2 0.010 -0.009 0.001
wFV3 ~ wPA2 0.002 0.001 0.004
wFV3 ~ wFV2 0.135 *** 0.142 ** 0.072 *
wBMI4 ~ wBMI3 0.333 *** 0.474 *** 0.354 ***
wBMI4 ~ wPA3 0.004 0.008 -0.071 ***
wBMI4 ~ wFV3 -0.039 -0.052 -0.139 .
wPA4 ~ wBMI3 -0.016 -0.062 -0.258 *
wPA4 ~ wPA3 0.206 0.479 ** 0.349 ***
wPA4 ~ wFV3 -0.145 -0.116 0.263 .
wFV4 ~ wBMI3 0.015 0.008 -0.029
wFV4 ~ wPA3 0.007 0.012 0.007
wFV4 ~ wFV3 0.068 . 0.097 * 0.112 **
wBMI5 ~ wBMI4 0.191 . 0.316 * 0.442 ***
wBMI5 ~ wPA4 -0.019 -0.010 -0.017
wBMI5 ~ wFV4 0.005 -0.155 -0.008
wPA5 ~ wBMI4 0.096 0.077 -0.131 .
wPA5 ~ wPA4 -0.055 0.326 ** 0.086
wPA5 ~ wFV4 -0.085 0.099 -0.309 *
wFV5 ~ wBMI4 -0.034 -0.019 -0.031 .
wFV5 ~ wPA4 0.002 0.007 0.007
wFV5 ~ wFV4 0.093 * 0.071 0.123 ***
wBMI6 ~ wBMI5 0.274 . 0.620 *** 0.718 ***
wBMI6 ~ wPA5 -0.017 0.019 -0.001
wBMI6 ~ wFV5 -0.145 -0.081 -0.185 **
wPA6 ~ wBMI5 -0.098 0.078 0.028
wPA6 ~ wPA5 0.243 * 0.254 *** 0.164 **
wPA6 ~ wFV5 -0.373 * -0.031 -0.105
wFV6 ~ wBMI5 0.005 -0.007 -0.025
wFV6 ~ wPA5 -0.006 -0.013 -0.006
wFV6 ~ wFV5 0.026 0.121 * 0.099 *
wBMI7 ~ wBMI6 0.447 *** 0.632 *** 0.654 ***
wBMI7 ~ wPA6 -0.026 0.022 0.004
wBMI7 ~ wFV6 -0.232 ** -0.021 -0.051
wPA7 ~ wBMI6 -0.067 -0.054 -0.023
wPA7 ~ wPA6 0.080 0.330 *** 0.187 **
wPA7 ~ wFV6 0.010 -0.113 -0.089
wFV7 ~ wBMI6 -0.016 0.001 -0.028 *
wFV7 ~ wPA6 0.013 . 0.001 0.012
wFV7 ~ wFV6 0.145 *** 0.226 *** 0.148 ***
k(tbl("riclpm_covariate_effects.csv"),
  caption = "Covariate effects on the random intercepts (standardised, fixed.x = TRUE)")
Covariate effects on the random intercepts (standardised, fixed.x = TRUE)
group path est.std se ci.lower ci.upper pvalue sig
ses1 age -> riBMI 0.132 0.025 0.083 0.182 0.000 ***
ses2 age -> riBMI 0.162 0.029 0.106 0.218 0.000 ***
ses3 age -> riBMI 0.190 0.022 0.147 0.234 0.000 ***
ses1 age -> riFV 0.333 0.025 0.284 0.381 0.000 ***
ses2 age -> riFV 0.340 0.029 0.283 0.398 0.000 ***
ses3 age -> riFV 0.274 0.024 0.227 0.320 0.000 ***
ses1 age -> riPA -0.087 0.032 -0.149 -0.025 0.006 **
ses2 age -> riPA -0.110 0.040 -0.187 -0.032 0.006 **
ses3 age -> riPA -0.047 0.029 -0.104 0.011 0.114
ses1 female -> riBMI 0.014 0.021 -0.027 0.056 0.499
ses2 female -> riBMI -0.048 0.026 -0.100 0.004 0.068 .
ses3 female -> riBMI -0.066 0.020 -0.106 -0.026 0.001 **
ses1 female -> riFV 0.268 0.022 0.224 0.311 0.000 ***
ses2 female -> riFV 0.205 0.026 0.153 0.257 0.000 ***
ses3 female -> riFV 0.249 0.021 0.208 0.290 0.000 ***
ses1 female -> riPA -0.068 0.026 -0.118 -0.018 0.008 **
ses2 female -> riPA -0.147 0.032 -0.210 -0.085 0.000 ***
ses3 female -> riPA -0.117 0.024 -0.164 -0.071 0.000 ***
ses1 med -> riBMI 0.251 0.025 0.203 0.299 0.000 ***
ses2 med -> riBMI 0.138 0.030 0.079 0.196 0.000 ***
ses3 med -> riBMI 0.153 0.024 0.106 0.199 0.000 ***
ses1 med -> riFV -0.020 0.026 -0.071 0.030 0.435
ses2 med -> riFV 0.019 0.029 -0.037 0.076 0.503
ses3 med -> riFV -0.037 0.024 -0.083 0.010 0.120
ses1 med -> riPA -0.095 0.027 -0.148 -0.042 0.000 ***
ses2 med -> riPA -0.005 0.037 -0.079 0.068 0.885
ses3 med -> riPA -0.034 0.025 -0.082 0.015 0.174

Reproduction ladder

  1. remotes::install_deps() from the compendium root (pulls lissr and weasel from GitHub per DESCRIPTION).
  2. Obtain LISS access, then make acquire and make panel (vignettes 01 and 02), or place an existing liss_merged_long.sav in data/.
  3. make sample for the standalone weasel audit; make analysis to render analysis/run_all.md, the chunk-by-chunk transcript ending in sessionInfo().
  4. First render takes roughly two hours, dominated by the bootstrap; the seeded, fingerprint-guarded cache makes subsequent renders take minutes.

Two assertions run inside the pipeline on every render: the lissr equivalisation must equal the in-line formula, and the weasel scenario must select exactly the pipeline’s 5,676 respondents. A failed assertion stops the render rather than silently diverging.

sessionInfo()
R version 4.6.1 (2026-06-24)
Platform: aarch64-apple-darwin23
Running under: macOS Tahoe 26.5.1

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.6/Resources/lib/libRblas.0.dylib 
LAPACK: /Library/Frameworks/R.framework/Versions/4.6/Resources/lib/libRlapack.dylib;  LAPACK version 3.12.1

locale:
[1] C.UTF-8/UTF-8/C.UTF-8/C/C.UTF-8/C.UTF-8

time zone: Europe/Amsterdam
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
 [1] htmlwidgets_1.6.4 compiler_4.6.1    fastmap_1.2.0     cli_3.6.6        
 [5] tools_4.6.1       htmltools_0.5.9   otel_0.2.0        yaml_2.3.12      
 [9] rmarkdown_2.31    knitr_1.51        jsonlite_2.0.0    xfun_0.57        
[13] digest_0.6.39     rlang_1.2.0       evaluate_1.0.5