6  Multi-Group SEM

Author
Affiliation

John T West

The Pennsylvania State University

Published

March 28, 2024

library(dplyr)
library(tidyr)
library(psych)
library(ggplot2)
library(cowplot)
library(igraph)
library(plyr)
library(lavaan)
library(semPlot)
library(bayestestR)
library(MASS)
library(gtools)
library(bain)

Loading in data from data cleaning page

load("INDI_data.Rdata")

indi.data$Group = as.factor(indi.data$Group)

indi.data$Group = factor(indi.data$Group, levels = c("OA", "YA"), 
                         labels = c("OA" , "YA"))

indi.data$numeric.id = as.character(indi.data$numeric.id)

indi.data = dplyr::select(indi.data, numeric.id, Group, 
                   WCST.Persev.Errors, Arithmetic, backward.span,
                   letter.numbering, PPVT, PPT, 
                   MVPT, OOO.High.Hit.Rate, OOO.Color.Hit.Rate, OOO.Size.Hit.Rate,
                   cat.drm.FA.Related.Rates, schematic.FA.Related.Rates, 
                   object.sim.FA.Related.Rates, abstract.img.FA.Related.Rates)

Standardizing numeric indicators, reversing bWCST

scale2 = function(x, na.rm = FALSE) (x - mean(x, na.rm = na.rm)) / sd(x, na.rm)

data.z = indi.data %>%
  mutate_if(is.numeric, scale2, na.rm = TRUE)

# Reversing WCST
data.z$WCST.Persev.Errors = -1*data.z$WCST.Persev.Errors

Configural Invariance

Fitting model selected using CFA model comparisons.

configural.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates + object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ semantic.disc + exec.func + per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
'

configural.fit = sem(configural.model, 
                     missing = 'ML', 
                     data = data.z, 
                     group = 'Group')

# Model Results

summary(configural.fit, 
        fit.measures = TRUE, 
        standardized = TRUE, 
        rsquare = TRUE)
lavaan 0.6.17 ended normally after 98 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                        92

  Number of observations per group:                   
    OA                                             152
    YA                                             211
  Number of missing patterns per group:               
    OA                                              10
    YA                                              18

Model Test User Model:
                                                      
  Test statistic                               164.914
  Degrees of freedom                               116
  P-value (Chi-square)                           0.002
  Test statistic for each group:
    OA                                          68.575
    YA                                          96.338

Model Test Baseline Model:

  Test statistic                              1181.492
  Degrees of freedom                               156
  P-value                                        0.000

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    0.952
  Tucker-Lewis Index (TLI)                       0.936
                                                      
  Robust Comparative Fit Index (CFI)             0.947
  Robust Tucker-Lewis Index (TLI)                0.929

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -5556.360
  Loglikelihood unrestricted model (H1)      -5473.903
                                                      
  Akaike (AIC)                               11296.720
  Bayesian (BIC)                             11655.005
  Sample-size adjusted Bayesian (SABIC)      11363.129

Root Mean Square Error of Approximation:

  RMSEA                                          0.048
  90 Percent confidence interval - lower         0.030
  90 Percent confidence interval - upper         0.064
  P-value H_0: RMSEA <= 0.050                    0.555
  P-value H_0: RMSEA >= 0.080                    0.000
                                                      
  Robust RMSEA                                   0.052
  90 Percent confidence interval - lower         0.032
  90 Percent confidence interval - upper         0.069
  P-value H_0: Robust RMSEA <= 0.050             0.426
  P-value H_0: Robust RMSEA >= 0.080             0.002

Standardized Root Mean Square Residual:

  SRMR                                           0.060

Parameter Estimates:

  Standard errors                             Standard
  Information                                 Observed
  Observed information based on                Hessian


Group 1 [OA]:

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  semantic.disc =~                                                      
    PPVT              1.000                               0.347    0.960
    PPT               0.471    0.205    2.296    0.022    0.163    0.322
  per.disc =~                                                           
    MVPT              1.000                               0.747    0.761
    OOO.High.Ht.Rt    0.675    0.145    4.653    0.000    0.505    0.520
    OOO.Size.Ht.Rt    0.570    0.121    4.703    0.000    0.426    0.505
  exec.func =~                                                          
    WCST.Prsv.Errr    1.000                               0.412    0.336
    Arithmetic        1.573    0.473    3.325    0.001    0.647    0.705
    backward.span     1.010    0.350    2.886    0.004    0.416    0.417
    letter.numbrng    1.092    0.366    2.985    0.003    0.449    0.504
  false.memory =~                                                       
    ct.drm.FA.Rl.R    1.000                               0.492    0.547
    schmtc.FA.Rl.R    0.737    0.258    2.859    0.004    0.362    0.348
    objct.s.FA.R.R    1.561    0.389    4.008    0.000    0.768    0.875
    abstrc..FA.R.R    0.896    0.214    4.180    0.000    0.441    0.483

Regressions:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  false.memory ~                                                        
    semantic.disc     0.064    0.218    0.293    0.769    0.045    0.045
    exec.func        -0.324    0.381   -0.849    0.396   -0.271   -0.271
    per.disc         -0.204    0.181   -1.127    0.260   -0.310   -0.310

Covariances:
                       Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
 .OOO.High.Hit.Rate ~~                                                      
   .OOO.Size.Ht.Rt        0.257    0.065    3.970    0.000    0.257    0.426
  semantic.disc ~~                                                          
    per.disc              0.146    0.031    4.677    0.000    0.562    0.562
    exec.func             0.091    0.030    3.078    0.002    0.637    0.637
  per.disc ~~                                                               
    exec.func             0.237    0.080    2.965    0.003    0.770    0.770

Intercepts:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .PPVT              0.874    0.029   29.823    0.000    0.874    2.419
   .PPT               0.654    0.041   15.868    0.000    0.654    1.287
   .MVPT             -0.213    0.080   -2.678    0.007   -0.213   -0.217
   .OOO.High.Ht.Rt   -0.248    0.079   -3.149    0.002   -0.248   -0.255
   .OOO.Size.Ht.Rt    0.125    0.068    1.833    0.067    0.125    0.149
   .WCST.Prsv.Errr   -0.268    0.102   -2.624    0.009   -0.268   -0.218
   .Arithmetic        0.299    0.074    4.016    0.000    0.299    0.326
   .backward.span     0.084    0.081    1.036    0.300    0.084    0.084
   .letter.numbrng   -0.144    0.072   -1.993    0.046   -0.144   -0.162
   .ct.drm.FA.Rl.R   -0.149    0.074   -2.022    0.043   -0.149   -0.166
   .schmtc.FA.Rl.R    0.077    0.102    0.755    0.450    0.077    0.074
   .objct.s.FA.R.R    0.035    0.072    0.488    0.625    0.035    0.040
   .abstrc..FA.R.R    0.263    0.074    3.539    0.000    0.263    0.289

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .PPVT              0.010    0.045    0.228    0.819    0.010    0.078
   .PPT               0.231    0.028    8.171    0.000    0.231    0.897
   .MVPT              0.406    0.107    3.790    0.000    0.406    0.421
   .OOO.High.Ht.Rt    0.689    0.094    7.351    0.000    0.689    0.730
   .OOO.Size.Ht.Rt    0.529    0.070    7.512    0.000    0.529    0.745
   .WCST.Prsv.Errr    1.335    0.165    8.090    0.000    1.335    0.887
   .Arithmetic        0.424    0.080    5.270    0.000    0.424    0.503
   .backward.span     0.822    0.103    7.964    0.000    0.822    0.826
   .letter.numbrng    0.595    0.079    7.548    0.000    0.595    0.746
   .ct.drm.FA.Rl.R    0.567    0.088    6.446    0.000    0.567    0.701
   .schmtc.FA.Rl.R    0.957    0.140    6.852    0.000    0.957    0.879
   .objct.s.FA.R.R    0.181    0.115    1.572    0.116    0.181    0.235
   .abstrc..FA.R.R    0.637    0.080    7.973    0.000    0.637    0.766
    semantic.disc     0.120    0.047    2.562    0.010    1.000    1.000
    per.disc          0.559    0.139    4.010    0.000    1.000    1.000
    exec.func         0.169    0.096    1.764    0.078    1.000    1.000
   .false.memory      0.177    0.059    2.985    0.003    0.731    0.731

R-Square:
                   Estimate
    PPVT              0.922
    PPT               0.103
    MVPT              0.579
    OOO.High.Ht.Rt    0.270
    OOO.Size.Ht.Rt    0.255
    WCST.Prsv.Errr    0.113
    Arithmetic        0.497
    backward.span     0.174
    letter.numbrng    0.254
    ct.drm.FA.Rl.R    0.299
    schmtc.FA.Rl.R    0.121
    objct.s.FA.R.R    0.765
    abstrc..FA.R.R    0.234
    false.memory      0.269


Group 2 [YA]:

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  semantic.disc =~                                                      
    PPVT              1.000                               0.497    0.615
    PPT               1.507    0.274    5.496    0.000    0.750    0.750
  per.disc =~                                                           
    MVPT              1.000                               0.854    0.870
    OOO.High.Ht.Rt    0.737    0.087    8.434    0.000    0.630    0.643
    OOO.Size.Ht.Rt    0.641    0.101    6.320    0.000    0.547    0.503
  exec.func =~                                                          
    WCST.Prsv.Errr    1.000                               0.295    0.394
    Arithmetic        2.251    0.514    4.379    0.000    0.664    0.665
    backward.span     2.221    0.518    4.288    0.000    0.655    0.658
    letter.numbrng    1.979    0.465    4.252    0.000    0.583    0.552
  false.memory =~                                                       
    ct.drm.FA.Rl.R    1.000                               0.769    0.732
    schmtc.FA.Rl.R    0.555    0.113    4.935    0.000    0.427    0.442
    objct.s.FA.R.R    1.185    0.126    9.388    0.000    0.911    0.847
    abstrc..FA.R.R    0.818    0.106    7.693    0.000    0.629    0.620

Regressions:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  false.memory ~                                                        
    semantic.disc    -0.288    0.233   -1.241    0.215   -0.187   -0.187
    exec.func        -0.247    0.377   -0.656    0.512   -0.095   -0.095
    per.disc         -0.350    0.186   -1.878    0.060   -0.389   -0.389

Covariances:
                       Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
 .OOO.High.Hit.Rate ~~                                                      
   .OOO.Size.Ht.Rt        0.109    0.059    1.842    0.065    0.109    0.154
  semantic.disc ~~                                                          
    per.disc              0.285    0.059    4.852    0.000    0.671    0.671
    exec.func             0.046    0.022    2.128    0.033    0.314    0.314
  per.disc ~~                                                               
    exec.func             0.164    0.043    3.828    0.000    0.653    0.653

Intercepts:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .PPVT             -0.650    0.056  -11.555    0.000   -0.650   -0.803
   .PPT              -0.471    0.069   -6.840    0.000   -0.471   -0.471
   .MVPT              0.154    0.068    2.274    0.023    0.154    0.157
   .OOO.High.Ht.Rt    0.179    0.067    2.650    0.008    0.179    0.182
   .OOO.Size.Ht.Rt   -0.090    0.075   -1.204    0.229   -0.090   -0.083
   .WCST.Prsv.Errr    0.182    0.052    3.485    0.000    0.182    0.244
   .Arithmetic       -0.216    0.069   -3.138    0.002   -0.216   -0.216
   .backward.span    -0.060    0.069   -0.881    0.378   -0.060   -0.061
   .letter.numbrng    0.104    0.073    1.429    0.153    0.104    0.098
   .ct.drm.FA.Rl.R    0.111    0.073    1.516    0.130    0.111    0.106
   .schmtc.FA.Rl.R   -0.059    0.077   -0.772    0.440   -0.059   -0.061
   .objct.s.FA.R.R   -0.017    0.075   -0.230    0.818   -0.017   -0.016
   .abstrc..FA.R.R   -0.202    0.071   -2.847    0.004   -0.202   -0.199

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .PPVT              0.407    0.058    7.068    0.000    0.407    0.622
   .PPT               0.438    0.104    4.205    0.000    0.438    0.438
   .MVPT              0.235    0.068    3.458    0.001    0.235    0.243
   .OOO.High.Ht.Rt    0.563    0.066    8.568    0.000    0.563    0.587
   .OOO.Size.Ht.Rt    0.885    0.095    9.293    0.000    0.885    0.747
   .WCST.Prsv.Errr    0.474    0.051    9.327    0.000    0.474    0.845
   .Arithmetic        0.556    0.078    7.100    0.000    0.556    0.558
   .backward.span     0.561    0.080    7.041    0.000    0.561    0.567
   .letter.numbrng    0.776    0.092    8.449    0.000    0.776    0.695
   .ct.drm.FA.Rl.R    0.512    0.071    7.187    0.000    0.512    0.464
   .schmtc.FA.Rl.R    0.750    0.091    8.256    0.000    0.750    0.804
   .objct.s.FA.R.R    0.327    0.074    4.440    0.000    0.327    0.282
   .abstrc..FA.R.R    0.634    0.073    8.664    0.000    0.634    0.616
    semantic.disc     0.247    0.065    3.817    0.000    1.000    1.000
    per.disc          0.729    0.111    6.558    0.000    1.000    1.000
    exec.func         0.087    0.035    2.461    0.014    1.000    1.000
   .false.memory      0.384    0.074    5.195    0.000    0.649    0.649

R-Square:
                   Estimate
    PPVT              0.378
    PPT               0.562
    MVPT              0.757
    OOO.High.Ht.Rt    0.413
    OOO.Size.Ht.Rt    0.253
    WCST.Prsv.Errr    0.155
    Arithmetic        0.442
    backward.span     0.433
    letter.numbrng    0.305
    ct.drm.FA.Rl.R    0.536
    schmtc.FA.Rl.R    0.196
    objct.s.FA.R.R    0.718
    abstrc..FA.R.R    0.384
    false.memory      0.351
## Inspecting latent correlations
lavInspect(configural.fit, "cor.lv")
$OA
              smntc. pr.dsc exc.fn fls.mm
semantic.disc  1.000                     
per.disc       0.562  1.000              
exec.func      0.637  0.770  1.000       
false.memory  -0.302 -0.493 -0.480  1.000

$YA
              smntc. pr.dsc exc.fn fls.mm
semantic.disc  1.000                     
per.disc       0.671  1.000              
exec.func      0.314  0.653  1.000       
false.memory  -0.477 -0.576 -0.407  1.000
## Saving Warning Messages

# Create an empty list to store warning messages
warnings.configural = list()

# Run the model using 'withCallingHandlers' to capture the warnings
warnings.model.configural = withCallingHandlers(
  expr = {
   sem(configural.model, 
                     missing = 'ML', 
                     data = data.z, 
                     group = 'Group')
  },
  warning = function(w) {
    warnings.configural <<- c(warnings.configural, list(conditionMessage(w)))
    invokeRestart("muffleWarning")
  }
)

if (length(warnings.configural) > 0) {
# Combine the warning messages into a single character string separated by a semicolon
  combined.warning.configural = gsub("lavaan WARNING: ", "",
                            gsub("\\s{2,}", " ",
                                 paste(warnings.configural, 
                                       collapse = "; ")))
} else {
  # If no warnings, set combined.warning to "No warnings"
  combined.warning.configural = "No warnings."
}


## Saving fit measures

configural.measures = as.data.frame(fitMeasures(configural.fit))
configural.measures[, 1] = as.numeric(configural.measures[, 1])

rm(warnings.model.configural, warnings.configural)

Configural Invariance Results:

  • Warnings: “No warnings.”
  • Chi-squared: X 2 (116) = 164.914, p = 0.002
  • CFI: 0.952
  • TLI: 0.936
  • RMSEA: 0.048 [0.03, 0.064] 90% CI
  • SRMR: 0.06

The configural invariance model fits the data well, indicating that the same general factor structure applies for both OAs and YAs.

Weak Invariance

Testing for weak invariance by imposing equality constraints on factor loadings between groups.

weak.fit = sem(configural.model, 
                     missing = 'ML', 
                     data = data.z, 
                     group = 'Group', 
               group.equal = "loadings")

# Model Results

summary(weak.fit, 
        fit.measures = TRUE, 
        standardized = TRUE, 
        rsquare = TRUE)
lavaan 0.6.17 ended normally after 81 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                        92
  Number of equality constraints                     9

  Number of observations per group:                   
    OA                                             152
    YA                                             211
  Number of missing patterns per group:               
    OA                                              10
    YA                                              18

Model Test User Model:
                                                      
  Test statistic                               181.439
  Degrees of freedom                               125
  P-value (Chi-square)                           0.001
  Test statistic for each group:
    OA                                          79.543
    YA                                         101.896

Model Test Baseline Model:

  Test statistic                              1181.492
  Degrees of freedom                               156
  P-value                                        0.000

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    0.945
  Tucker-Lewis Index (TLI)                       0.931
                                                      
  Robust Comparative Fit Index (CFI)             0.940
  Robust Tucker-Lewis Index (TLI)                0.926

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -5564.623
  Loglikelihood unrestricted model (H1)      -5473.903
                                                      
  Akaike (AIC)                               11295.245
  Bayesian (BIC)                             11618.481
  Sample-size adjusted Bayesian (SABIC)      11355.158

Root Mean Square Error of Approximation:

  RMSEA                                          0.050
  90 Percent confidence interval - lower         0.033
  90 Percent confidence interval - upper         0.065
  P-value H_0: RMSEA <= 0.050                    0.490
  P-value H_0: RMSEA >= 0.080                    0.000
                                                      
  Robust RMSEA                                   0.053
  90 Percent confidence interval - lower         0.035
  90 Percent confidence interval - upper         0.069
  P-value H_0: Robust RMSEA <= 0.050             0.382
  P-value H_0: Robust RMSEA >= 0.080             0.002

Standardized Root Mean Square Residual:

  SRMR                                           0.064

Parameter Estimates:

  Standard errors                             Standard
  Information                                 Observed
  Observed information based on                Hessian


Group 1 [OA]:

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  semantic.disc =~                                                      
    PPVT              1.000                               0.253    0.724
    PPT     (.p2.)    1.045    0.161    6.481    0.000    0.265    0.493
  per.disc =~                                                           
    MVPT              1.000                               0.724    0.741
    OOO.H.H (.p4.)    0.724    0.076    9.517    0.000    0.524    0.537
    OOO.S.H (.p5.)    0.620    0.078    7.978    0.000    0.449    0.529
  exec.func =~                                                          
    WCST.P.           1.000                               0.285    0.237
    Arthmtc (.p7.)    2.103    0.392    5.361    0.000    0.600    0.664
    bckwrd. (.p8.)    1.787    0.354    5.047    0.000    0.509    0.496
    lttr.nm (.p9.)    1.694    0.336    5.039    0.000    0.483    0.536
  false.memory =~                                                       
    c..FA.R           1.000                               0.560    0.614
    s.FA.R. (.11.)    0.579    0.103    5.606    0.000    0.325    0.313
    o..FA.R (.12.)    1.241    0.122   10.207    0.000    0.695    0.801
    a..FA.R (.13.)    0.825    0.095    8.671    0.000    0.462    0.503

Regressions:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  false.memory ~                                                        
    semantic.disc     0.562    0.681    0.824    0.410    0.254    0.254
    exec.func        -0.896    0.687   -1.305    0.192   -0.456   -0.456
    per.disc         -0.292    0.212   -1.375    0.169   -0.377   -0.377

Covariances:
                       Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
 .OOO.High.Hit.Rate ~~                                                      
   .OOO.Size.Ht.Rt        0.248    0.062    3.968    0.000    0.248    0.417
  semantic.disc ~~                                                          
    per.disc              0.127    0.028    4.502    0.000    0.691    0.691
    exec.func             0.055    0.015    3.652    0.000    0.756    0.756
  per.disc ~~                                                               
    exec.func             0.155    0.041    3.769    0.000    0.749    0.749

Intercepts:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .PPVT              0.874    0.028   30.798    0.000    0.874    2.498
   .PPT               0.654    0.044   15.005    0.000    0.654    1.217
   .MVPT             -0.213    0.079   -2.694    0.007   -0.213   -0.218
   .OOO.High.Ht.Rt   -0.248    0.079   -3.131    0.002   -0.248   -0.254
   .OOO.Size.Ht.Rt    0.125    0.069    1.819    0.069    0.125    0.148
   .WCST.Prsv.Errr   -0.264    0.100   -2.635    0.008   -0.264   -0.219
   .Arithmetic        0.299    0.073    4.080    0.000    0.299    0.331
   .backward.span     0.084    0.083    1.006    0.314    0.084    0.082
   .letter.numbrng   -0.144    0.073   -1.975    0.048   -0.144   -0.160
   .ct.drm.FA.Rl.R   -0.151    0.075   -2.022    0.043   -0.151   -0.166
   .schmtc.FA.Rl.R    0.077    0.102    0.758    0.448    0.077    0.075
   .objct.s.FA.R.R    0.035    0.071    0.489    0.625    0.035    0.040
   .abstrc..FA.R.R    0.263    0.075    3.512    0.000    0.263    0.286

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .PPVT              0.058    0.016    3.723    0.000    0.058    0.476
   .PPT               0.218    0.028    7.700    0.000    0.218    0.757
   .MVPT              0.430    0.092    4.689    0.000    0.430    0.451
   .OOO.High.Ht.Rt    0.679    0.090    7.531    0.000    0.679    0.712
   .OOO.Size.Ht.Rt    0.519    0.069    7.540    0.000    0.519    0.720
   .WCST.Prsv.Errr    1.363    0.164    8.287    0.000    1.363    0.944
   .Arithmetic        0.457    0.075    6.126    0.000    0.457    0.560
   .backward.span     0.795    0.103    7.736    0.000    0.795    0.754
   .letter.numbrng    0.578    0.077    7.520    0.000    0.578    0.712
   .ct.drm.FA.Rl.R    0.520    0.076    6.841    0.000    0.520    0.623
   .schmtc.FA.Rl.R    0.973    0.142    6.872    0.000    0.973    0.902
   .objct.s.FA.R.R    0.270    0.072    3.736    0.000    0.270    0.359
   .abstrc..FA.R.R    0.632    0.081    7.844    0.000    0.632    0.747
    semantic.disc     0.064    0.019    3.351    0.001    1.000    1.000
    per.disc          0.524    0.113    4.620    0.000    1.000    1.000
    exec.func         0.081    0.032    2.513    0.012    1.000    1.000
   .false.memory      0.200    0.054    3.694    0.000    0.636    0.636

R-Square:
                   Estimate
    PPVT              0.524
    PPT               0.243
    MVPT              0.549
    OOO.High.Ht.Rt    0.288
    OOO.Size.Ht.Rt    0.280
    WCST.Prsv.Errr    0.056
    Arithmetic        0.440
    backward.span     0.246
    letter.numbrng    0.288
    ct.drm.FA.Rl.R    0.377
    schmtc.FA.Rl.R    0.098
    objct.s.FA.R.R    0.641
    abstrc..FA.R.R    0.253
    false.memory      0.364


Group 2 [YA]:

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  semantic.disc =~                                                      
    PPVT              1.000                               0.590    0.710
    PPT     (.p2.)    1.045    0.161    6.481    0.000    0.616    0.634
  per.disc =~                                                           
    MVPT              1.000                               0.860    0.874
    OOO.H.H (.p4.)    0.724    0.076    9.517    0.000    0.623    0.638
    OOO.S.H (.p5.)    0.620    0.078    7.978    0.000    0.534    0.493
  exec.func =~                                                          
    WCST.P.           1.000                               0.331    0.437
    Arthmtc (.p7.)    2.103    0.392    5.361    0.000    0.696    0.690
    bckwrd. (.p8.)    1.787    0.354    5.047    0.000    0.592    0.605
    lttr.nm (.p9.)    1.694    0.336    5.039    0.000    0.561    0.534
  false.memory =~                                                       
    c..FA.R           1.000                               0.749    0.718
    s.FA.R. (.11.)    0.579    0.103    5.606    0.000    0.434    0.448
    o..FA.R (.12.)    1.241    0.122   10.207    0.000    0.929    0.859
    a..FA.R (.13.)    0.825    0.095    8.671    0.000    0.618    0.612

Regressions:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  false.memory ~                                                        
    semantic.disc    -0.229    0.189   -1.214    0.225   -0.180   -0.180
    exec.func        -0.145    0.315   -0.461    0.645   -0.064   -0.064
    per.disc         -0.352    0.170   -2.070    0.038   -0.404   -0.404

Covariances:
                       Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
 .OOO.High.Hit.Rate ~~                                                      
   .OOO.Size.Ht.Rt        0.111    0.058    1.908    0.056    0.111    0.157
  semantic.disc ~~                                                          
    per.disc              0.341    0.057    5.972    0.000    0.671    0.671
    exec.func             0.078    0.027    2.892    0.004    0.400    0.400
  per.disc ~~                                                               
    exec.func             0.189    0.043    4.375    0.000    0.665    0.665

Intercepts:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .PPVT             -0.650    0.058  -11.273    0.000   -0.650   -0.783
   .PPT              -0.471    0.067   -7.043    0.000   -0.471   -0.485
   .MVPT              0.154    0.068    2.269    0.023    0.154    0.156
   .OOO.High.Ht.Rt    0.179    0.067    2.657    0.008    0.179    0.183
   .OOO.Size.Ht.Rt   -0.090    0.075   -1.210    0.226   -0.090   -0.083
   .WCST.Prsv.Errr    0.182    0.053    3.437    0.001    0.182    0.240
   .Arithmetic       -0.216    0.070   -3.109    0.002   -0.216   -0.214
   .backward.span    -0.060    0.067   -0.896    0.370   -0.060   -0.062
   .letter.numbrng    0.104    0.072    1.438    0.150    0.104    0.099
   .ct.drm.FA.Rl.R    0.111    0.073    1.523    0.128    0.111    0.106
   .schmtc.FA.Rl.R   -0.059    0.077   -0.775    0.439   -0.059   -0.061
   .objct.s.FA.R.R   -0.017    0.075   -0.224    0.823   -0.017   -0.016
   .abstrc..FA.R.R   -0.203    0.071   -2.863    0.004   -0.203   -0.201

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .PPVT              0.341    0.063    5.418    0.000    0.341    0.495
   .PPT               0.564    0.088    6.439    0.000    0.564    0.598
   .MVPT              0.229    0.067    3.414    0.001    0.229    0.236
   .OOO.High.Ht.Rt    0.566    0.065    8.659    0.000    0.566    0.593
   .OOO.Size.Ht.Rt    0.888    0.094    9.397    0.000    0.888    0.757
   .WCST.Prsv.Errr    0.465    0.050    9.236    0.000    0.465    0.809
   .Arithmetic        0.533    0.077    6.971    0.000    0.533    0.524
   .backward.span     0.607    0.078    7.745    0.000    0.607    0.634
   .letter.numbrng    0.787    0.091    8.674    0.000    0.787    0.714
   .ct.drm.FA.Rl.R    0.526    0.071    7.452    0.000    0.526    0.484
   .schmtc.FA.Rl.R    0.750    0.091    8.280    0.000    0.750    0.799
   .objct.s.FA.R.R    0.307    0.072    4.268    0.000    0.307    0.262
   .abstrc..FA.R.R    0.638    0.073    8.786    0.000    0.638    0.626
    semantic.disc     0.348    0.071    4.919    0.000    1.000    1.000
    per.disc          0.740    0.108    6.838    0.000    1.000    1.000
    exec.func         0.110    0.037    2.991    0.003    1.000    1.000
   .false.memory      0.369    0.070    5.276    0.000    0.658    0.658

R-Square:
                   Estimate
    PPVT              0.505
    PPT               0.402
    MVPT              0.764
    OOO.High.Ht.Rt    0.407
    OOO.Size.Ht.Rt    0.243
    WCST.Prsv.Errr    0.191
    Arithmetic        0.476
    backward.span     0.366
    letter.numbrng    0.286
    ct.drm.FA.Rl.R    0.516
    schmtc.FA.Rl.R    0.201
    objct.s.FA.R.R    0.738
    abstrc..FA.R.R    0.374
    false.memory      0.342
## Inspecting latent correlations
lavInspect(weak.fit, "cor.lv")
$OA
              smntc. pr.dsc exc.fn fls.mm
semantic.disc  1.000                     
per.disc       0.691  1.000              
exec.func      0.756  0.749  1.000       
false.memory  -0.351 -0.543 -0.546  1.000

$YA
              smntc. pr.dsc exc.fn fls.mm
semantic.disc  1.000                     
per.disc       0.671  1.000              
exec.func      0.400  0.665  1.000       
false.memory  -0.477 -0.568 -0.405  1.000
## Saving Warning Messages

# Create an empty list to store warning messages
warnings.weak = list()

# Run the model using 'withCallingHandlers' to capture the warnings
warnings.model.weak = withCallingHandlers(
  expr = {
   sem(configural.model, 
                     missing = 'ML', 
                     data = data.z, 
                     group = 'Group', 
               group.equal = "loadings")
  },
  warning = function(w) {
    warnings.weak <<- c(warnings.weak, list(conditionMessage(w)))
    invokeRestart("muffleWarning")
  }
)

if (length(warnings.weak) > 0) {
# Combine the warning messages into a single character string separated by a semicolon
  combined.warning.weak = gsub("lavaan WARNING: ", "",
                            gsub("\\s{2,}", " ",
                                 paste(warnings.weak, 
                                       collapse = "; ")))
} else {
  # If no warnings, set combined.warning to "No warnings"
  combined.warning.weak = "No warnings."
}


## Saving fit measures

weak.measures = as.data.frame(fitMeasures(weak.fit))
weak.measures[, 1] = as.numeric(weak.measures[, 1])

rm(warnings.model.weak, warnings.weak)

weak Invariance Results:

  • Warnings: “No warnings.”
  • Chi-squared: X 2 (125) = 181.439, p = 0.001
  • CFI: 0.945
  • TLI: 0.931
  • RMSEA: 0.05 [0.033, 0.065] 90% CI
  • SRMR: 0.064

LRT Comparison:

lavTestLRT(configural.fit, weak.fit)

Chi-Squared Difference Test

                Df   AIC   BIC  Chisq Chisq diff    RMSEA Df diff Pr(>Chisq)  
configural.fit 116 11297 11655 164.91                                         
weak.fit       125 11295 11618 181.44     16.526 0.067875       9    0.05668 .
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
bic_to_bf(c(BIC(configural.fit), BIC(weak.fit)),
          denominator = BIC(configural.fit))
[1]        1 85328256
Configural Model Weak Model
CFI 0.952 0.945
TLI 0.936 0.931
RMSEA 0.048 [0.03, 0.064] 90% CI 0.05 [0.033, 0.065] 90% CI
SRMR 0.06 0.064

Given the non-significant LRT model comparison and the minimal decrease in model fit relative to the configural model (CFIdiff = 0.007, RMSEAdiff = 0.002), we retain the weak invariance model.

Equating factor loadings between groups allows comparisons of factor variances, covariances, and regression pathways.

Strong Invariance

Testing for strong invariance by imposing equality constraints on factor loadings and intercepts between groups.

strong.fit = sem(configural.model, 
                     missing = 'ML', 
                     data = data.z, 
                     group = 'Group', 
               group.equal = c("intercepts", "loadings"))

# Model Results

summary(strong.fit, 
        fit.measures = TRUE, 
        standardized = TRUE, 
        rsquare = TRUE)
lavaan 0.6.17 ended normally after 97 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                        96
  Number of equality constraints                    22

  Number of observations per group:                   
    OA                                             152
    YA                                             211
  Number of missing patterns per group:               
    OA                                              10
    YA                                              18

Model Test User Model:
                                                      
  Test statistic                               318.598
  Degrees of freedom                               134
  P-value (Chi-square)                           0.000
  Test statistic for each group:
    OA                                         149.194
    YA                                         169.404

Model Test Baseline Model:

  Test statistic                              1181.492
  Degrees of freedom                               156
  P-value                                        0.000

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    0.820
  Tucker-Lewis Index (TLI)                       0.790
                                                      
  Robust Comparative Fit Index (CFI)             0.816
  Robust Tucker-Lewis Index (TLI)                0.786

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -5633.202
  Loglikelihood unrestricted model (H1)      -5473.903
                                                      
  Akaike (AIC)                               11414.404
  Bayesian (BIC)                             11702.590
  Sample-size adjusted Bayesian (SABIC)      11467.820

Root Mean Square Error of Approximation:

  RMSEA                                          0.087
  90 Percent confidence interval - lower         0.075
  90 Percent confidence interval - upper         0.099
  P-value H_0: RMSEA <= 0.050                    0.000
  P-value H_0: RMSEA >= 0.080                    0.835
                                                      
  Robust RMSEA                                   0.089
  90 Percent confidence interval - lower         0.076
  90 Percent confidence interval - upper         0.103
  P-value H_0: Robust RMSEA <= 0.050             0.000
  P-value H_0: Robust RMSEA >= 0.080             0.884

Standardized Root Mean Square Residual:

  SRMR                                           0.085

Parameter Estimates:

  Standard errors                             Standard
  Information                                 Observed
  Observed information based on                Hessian


Group 1 [OA]:

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  semantic.disc =~                                                      
    PPVT              1.000                               0.292    0.817
    PPT     (.p2.)    0.768    0.047   16.395    0.000    0.224    0.429
  per.disc =~                                                           
    MVPT              1.000                               0.731    0.747
    OOO.H.H (.p4.)    0.748    0.076    9.817    0.000    0.547    0.552
    OOO.S.H (.p5.)    0.539    0.073    7.341    0.000    0.394    0.466
  exec.func =~                                                          
    WCST.P.           1.000                               0.238    0.186
    Arthmtc (.p7.)    2.609    0.588    4.438    0.000    0.621    0.666
    bckwrd. (.p8.)    2.051    0.460    4.456    0.000    0.488    0.477
    lttr.nm (.p9.)    1.772    0.401    4.415    0.000    0.422    0.466
  false.memory =~                                                       
    c..FA.R           1.000                               0.544    0.584
    s.FA.R. (.11.)    0.601    0.108    5.579    0.000    0.327    0.314
    o..FA.R (.12.)    1.306    0.133    9.826    0.000    0.710    0.820
    a..FA.R (.13.)    0.852    0.103    8.285    0.000    0.463    0.484

Regressions:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  false.memory ~                                                        
    semantic.disc     0.311    0.454    0.684    0.494    0.167    0.167
    exec.func        -0.947    0.851   -1.113    0.266   -0.415   -0.415
    per.disc         -0.234    0.210   -1.115    0.265   -0.316   -0.316

Covariances:
                       Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
 .OOO.High.Hit.Rate ~~                                                      
   .OOO.Size.Ht.Rt        0.243    0.063    3.828    0.000    0.243    0.393
  semantic.disc ~~                                                          
    per.disc              0.139    0.029    4.784    0.000    0.649    0.649
    exec.func             0.051    0.014    3.527    0.000    0.735    0.735
  per.disc ~~                                                               
    exec.func             0.135    0.038    3.518    0.000    0.773    0.773

Intercepts:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .PPVT    (.38.)    0.872    0.029   30.079    0.000    0.872    2.441
   .PPT     (.39.)    0.666    0.042   15.876    0.000    0.666    1.274
   .MVPT    (.40.)   -0.206    0.077   -2.673    0.008   -0.206   -0.211
   .OOO.H.H (.41.)   -0.167    0.069   -2.416    0.016   -0.167   -0.168
   .OOO.S.H (.42.)   -0.030    0.061   -0.492    0.623   -0.030   -0.035
   .WCST.P. (.43.)    0.173    0.055    3.130    0.002    0.173    0.136
   .Arthmtc (.44.)    0.136    0.079    1.734    0.083    0.136    0.146
   .bckwrd. (.45.)    0.105    0.069    1.528    0.126    0.105    0.103
   .lttr.nm (.46.)    0.060    0.064    0.942    0.346    0.060    0.066
   .c..FA.R (.47.)    0.028    0.065    0.428    0.669    0.028    0.030
   .s.FA.R. (.48.)    0.006    0.065    0.086    0.931    0.006    0.005
   .o..FA.R (.49.)    0.040    0.069    0.571    0.568    0.040    0.046
   .a..FA.R (.50.)    0.016    0.064    0.253    0.800    0.016    0.017

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .PPVT              0.042    0.017    2.489    0.013    0.042    0.332
   .PPT               0.223    0.027    8.179    0.000    0.223    0.816
   .MVPT              0.422    0.094    4.507    0.000    0.422    0.441
   .OOO.High.Ht.Rt    0.682    0.092    7.422    0.000    0.682    0.695
   .OOO.Size.Ht.Rt    0.561    0.073    7.665    0.000    0.561    0.783
   .WCST.Prsv.Errr    1.575    0.193    8.170    0.000    1.575    0.965
   .Arithmetic        0.483    0.089    5.450    0.000    0.483    0.556
   .backward.span     0.809    0.104    7.762    0.000    0.809    0.772
   .letter.numbrng    0.642    0.086    7.498    0.000    0.642    0.783
   .ct.drm.FA.Rl.R    0.572    0.083    6.911    0.000    0.572    0.659
   .schmtc.FA.Rl.R    0.974    0.142    6.859    0.000    0.974    0.901
   .objct.s.FA.R.R    0.246    0.076    3.232    0.001    0.246    0.328
   .abstrc..FA.R.R    0.700    0.092    7.587    0.000    0.700    0.765
    semantic.disc     0.085    0.021    4.121    0.000    1.000    1.000
    per.disc          0.535    0.116    4.627    0.000    1.000    1.000
    exec.func         0.057    0.026    2.165    0.030    1.000    1.000
   .false.memory      0.197    0.052    3.815    0.000    0.668    0.668

R-Square:
                   Estimate
    PPVT              0.668
    PPT               0.184
    MVPT              0.559
    OOO.High.Ht.Rt    0.305
    OOO.Size.Ht.Rt    0.217
    WCST.Prsv.Errr    0.035
    Arithmetic        0.444
    backward.span     0.228
    letter.numbrng    0.217
    ct.drm.FA.Rl.R    0.341
    schmtc.FA.Rl.R    0.099
    objct.s.FA.R.R    0.672
    abstrc..FA.R.R    0.235
    false.memory      0.332


Group 2 [YA]:

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  semantic.disc =~                                                      
    PPVT              1.000                               0.651    0.782
    PPT     (.p2.)    0.768    0.047   16.395    0.000    0.500    0.525
  per.disc =~                                                           
    MVPT              1.000                               0.862    0.876
    OOO.H.H (.p4.)    0.748    0.076    9.817    0.000    0.645    0.650
    OOO.S.H (.p5.)    0.539    0.073    7.341    0.000    0.465    0.427
  exec.func =~                                                          
    WCST.P.           1.000                               0.284    0.378
    Arthmtc (.p7.)    2.609    0.588    4.438    0.000    0.741    0.716
    bckwrd. (.p8.)    2.051    0.460    4.456    0.000    0.582    0.595
    lttr.nm (.p9.)    1.772    0.401    4.415    0.000    0.503    0.477
  false.memory =~                                                       
    c..FA.R           1.000                               0.722    0.693
    s.FA.R. (.11.)    0.601    0.108    5.579    0.000    0.434    0.447
    o..FA.R (.12.)    1.306    0.133    9.826    0.000    0.942    0.871
    a..FA.R (.13.)    0.852    0.103    8.285    0.000    0.615    0.598

Regressions:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  false.memory ~                                                        
    semantic.disc    -0.171    0.145   -1.180    0.238   -0.154   -0.154
    exec.func        -0.124    0.348   -0.355    0.723   -0.049   -0.049
    per.disc         -0.357    0.146   -2.442    0.015   -0.427   -0.427

Covariances:
                       Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
 .OOO.High.Hit.Rate ~~                                                      
   .OOO.Size.Ht.Rt        0.096    0.061    1.571    0.116    0.096    0.129
  semantic.disc ~~                                                          
    per.disc              0.348    0.060    5.774    0.000    0.621    0.621
    exec.func             0.077    0.026    2.980    0.003    0.416    0.416
  per.disc ~~                                                               
    exec.func             0.163    0.042    3.857    0.000    0.664    0.664

Intercepts:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .PPVT    (.38.)    0.872    0.029   30.079    0.000    0.872    1.048
   .PPT     (.39.)    0.666    0.042   15.876    0.000    0.666    0.699
   .MVPT    (.40.)   -0.206    0.077   -2.673    0.008   -0.206   -0.210
   .OOO.H.H (.41.)   -0.167    0.069   -2.416    0.016   -0.167   -0.168
   .OOO.S.H (.42.)   -0.030    0.061   -0.492    0.623   -0.030   -0.027
   .WCST.P. (.43.)    0.173    0.055    3.130    0.002    0.173    0.231
   .Arthmtc (.44.)    0.136    0.079    1.734    0.083    0.136    0.132
   .bckwrd. (.45.)    0.105    0.069    1.528    0.126    0.105    0.107
   .lttr.nm (.46.)    0.060    0.064    0.942    0.346    0.060    0.057
   .c..FA.R (.47.)    0.028    0.065    0.428    0.669    0.028    0.027
   .s.FA.R. (.48.)    0.006    0.065    0.086    0.931    0.006    0.006
   .o..FA.R (.49.)    0.040    0.069    0.571    0.568    0.040    0.037
   .a..FA.R (.50.)    0.016    0.064    0.253    0.800    0.016    0.016
    smntc.d          -1.514    0.065  -23.336    0.000   -2.326   -2.326
    per.dsc           0.357    0.101    3.530    0.000    0.414    0.414
    exc.fnc          -0.086    0.039   -2.198    0.028   -0.304   -0.304
   .fls.mmr          -0.189    0.270   -0.697    0.486   -0.261   -0.261

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .PPVT              0.269    0.070    3.871    0.000    0.269    0.389
   .PPT               0.657    0.075    8.768    0.000    0.657    0.724
   .MVPT              0.225    0.068    3.298    0.001    0.225    0.232
   .OOO.High.Ht.Rt    0.568    0.067    8.437    0.000    0.568    0.577
   .OOO.Size.Ht.Rt    0.969    0.103    9.380    0.000    0.969    0.818
   .WCST.Prsv.Errr    0.485    0.053    9.200    0.000    0.485    0.857
   .Arithmetic        0.521    0.088    5.931    0.000    0.521    0.487
   .backward.span     0.618    0.080    7.770    0.000    0.618    0.646
   .letter.numbrng    0.859    0.099    8.644    0.000    0.859    0.772
   .ct.drm.FA.Rl.R    0.563    0.074    7.587    0.000    0.563    0.519
   .schmtc.FA.Rl.R    0.754    0.091    8.269    0.000    0.754    0.800
   .objct.s.FA.R.R    0.283    0.075    3.802    0.000    0.283    0.242
   .abstrc..FA.R.R    0.678    0.079    8.566    0.000    0.678    0.642
    semantic.disc     0.424    0.075    5.674    0.000    1.000    1.000
    per.disc          0.744    0.109    6.851    0.000    1.000    1.000
    exec.func         0.081    0.033    2.460    0.014    1.000    1.000
   .false.memory      0.352    0.069    5.105    0.000    0.676    0.676

R-Square:
                   Estimate
    PPVT              0.611
    PPT               0.276
    MVPT              0.768
    OOO.High.Ht.Rt    0.423
    OOO.Size.Ht.Rt    0.182
    WCST.Prsv.Errr    0.143
    Arithmetic        0.513
    backward.span     0.354
    letter.numbrng    0.228
    ct.drm.FA.Rl.R    0.481
    schmtc.FA.Rl.R    0.200
    objct.s.FA.R.R    0.758
    abstrc..FA.R.R    0.358
    false.memory      0.324
## Inspecting latent correlations
lavInspect(strong.fit, "cor.lv")
$OA
              smntc. pr.dsc exc.fn fls.mm
semantic.disc  1.000                     
per.disc       0.649  1.000              
exec.func      0.735  0.773  1.000       
false.memory  -0.342 -0.528 -0.536  1.000

$YA
              smntc. pr.dsc exc.fn fls.mm
semantic.disc  1.000                     
per.disc       0.621  1.000              
exec.func      0.416  0.664  1.000       
false.memory  -0.440 -0.555 -0.396  1.000
## Saving Warning Messages

# Create an empty list to store warning messages
warnings.strong = list()

# Run the model using 'withCallingHandlers' to capture the warnings
warnings.model.strong = withCallingHandlers(
  expr = {
   sem(configural.model, 
                     missing = 'ML', 
                     data = data.z, 
                     group = 'Group', 
               group.equal = c("intercepts", "loadings"))
  },
  warning = function(w) {
    warnings.strong <<- c(warnings.strong, list(conditionMessage(w)))
    invokeRestart("muffleWarning")
  }
)

if (length(warnings.strong) > 0) {
# Combine the warning messages into a single character string separated by a semicolon
  combined.warning.strong = gsub("lavaan WARNING: ", "",
                            gsub("\\s{2,}", " ",
                                 paste(warnings.strong, 
                                       collapse = "; ")))
} else {
  # If no warnings, set combined.warning to "No warnings"
  combined.warning.strong = "No warnings."
}


## Saving fit measures

strong.measures = as.data.frame(fitMeasures(strong.fit))
strong.measures[, 1] = as.numeric(strong.measures[, 1])

rm(warnings.model.strong, warnings.strong)

strong Invariance Results:

  • Warnings: “No warnings.”
  • Chi-squared: X 2 (134) = 318.598, p = 0.000
  • CFI: 0.82
  • TLI: 0.79
  • RMSEA: 0.087 [0.075, 0.099] 90% CI
  • SRMR: 0.085

LRT Comparison:

lavTestLRT(weak.fit, strong.fit)

Chi-Squared Difference Test

            Df   AIC   BIC  Chisq Chisq diff  RMSEA Df diff Pr(>Chisq)    
weak.fit   125 11295 11618 181.44                                         
strong.fit 134 11414 11703 318.60     137.16 0.2801       9  < 2.2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
bic_to_bf(c(BIC(weak.fit), BIC(strong.fit)),
          denominator = BIC(weak.fit))
[1] 1.000000e+00 5.444911e-19
Weak Model Strong Model
CFI 0.945 0.82
TLI 0.931 0.79
RMSEA 0.05 [0.033, 0.065] 90% CI 0.087 [0.075, 0.099] 90% CI
SRMR 0.064 0.085

LRT test comparing weak and strong invariance models is highly significant, and model fit is much worse for the strong invariance model (CFIdiff = 0.125, RMSEAdiff = 0.037).

As such, we assume weak but not strong invariance, allowing for comparisons of factor variances and covariances, but not comparisons of factor means.

Identifying Problematic Intercepts

Identifying where problematic equality constraints are for model intercepts by iteratively equating intercepts and testing the decrease in fit from the weak model.

# PPVT

ppvt.strong.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates +
    object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ semantic.disc + exec.func + per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
  # Intercept constraints
    PPVT ~ c(v1,v1)*1
'

ppvt.strong.fit = sem(ppvt.strong.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

ppvt.strong.chi = anova(weak.fit, ppvt.strong.fit)

bf.ppvt.strong = bic_to_bf(c(BIC(weak.fit), BIC(ppvt.strong.fit)), 
                denominator = BIC(weak.fit))[2]


# PPT

ppt.strong.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates +
    object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ semantic.disc + exec.func + per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
  # Intercept constraints
    PPT ~ c(v1,v1)*1
'

ppt.strong.fit = sem(ppt.strong.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

ppt.strong.chi = anova(weak.fit, ppt.strong.fit)

bf.ppt.strong = bic_to_bf(c(BIC(weak.fit), BIC(ppt.strong.fit)), 
                denominator = BIC(weak.fit))[2]


# MVPT

mvpt.strong.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates +
    object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ semantic.disc + exec.func + per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
  # Intercept constraints
    MVPT ~ c(v1,v1)*1
'

mvpt.strong.fit = sem(mvpt.strong.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

mvpt.strong.chi = anova(weak.fit, mvpt.strong.fit)

bf.mvpt.strong = bic_to_bf(c(BIC(weak.fit), BIC(mvpt.strong.fit)), 
                denominator = BIC(weak.fit))[2]


# OOO - High

ooo.high.strong.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates +
    object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ semantic.disc + exec.func + per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
  # Intercept constraints
    OOO.High.Hit.Rate ~ c(v1,v1)*1
'

ooo.high.strong.fit = sem(ooo.high.strong.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

ooo.high.strong.chi = anova(weak.fit, ooo.high.strong.fit)

bf.ooo.high.strong = bic_to_bf(c(BIC(weak.fit), BIC(ooo.high.strong.fit)), 
                denominator = BIC(weak.fit))[2]

# OOO - Size

ooo.size.strong.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates +
    object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ semantic.disc + exec.func + per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
  # Intercept constraints
    OOO.Size.Hit.Rate ~ c(v1,v1)*1
'

ooo.size.strong.fit = sem(ooo.size.strong.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

ooo.size.strong.chi = anova(weak.fit, ooo.size.strong.fit)

bf.ooo.size.strong = bic_to_bf(c(BIC(weak.fit), BIC(ooo.size.strong.fit)), 
                denominator = BIC(weak.fit))[2]

# WCST

wcst.strong.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates +
    object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ semantic.disc + exec.func + per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
  # Intercept constraints
    WCST.Persev.Errors ~ c(v1,v1)*1
'

wcst.strong.fit = sem(wcst.strong.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

wcst.strong.chi = anova(weak.fit, wcst.strong.fit)

bf.wcst.strong = bic_to_bf(c(BIC(weak.fit), BIC(wcst.strong.fit)), 
                denominator = BIC(weak.fit))[2]

# Arithmetic

arithmetic.strong.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates +
    object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ semantic.disc + exec.func + per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
  # Intercept constraints
    Arithmetic ~ c(v1,v1)*1
'

arithmetic.strong.fit = sem(arithmetic.strong.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

arithmetic.strong.chi = anova(weak.fit, arithmetic.strong.fit)

bf.arithmetic.strong = bic_to_bf(c(BIC(weak.fit), BIC(arithmetic.strong.fit)), 
                denominator = BIC(weak.fit))[2]

# Backward Span

bs.strong.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates +
    object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ semantic.disc + exec.func + per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
  # Intercept constraints
    backward.span ~ c(v1,v1)*1
'

bs.strong.fit = sem(bs.strong.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

bs.strong.chi = anova(weak.fit, bs.strong.fit)

bf.bs.strong = bic_to_bf(c(BIC(weak.fit), BIC(bs.strong.fit)), 
                denominator = BIC(weak.fit))[2]


# Letter Numbering

ln.strong.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates +
    object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ semantic.disc + exec.func + per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
  # Intercept constraints
    letter.numbering ~ c(v1,v1)*1
'

ln.strong.fit = sem(ln.strong.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

ln.strong.chi = anova(weak.fit, ln.strong.fit)

bf.ln.strong = bic_to_bf(c(BIC(weak.fit), BIC(ln.strong.fit)), 
                denominator = BIC(weak.fit))[2]


# Categorical DRM

semantic.strong.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates +
    object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ semantic.disc + exec.func + per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
  # Intercept constraints
    cat.drm.FA.Related.Rates ~ c(v1,v1)*1
'

semantic.strong.fit = sem(semantic.strong.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

semantic.strong.chi = anova(weak.fit, semantic.strong.fit)

bf.semantic.strong = bic_to_bf(c(BIC(weak.fit), BIC(semantic.strong.fit)), 
                denominator = BIC(weak.fit))[2]


# Schematic

schematic.strong.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates +
    object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ semantic.disc + exec.func + per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
  # Intercept constraints
    cat.drm.FA.Related.Rates ~ c(v1,v1)*1
'

schematic.strong.fit = sem(schematic.strong.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

schematic.strong.chi = anova(weak.fit, schematic.strong.fit)

bf.schematic.strong = bic_to_bf(c(BIC(weak.fit), BIC(schematic.strong.fit)), 
                denominator = BIC(weak.fit))[2]


# Object Similarity

object.sim.strong.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates +
    object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ semantic.disc + exec.func + per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
  # Intercept constraints
    object.sim.FA.Related.Rates ~ c(v1,v1)*1
'

object.sim.strong.fit = sem(object.sim.strong.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

object.sim.strong.chi = anova(weak.fit, object.sim.strong.fit)

bf.object.sim.strong = bic_to_bf(c(BIC(weak.fit), BIC(object.sim.strong.fit)), 
                denominator = BIC(weak.fit))[2]



# Abstract Images

abstract.img.strong.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates +
    object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ semantic.disc + exec.func + per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
  # Intercept constraints
    abstract.img.FA.Related.Rates ~ c(v1,v1)*1
'

abstract.img.strong.fit = sem(abstract.img.strong.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

abstract.img.strong.chi = anova(weak.fit, abstract.img.strong.fit)

bf.abstract.img.strong = bic_to_bf(c(BIC(weak.fit), BIC(abstract.img.strong.fit)), 
                denominator = BIC(weak.fit))[2]
LRT BF10
PPVT X 2(1) = 297.778, p = 0.000 > 100,000
PPT X 2(1) = 155.931, p = 0.000 > 100,000
WCST X 2(1) = 15.025, p = 0.000 96.08
Arithmetic X 2(1) = 25.089, p = 0.000 1.4724085^{4}
Backward Span X 2 (1) = 1.807, p = 0.179 0.13
Letter Numbering X 2(1) = 5.787, p = 0.016 0.948
MVPT X 2(1) = 12.18, p = 0.000 23.17
OOO - High X 2(1) = 16.449, p = 0.000 195.872
OOO - Size X 2(1) = 4.479, p = 0.034 0.493
Categorical DRM FM X 2(1) = 6.264, p = 0.012 1.203
Schematic FM X 2(1) = 6.264, p = 0.012 1.203
Object Similarity FM X 2 (1) = 0.249, p = 0.618 0.059
Abstract Images FM X 2(1) = 19.886, p = 0.000 1092.259

Due to the high ratio of group varying intercepts, we chose not to pursue strong partial invariance.

Interpretation

oa.final.paths = semPaths(weak.fit, 
         layout = "tree", 
         include = 1,
         residuals = FALSE, 
         intercepts = FALSE,
         latents = c("semantic.disc", "exec.func", "per.disc",
                     "false.memory"), 
         whatLabels = "std", 
         fixedStyle = c("black", 1), 
         nodeLabels = c("PPVT", "PPT", "WCST", "Arithmetic", 
                        "Backward\nSpan", "Letter\nNumbering", 
                        "MVPT", "OOO - High", "OOO - Size", 
                        "Categorical\nDRM FM", "Schematic\nFM", "Object Sim\nFM",
                        "Abstract\nImages FM",
                        "Semantic\nDiscrimination", "Frontal\nFunctioning",
                        "Perceptual\nDiscrimination",
                        "False Memory\n(General)"), 
         sizeMan2 = 5, 
         sizeMan = 9,  
         sizeLat = 10,
         asize = 3.5, 
         esize = 2,
         border.width = 2,
         edge.label.cex = 0.5,
         edge.label.margin = 0.005,
         edge.color = "black", 
         edge.label.color = "black",
         fade = FALSE,
         gray = FALSE,
         font = 8,
         label.scale = FALSE,
         label.cex = 0.5,           
         curve = 1.5,           
         mar = c(3,2,3,2))
oa.graph = igraph::as.igraph(oa.final.paths)

edge.labels = igraph::E(oa.graph)$label

new.labels = paste(edge.labels, c("", "***", # semantic loadings
                                  "", "***", "***", # per loadings
                                  "", "***", "***", "***", # exec loadings
                                  "", "***", "***", "***", # FM loadings
                                  "", "", "", # regressions
                                  "***", # OOO cov
                                  "***", # semantic-perceptual cov
                                  "***", # semantic-Frontal cov
                                  "***"), #perceptual-Frontal cov
                   sep = "") 

oa.final.paths.labeled = semPaths(weak.fit, 
                          layout = "tree", 
                          include = 1,
                          residuals = FALSE, 
                          intercepts = FALSE,
                          latents = c("semantic.disc", "exec.func", "per.disc",
                                      "false.memory"), 
                          whatLabels = "std", 
                          fixedStyle = c("black", 1), 
                          nodeLabels = c("PPVT", "PPT", "WCST", "Arithmetic", 
                                         "Backward\nSpan", "Letter\nNumbering", 
                                         "MVPT", "OOO - High", "OOO - Size", 
                                         "Categorical\nDRM FM", "Schematic\nFM", "Object Sim.\nFM", "Abstract\nImages FM",
                                         "Semantic\nDiscrimination", "Frontal\nFunctioning", "Perceptual\nDiscrimination",
                                         "False Memory\n(General)"), 
                          sizeMan2 = 5, 
                          sizeMan = 9,  
                          sizeLat = 10,
                          asize = 3.5, 
                          esize = 2,
                          border.width = 2,
                          edge.label.cex = 0.5,
                          edge.label.margin = 0.005,
                          edge.color = "black", 
                          edge.label.color = "black",
                          fade = FALSE,
                          gray = FALSE,
                          font = 8,
                          label.scale = FALSE,
                          label.cex = 0.5,           
                          curve = 1.5,           
                          mar = c(3,2,3,2), 
                          edgeLabels = new.labels, 
                          title = FALSE)

title("Final Model (OA)", line = 3)

Significance is not calculated for the loading associated with the first indicator of each factor, as these indicators have fixed unstandardized values for the purpose of model identification. * p < 0.05. ** p < 0.01. *** p < 0.001.

ya.labels =  c("0.71", "0.63***", # semantic loadings
                                  "0.87", "0.64***", "0.49***", # per loadings
                                  "0.44", "0.69***", "0.60***", "0.53***", # execloadings
                                  "0.72", "0.45***", "0.86***", "0.61***", # FM loadings
                                  "-0.18", "-0.06", "-0.40*", # regressions
                                  "0.16", # OOO cov
                                  "0.67***", # semantic-perceptual cov
                                  "0.40**", # semantic-Frontal cov
                                  "0.67***") #perceptual-Frontal cov

ya.final.paths.labeled = semPaths(weak.fit, 
         layout = "tree", 
         include = 1,
         residuals = FALSE, 
         intercepts = FALSE,
         latents = c("semantic.disc", "exec.func", "per.disc",
                     "false.memory"), 
         whatLabels = "std", 
         fixedStyle = c("black", 1), 
         nodeLabels = c("PPVT", "PPT", "WCST", "Arithmetic", 
                        "Backward\nSpan", "Letter\nNumbering", 
                        "MVPT", "OOO - High", "OOO - Size", 
                        "Categorical\nDRM FM", "Schematic\nFM", "Object Sim.\nFM", "Abstract\nImages FM",
                        "Semantic\nDiscrimination", "Frontal\nFunctioning", "Perceptual\nDiscrimination",
                        "False Memory\n(General)"), 
         sizeMan2 = 5, 
         sizeMan = 9,  
         sizeLat = 10,
         asize = 3.5, 
         esize = 2,
         border.width = 2,
         edge.label.cex = 0.5,
         edge.label.margin = 0.005,
         edge.color = "black", 
         edge.label.color = "black",
         fade = FALSE,
         gray = FALSE,
         font = 8,
         label.scale = FALSE,
         label.cex = 0.5,           
         curve = 1.5,           
         mar = c(3,2,3,2),
         edgeLabels = ya.labels, 
         title = FALSE)

title("Final Model (YA)", line = 3)

Significance is not calculated for the loading associated with the first indicator of each factor, as these indicators have fixed unstandardized values for the purpose of model identification. * p < 0.05. ** p < 0.01. *** p < 0.001.

Conclusions

  • All factor loadings and factor covariances are significant
  • Perceptual discrimination is negatively related to false memory in YAs but not in OAs.
  • No other regression pathways are significant.
oa.r2 = as.data.frame(inspect(weak.fit, 'r2')$OA)
ya.r2 = as.data.frame(inspect(weak.fit, 'r2')$YA)

Collectively, frontal functioning, perceptual discrimination, and semantic discrimination explain 36.42% of the variance in false memory in OAs and 34.16% of the variance in false memory in YAs.

Moderation of Factor Variances

Testing for group differences in factor variances by applying equality constraints and testing reductions in fit.

# Semantic

semantic.var.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates +
    object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ semantic.disc + exec.func + per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
  # Variance Constraints
    semantic.disc ~~ c(v1,v1)*semantic.disc
'

semantic.var.fit = sem(semantic.var.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

semantic.var.chi = anova(weak.fit, semantic.var.fit)

bf.semantic.var = bic_to_bf(c(BIC(weak.fit), BIC(semantic.var.fit)), 
                        denominator = BIC(weak.fit))[2]

# Frontal

exec.var.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates +
    object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ semantic.disc + exec.func + per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
  # Variance Constraints
    exec.func ~~ c(v1,v1)*exec.func
'

exec.var.fit = sem(exec.var.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

exec.var.chi = anova(weak.fit, exec.var.fit)

bf.exec.var = bic_to_bf(c(BIC(weak.fit), BIC(exec.var.fit)), 
                        denominator = BIC(weak.fit))[2]

# Perceptual

per.var.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates +
    object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ semantic.disc + exec.func + per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
  # Variance Constraints
    per.disc ~~ c(v1,v1)*per.disc
'

per.var.fit = sem(per.var.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

per.var.chi = anova(weak.fit, per.var.fit)

bf.per.var = bic_to_bf(c(BIC(weak.fit), BIC(per.var.fit)), 
                        denominator = BIC(weak.fit))[2]

# False Memory

fm.var.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates +
    object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ semantic.disc + exec.func + per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
  # Variance Constraints
    false.memory ~~ c(v1,v1)*false.memory
'

fm.var.fit = sem(fm.var.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

fm.var.chi = anova(weak.fit, fm.var.fit)

bf.fm.var = bic_to_bf(c(BIC(weak.fit), BIC(fm.var.fit)), 
                        denominator = BIC(weak.fit))[2]
LRT BF10
Semantic Discrimination X 2(1) = 27.338, p = 0.000 4.5326163^{4}
Frontal Functioning X 2 (1) = 1.458, p = 0.227 0.109
Perceptual Discrimination X 2 (1) = 2.232, p = 0.135 0.16
False Memory X 2(1) = 5.067, p = 0.024 0.661
lavInspect(weak.fit, "cov.lv")
$OA
              smntc. pr.dsc exc.fn fls.mm
semantic.disc  0.064                     
per.disc       0.127  0.524              
exec.func      0.055  0.155  0.081       
false.memory  -0.050 -0.220 -0.087  0.314

$YA
              smntc. pr.dsc exc.fn fls.mm
semantic.disc  0.348                     
per.disc       0.341  0.740              
exec.func      0.078  0.189  0.110       
false.memory  -0.211 -0.366 -0.100  0.561

YAs (0.348) were significantly more variable for the semantic factor compared to OAs (0.064).

Unexpectedly, YAs were also more variable in terms of the false memory factor compared to OAs (0.369 vs. 0.200), though the BF for this comparison was more ambiguous.

OAs and YAs did not differ in their variability for either the perceptual or Frontal functioning factors.

Moderation of Regression Paths

Testing for group differences in regression paths by applying equality constraints and testing reductions in fit.

# Categorical DRM-FM

cat.drm.fm.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates +
    object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ c(v1,v1)*semantic.disc + exec.func + per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
'

cat.drm.fm.fit = sem(cat.drm.fm.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

cat.drm.fm.chi = anova(weak.fit, cat.drm.fm.fit)

bf.cat.drm.fm = bic_to_bf(c(BIC(weak.fit), BIC(cat.drm.fm.fit)), 
                             denominator = BIC(weak.fit))[2]


# Frontal-FM

exec.fm.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates +
    object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ semantic.disc + c(v1,v1)*exec.func + per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
'

exec.fm.fit = sem(exec.fm.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

exec.fm.chi = anova(weak.fit, exec.fm.fit)

bf.exec.fm = bic_to_bf(c(BIC(weak.fit), BIC(exec.fm.fit)), 
                             denominator = BIC(weak.fit))[2]


# Object Similarity-FM

object.sim.fm.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates +
    object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ semantic.disc + exec.func + c(v1,v1)*per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
'

object.sim.fm.fit = sem(object.sim.fm.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

object.sim.fm.chi = anova(weak.fit, object.sim.fm.fit)

bf.object.sim.fm = bic_to_bf(c(BIC(weak.fit), BIC(object.sim.fm.fit)), 
                             denominator = BIC(weak.fit))[2]
LRT BF10
Semantic to False Memory X 2 (1) = 1.698, p = 0.193 0.123
Frontal Functioning to False Memory X 2 (1) = 1.173, p = 0.279 0.094
Perceptual to False Memory X 2 (1) = 0.051, p = 0.822 0.054
round(lavInspect(weak.fit, "coef")$YA$beta[4, 1:3], 3) # YA Coefficients
semantic.disc      per.disc     exec.func 
       -0.229        -0.352        -0.145 
round(lavInspect(weak.fit, "coef")$OA$beta[4, 1:3], 3) # OA Coefficients
semantic.disc      per.disc     exec.func 
        0.562        -0.292        -0.896 

None of the regression paths differ between groups, providing evidence against moderation of the relationship between cognitive ability and false memory.

Due to group differences in variance, equality tests for covariance differences would be difficult to interpret. Instead, we can examine the factor correlations below:

round(as.data.frame(lavInspect(weak.fit, "cor.lv")[1]), 3)[1:3, 1:3]
              OA.semantic.disc OA.per.disc OA.exec.func
semantic.disc            1.000       0.691        0.756
per.disc                 0.691       1.000        0.749
exec.func                0.756       0.749        1.000
round(as.data.frame(lavInspect(weak.fit, "cor.lv")[2]), 3)[1:3, 1:3]
              YA.semantic.disc YA.per.disc YA.exec.func
semantic.disc            1.000       0.671        0.400
per.disc                 0.671       1.000        0.665
exec.func                0.400       0.665        1.000

Frontal functioning is more strongly correlated with semantic and perceptual discrimination in OAs, providing additional evidence of age-related de-differentiation.

Factor Score Covariance and Regression Plots

factor.scores = lavPredict(weak.fit, type = "lv", method = "regression")

oa.factor.scores = as.data.frame(factor.scores$OA)
ya.factor.scores = as.data.frame(factor.scores$YA)

oa.factor.scores$Group = rep("OA", nrow(oa.factor.scores))
ya.factor.scores$Group = rep("YA", nrow(ya.factor.scores))

factor.scores = rbind(oa.factor.scores, ya.factor.scores)

factor.scores$Group = as.factor(factor.scores$Group)
semantic.exec.plot = ggplot(data = factor.scores, aes(x = exec.func, y =
                                                      semantic.disc, group = 
                                        Group, color = Group)) +
  geom_point(alpha = 0.5, size = 0.8, show.legend = TRUE) +
  geom_smooth(method = 'lm', se = FALSE, linewidth = 1.5, show.legend = FALSE) +
  labs(x = 'Frontal Functioning', y = 'Semantic Discrimination') +
     theme_classic() +
  theme(legend.position = 'bottom',
        legend.text = element_text(color = "white", size = 3),
        legend.title = element_text(color = "white", size = 3),
        legend.key = element_rect(fill = "white", color = "white"),
        text = element_text(size = 10, 
                                         family = "serif", 
                                         color = "black"),
                     axis.text = element_text(color = "black"),
    ) + 
    scale_color_discrete(guide = guide_legend(override.aes = list(color = "white"))
    )

per.exec.plot = ggplot(data = factor.scores, aes(x = exec.func, y =
                                                      per.disc, group = 
                                        Group, color = Group)) +
  geom_point(alpha = 0.5, size = 0.8, show.legend = TRUE) +
  geom_smooth(method = 'lm', se = FALSE, linewidth = 1.5, show.legend = FALSE) +
  labs(x = 'Frontal Functioning', y = 'Perceptual Discrimination') +
    theme_classic() +
  theme(legend.position = 'bottom', 
        text = element_text(size = 10, 
                                         family = "serif", 
                                         color = "black"),
                     axis.text = element_text(color = "black"), 
        legend.title = element_blank(), 
               legend.text = element_text(size = 8), 
        )  +
  guides(color = guide_legend(override.aes = list(size = 5)))


per.semantic.plot = ggplot(data = factor.scores, aes(x = per.disc, y =
                                                      semantic.disc, group = 
                                        Group, color = Group)) +
  geom_point(alpha = 0.5, size = 0.8, show.legend = TRUE) +
  geom_smooth(method = 'lm', se = FALSE, linewidth = 1.5, show.legend = FALSE) +
  labs(x = 'Perceptual Discrimination', y = 'Semantic Discrimination') +
     theme_classic() +
  theme(legend.position = 'bottom',
        legend.text = element_text(color = "white", size = 3),
        legend.title = element_text(color = "white", size = 3),
        legend.key = element_rect(fill = "white", color = "white"), 
        text = element_text(size = 10, 
                                         family = "serif", 
                                         color = "black"),
                     axis.text = element_text(color = "black"), 
    ) + 
    scale_color_discrete(
        guide = guide_legend(override.aes = list(color = "white"))
    ) 

covariance.plot = plot_grid(semantic.exec.plot, per.exec.plot, per.semantic.plot, 
                                  #labels = c('A', 'B', 'C'), 
                                  ncol = 3, nrow = 1,
                                  label_size = 10)
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'
ggsave(covariance.plot, 
       filename = 'Factor Covariance Plot.png', 
       height = 3, width = 7, units = 'in', dpi = 600)
covariance.plot

object.sim.fm.plot = ggplot(data = factor.scores, aes(x = per.disc, y =
                                                      false.memory, group = 
                                        Group, color = Group)) +
  geom_point(alpha = 0.5, size = 0.8, show.legend = TRUE) +
  geom_smooth(method = 'lm', se = FALSE, linewidth = 1.5, show.legend = FALSE) +
  labs(x = 'Perceptual Discrimination', y = 'False Memory') +
     theme_classic() +
  theme(legend.position = 'bottom',
        legend.text = element_text(color = "white", size = 3),
        legend.title = element_text(color = "white", size = 3),
        legend.key = element_rect(fill = "white", color = "white"),
        text = element_text(size = 10, 
                                         family = "serif", 
                                         color = "black"),
                     axis.text = element_text(color = "black"), 
    ) + 
    scale_color_discrete(guide = guide_legend(override.aes = list(color = "white"))
    )

cat.drm.fm.plot = ggplot(data = factor.scores, aes(x = semantic.disc, y =
                                                      false.memory, group = 
                                        Group, color = Group)) +
  geom_point(alpha = 0.5, size = 0.8, show.legend = TRUE) +
  geom_smooth(method = 'lm', se = FALSE, linewidth = 1.5, show.legend = FALSE) +
  labs(x = 'Semantic Discrimination', y = 'False Memory') +
    theme_classic() +
  theme(legend.position = 'bottom', 
        text = element_text(size = 10, 
                                         family = "serif", 
                                         color = "black"),
                     axis.text = element_text(color = "black"), 
        legend.title = element_blank(), 
               legend.text = element_text(size = 8), 
        )  +
  guides(color = guide_legend(override.aes = list(size = 5)))


exec.fm.plot = ggplot(data = factor.scores, aes(x = exec.func, y =
                                                      false.memory, group = 
                                        Group, color = Group)) +
  geom_point(alpha = 0.5, size = 0.8, show.legend = TRUE) +
  geom_smooth(method = 'lm', se = FALSE, linewidth = 1.5, show.legend = FALSE) +
  labs(x = 'Frontal Functioning', y = 'False Memory') +
     theme_classic() +
  theme(legend.position = 'bottom',
        legend.text = element_text(color = "white", size = 3),
        legend.title = element_text(color = "white", size = 3),
        legend.key = element_rect(fill = "white", color = "white"), 
        text = element_text(size = 10, 
                                         family = "serif", 
                                         color = "black"),
                     axis.text = element_text(color = "black"), 
    ) + 
    scale_color_discrete(
        guide = guide_legend(override.aes = list(color = "white"))
    ) 

regression.plot = plot_grid(exec.fm.plot, cat.drm.fm.plot, object.sim.fm.plot, 
                                  #labels = c('A', 'B', 'C'), 
                                  ncol = 3, nrow = 1,
                                  label_size = 10)
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'
ggsave(regression.plot, 
       filename = 'Factor Regression Plot.png', 
       height = 3, width = 7, units = 'in', dpi = 600)
regression.plot

Exploratory Analysis of Individual Regression Effects

Results of the final (weak invariance) SEM do not provide much evidence of effects of cognitive abilities on overall FM. Given that the three cognitive ability constructs are highly correlated (0.400 - 0.756, with higher correlations in OAs), this may be due to suppression. In other words, it may be that the three cognitive abilities have significant but redundant negative effects on FM.

This is tested in three exploratory SEMs below. In each, FM is regressed on only a single cognitive ability at a time.

# Semantic

cat.drm.fm.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates + object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ semantic.disc
'

cat.drm.fm.fit = sem(cat.drm.fm.model, 
                     missing = 'ML', 
                     data = data.z, 
                     group = 'Group', 
               group.equal = "loadings")

summary(cat.drm.fm.fit, 
        fit.measures = TRUE, 
        standardized = TRUE, 
        rsquare = TRUE)
lavaan 0.6.17 ended normally after 49 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                        38
  Number of equality constraints                     4

  Number of observations per group:                   
    OA                                             152
    YA                                             211
  Number of missing patterns per group:               
    OA                                               8
    YA                                              13

Model Test User Model:
                                                      
  Test statistic                                21.402
  Degrees of freedom                                20
  P-value (Chi-square)                           0.374
  Test statistic for each group:
    OA                                          15.071
    YA                                           6.330

Model Test Baseline Model:

  Test statistic                               391.803
  Degrees of freedom                                30
  P-value                                        0.000

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    0.996
  Tucker-Lewis Index (TLI)                       0.994
                                                      
  Robust Comparative Fit Index (CFI)             0.998
  Robust Tucker-Lewis Index (TLI)                0.997

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -2370.070
  Loglikelihood unrestricted model (H1)      -2359.370
                                                      
  Akaike (AIC)                                4808.141
  Bayesian (BIC)                              4940.550
  Sample-size adjusted Bayesian (SABIC)       4832.683

Root Mean Square Error of Approximation:

  RMSEA                                          0.020
  90 Percent confidence interval - lower         0.000
  90 Percent confidence interval - upper         0.068
  P-value H_0: RMSEA <= 0.050                    0.807
  P-value H_0: RMSEA >= 0.080                    0.014
                                                      
  Robust RMSEA                                   0.014
  90 Percent confidence interval - lower         0.000
  90 Percent confidence interval - upper         0.074
  P-value H_0: Robust RMSEA <= 0.050             0.779
  P-value H_0: Robust RMSEA >= 0.080             0.028

Standardized Root Mean Square Residual:

  SRMR                                           0.044

Parameter Estimates:

  Standard errors                             Standard
  Information                                 Observed
  Observed information based on                Hessian


Group 1 [OA]:

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  semantic.disc =~                                                      
    PPVT              1.000                               0.232    0.651
    PPT     (.p2.)    1.101    0.260    4.238    0.000    0.255    0.493
  false.memory =~                                                       
    c..FA.R           1.000                               0.527    0.569
    s.FA.R. (.p4.)    0.620    0.110    5.650    0.000    0.327    0.317
    o..FA.R (.p5.)    1.433    0.152    9.446    0.000    0.755    0.874
    a..FA.R (.p6.)    0.874    0.100    8.697    0.000    0.461    0.501

Regressions:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  false.memory ~                                                        
    semantic.disc    -0.756    0.318   -2.376    0.017   -0.333   -0.333

Intercepts:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .PPVT              0.874    0.029   30.239    0.000    0.874    2.453
   .PPT               0.654    0.042   15.572    0.000    0.654    1.263
   .ct.drm.FA.Rl.R   -0.148    0.076   -1.944    0.052   -0.148   -0.159
   .schmtc.FA.Rl.R    0.076    0.101    0.754    0.451    0.076    0.074
   .objct.s.FA.R.R    0.032    0.071    0.445    0.657    0.032    0.036
   .abstrc..FA.R.R    0.263    0.075    3.505    0.000    0.263    0.286

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .PPVT              0.073    0.020    3.633    0.000    0.073    0.577
   .PPT               0.203    0.031    6.617    0.000    0.203    0.757
   .ct.drm.FA.Rl.R    0.580    0.079    7.376    0.000    0.580    0.676
   .schmtc.FA.Rl.R    0.958    0.139    6.913    0.000    0.958    0.900
   .objct.s.FA.R.R    0.177    0.079    2.234    0.026    0.177    0.237
   .abstrc..FA.R.R    0.635    0.079    7.999    0.000    0.635    0.749
    semantic.disc     0.054    0.020    2.641    0.008    1.000    1.000
   .false.memory      0.247    0.055    4.525    0.000    0.889    0.889

R-Square:
                   Estimate
    PPVT              0.423
    PPT               0.243
    ct.drm.FA.Rl.R    0.324
    schmtc.FA.Rl.R    0.100
    objct.s.FA.R.R    0.763
    abstrc..FA.R.R    0.251
    false.memory      0.111


Group 2 [YA]:

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  semantic.disc =~                                                      
    PPVT              1.000                               0.583    0.712
    PPT     (.p2.)    1.101    0.260    4.238    0.000    0.642    0.648
  false.memory =~                                                       
    c..FA.R           1.000                               0.685    0.664
    s.FA.R. (.p4.)    0.620    0.110    5.650    0.000    0.425    0.438
    o..FA.R (.p5.)    1.433    0.152    9.446    0.000    0.982    0.909
    a..FA.R (.p6.)    0.874    0.100    8.697    0.000    0.599    0.594

Regressions:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  false.memory ~                                                        
    semantic.disc    -0.561    0.150   -3.749    0.000   -0.477   -0.477

Intercepts:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .PPVT             -0.653    0.057  -11.481    0.000   -0.653   -0.798
   .PPT              -0.471    0.068   -6.910    0.000   -0.471   -0.476
   .ct.drm.FA.Rl.R    0.110    0.072    1.522    0.128    0.110    0.106
   .schmtc.FA.Rl.R   -0.061    0.077   -0.788    0.431   -0.061   -0.062
   .objct.s.FA.R.R   -0.014    0.075   -0.183    0.855   -0.014   -0.013
   .abstrc..FA.R.R   -0.201    0.071   -2.847    0.004   -0.201   -0.200

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .PPVT              0.330    0.082    4.012    0.000    0.330    0.493
   .PPT               0.568    0.113    5.020    0.000    0.568    0.580
   .ct.drm.FA.Rl.R    0.595    0.073    8.135    0.000    0.595    0.559
   .schmtc.FA.Rl.R    0.760    0.092    8.294    0.000    0.760    0.808
   .objct.s.FA.R.R    0.203    0.082    2.492    0.013    0.203    0.174
   .abstrc..FA.R.R    0.659    0.075    8.769    0.000    0.659    0.648
    semantic.disc     0.340    0.092    3.713    0.000    1.000    1.000
   .false.memory      0.363    0.076    4.790    0.000    0.772    0.772

R-Square:
                   Estimate
    PPVT              0.507
    PPT               0.420
    ct.drm.FA.Rl.R    0.441
    schmtc.FA.Rl.R    0.192
    objct.s.FA.R.R    0.826
    abstrc..FA.R.R    0.352
    false.memory      0.228
# Perceptual

object.sim.fm.model = '
  # measurement model
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates + object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
'

object.sim.fm.fit = sem(object.sim.fm.model, 
                     missing = 'ML', 
                     data = data.z, 
                     group = 'Group', 
               group.equal = "loadings")

summary(object.sim.fm.fit, 
        fit.measures = TRUE, 
        standardized = TRUE, 
        rsquare = TRUE)
lavaan 0.6.17 ended normally after 35 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                        46
  Number of equality constraints                     5

  Number of observations per group:                   
    OA                                             152
    YA                                             211
  Number of missing patterns per group:               
    OA                                               8
    YA                                              10

Model Test User Model:
                                                      
  Test statistic                                36.471
  Degrees of freedom                                29
  P-value (Chi-square)                           0.160
  Test statistic for each group:
    OA                                          19.224
    YA                                          17.247

Model Test Baseline Model:

  Test statistic                               609.416
  Degrees of freedom                                42
  P-value                                        0.000

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    0.987
  Tucker-Lewis Index (TLI)                       0.981
                                                      
  Robust Comparative Fit Index (CFI)             0.984
  Robust Tucker-Lewis Index (TLI)                0.976

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -3068.482
  Loglikelihood unrestricted model (H1)      -3050.246
                                                      
  Akaike (AIC)                                6218.963
  Bayesian (BIC)                              6378.634
  Sample-size adjusted Bayesian (SABIC)       6248.559

Root Mean Square Error of Approximation:

  RMSEA                                          0.038
  90 Percent confidence interval - lower         0.000
  90 Percent confidence interval - upper         0.072
  P-value H_0: RMSEA <= 0.050                    0.686
  P-value H_0: RMSEA >= 0.080                    0.017
                                                      
  Robust RMSEA                                   0.043
  90 Percent confidence interval - lower         0.000
  90 Percent confidence interval - upper         0.080
  P-value H_0: Robust RMSEA <= 0.050             0.581
  P-value H_0: Robust RMSEA >= 0.080             0.048

Standardized Root Mean Square Residual:

  SRMR                                           0.049

Parameter Estimates:

  Standard errors                             Standard
  Information                                 Observed
  Observed information based on                Hessian


Group 1 [OA]:

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  per.disc =~                                                           
    MVPT              1.000                               0.679    0.686
    OOO.H.H (.p2.)    0.800    0.110    7.263    0.000    0.543    0.564
    OOO.S.H (.p3.)    0.703    0.111    6.312    0.000    0.477    0.568
  false.memory =~                                                       
    c..FA.R           1.000                               0.559    0.604
    s.FA.R. (.p5.)    0.583    0.104    5.608    0.000    0.326    0.314
    o..FA.R (.p6.)    1.256    0.123   10.226    0.000    0.703    0.815
    a..FA.R (.p7.)    0.839    0.096    8.757    0.000    0.469    0.511

Regressions:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  false.memory ~                                                        
    per.disc         -0.459    0.117   -3.935    0.000   -0.556   -0.556

Covariances:
                       Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
 .OOO.High.Hit.Rate ~~                                                      
   .OOO.Size.Ht.Rt        0.203    0.069    2.970    0.003    0.203    0.370

Intercepts:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .MVPT             -0.213    0.080   -2.660    0.008   -0.213   -0.216
   .OOO.High.Ht.Rt   -0.248    0.078   -3.178    0.001   -0.248   -0.258
   .OOO.Size.Ht.Rt    0.125    0.068    1.838    0.066    0.125    0.149
   .ct.drm.FA.Rl.R   -0.150    0.076   -1.977    0.048   -0.150   -0.162
   .schmtc.FA.Rl.R    0.077    0.102    0.759    0.448    0.077    0.075
   .objct.s.FA.R.R    0.036    0.071    0.507    0.612    0.036    0.042
   .abstrc..FA.R.R    0.263    0.075    3.520    0.000    0.263    0.287

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .MVPT              0.518    0.104    4.983    0.000    0.518    0.529
   .OOO.High.Ht.Rt    0.632    0.096    6.574    0.000    0.632    0.682
   .OOO.Size.Ht.Rt    0.479    0.074    6.432    0.000    0.479    0.678
   .ct.drm.FA.Rl.R    0.545    0.077    7.083    0.000    0.545    0.635
   .schmtc.FA.Rl.R    0.971    0.141    6.876    0.000    0.971    0.901
   .objct.s.FA.R.R    0.249    0.071    3.493    0.000    0.249    0.335
   .abstrc..FA.R.R    0.622    0.079    7.841    0.000    0.622    0.738
    per.disc          0.461    0.109    4.206    0.000    1.000    1.000
   .false.memory      0.216    0.054    4.000    0.000    0.690    0.690

R-Square:
                   Estimate
    MVPT              0.471
    OOO.High.Ht.Rt    0.318
    OOO.Size.Ht.Rt    0.322
    ct.drm.FA.Rl.R    0.365
    schmtc.FA.Rl.R    0.099
    objct.s.FA.R.R    0.665
    abstrc..FA.R.R    0.262
    false.memory      0.310


Group 2 [YA]:

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  per.disc =~                                                           
    MVPT              1.000                               0.820    0.838
    OOO.H.H (.p2.)    0.800    0.110    7.263    0.000    0.656    0.666
    OOO.S.H (.p3.)    0.703    0.111    6.312    0.000    0.577    0.530
  false.memory =~                                                       
    c..FA.R           1.000                               0.741    0.716
    s.FA.R. (.p5.)    0.583    0.104    5.608    0.000    0.432    0.446
    o..FA.R (.p6.)    1.256    0.123   10.226    0.000    0.930    0.857
    a..FA.R (.p7.)    0.839    0.096    8.757    0.000    0.621    0.614

Regressions:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  false.memory ~                                                        
    per.disc         -0.524    0.097   -5.403    0.000   -0.580   -0.580

Covariances:
                       Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
 .OOO.High.Hit.Rate ~~                                                      
   .OOO.Size.Ht.Rt        0.079    0.069    1.150    0.250    0.079    0.117

Intercepts:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .MVPT              0.154    0.067    2.280    0.023    0.154    0.157
   .OOO.High.Ht.Rt    0.179    0.068    2.635    0.008    0.179    0.181
   .OOO.Size.Ht.Rt   -0.090    0.075   -1.204    0.229   -0.090   -0.083
   .ct.drm.FA.Rl.R    0.109    0.072    1.517    0.129    0.109    0.106
   .schmtc.FA.Rl.R   -0.061    0.077   -0.793    0.428   -0.061   -0.063
   .objct.s.FA.R.R   -0.017    0.075   -0.230    0.818   -0.017   -0.016
   .abstrc..FA.R.R   -0.202    0.071   -2.856    0.004   -0.202   -0.200

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .MVPT              0.286    0.091    3.144    0.002    0.286    0.298
   .OOO.High.Ht.Rt    0.540    0.075    7.161    0.000    0.540    0.556
   .OOO.Size.Ht.Rt    0.852    0.102    8.374    0.000    0.852    0.719
   .ct.drm.FA.Rl.R    0.521    0.070    7.395    0.000    0.521    0.487
   .schmtc.FA.Rl.R    0.751    0.091    8.278    0.000    0.751    0.801
   .objct.s.FA.R.R    0.313    0.073    4.302    0.000    0.313    0.266
   .abstrc..FA.R.R    0.636    0.073    8.746    0.000    0.636    0.622
    per.disc          0.673    0.122    5.495    0.000    1.000    1.000
   .false.memory      0.364    0.070    5.186    0.000    0.663    0.663

R-Square:
                   Estimate
    MVPT              0.702
    OOO.High.Ht.Rt    0.444
    OOO.Size.Ht.Rt    0.281
    ct.drm.FA.Rl.R    0.513
    schmtc.FA.Rl.R    0.199
    objct.s.FA.R.R    0.734
    abstrc..FA.R.R    0.378
    false.memory      0.337
# Semantic

exec.fm.model = '
  # measurement model
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates + object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ exec.func
'

exec.fm.fit = sem(exec.fm.model, 
                     missing = 'ML', 
                     data = data.z, 
                     group = 'Group', 
               group.equal = "loadings")

summary(exec.fm.fit, 
        fit.measures = TRUE, 
        standardized = TRUE, 
        rsquare = TRUE)
lavaan 0.6.17 ended normally after 51 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                        50
  Number of equality constraints                     6

  Number of observations per group:                   
    OA                                             152
    YA                                             211
  Number of missing patterns per group:               
    OA                                              10
    YA                                              14

Model Test User Model:
                                                      
  Test statistic                                54.735
  Degrees of freedom                                44
  P-value (Chi-square)                           0.129
  Test statistic for each group:
    OA                                          28.740
    YA                                          25.995

Model Test Baseline Model:

  Test statistic                               524.070
  Degrees of freedom                                56
  P-value                                        0.000

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    0.977
  Tucker-Lewis Index (TLI)                       0.971
                                                      
  Robust Comparative Fit Index (CFI)             0.976
  Robust Tucker-Lewis Index (TLI)                0.969

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -3586.176
  Loglikelihood unrestricted model (H1)      -3558.809
                                                      
  Akaike (AIC)                                7260.353
  Bayesian (BIC)                              7431.706
  Sample-size adjusted Bayesian (SABIC)       7292.114

Root Mean Square Error of Approximation:

  RMSEA                                          0.037
  90 Percent confidence interval - lower         0.000
  90 Percent confidence interval - upper         0.065
  P-value H_0: RMSEA <= 0.050                    0.752
  P-value H_0: RMSEA >= 0.080                    0.004
                                                      
  Robust RMSEA                                   0.039
  90 Percent confidence interval - lower         0.000
  90 Percent confidence interval - upper         0.070
  P-value H_0: Robust RMSEA <= 0.050             0.688
  P-value H_0: Robust RMSEA >= 0.080             0.011

Standardized Root Mean Square Residual:

  SRMR                                           0.050

Parameter Estimates:

  Standard errors                             Standard
  Information                                 Observed
  Observed information based on                Hessian


Group 1 [OA]:

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  exec.func =~                                                          
    WCST.P.           1.000                               0.243    0.201
    Arthmtc (.p2.)    2.171    0.467    4.645    0.000    0.526    0.574
    bckwrd. (.p3.)    2.313    0.506    4.571    0.000    0.561    0.559
    lttr.nm (.p4.)    2.090    0.458    4.560    0.000    0.507    0.564
  false.memory =~                                                       
    c..FA.R           1.000                               0.551    0.603
    s.FA.R. (.p6.)    0.603    0.105    5.772    0.000    0.333    0.321
    o..FA.R (.p7.)    1.275    0.131    9.754    0.000    0.702    0.809
    a..FA.R (.p8.)    0.836    0.097    8.577    0.000    0.461    0.502

Regressions:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  false.memory ~                                                        
    exec.func        -1.250    0.398   -3.141    0.002   -0.550   -0.550

Intercepts:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .WCST.Prsv.Errr   -0.258    0.101   -2.570    0.010   -0.258   -0.214
   .Arithmetic        0.299    0.074    4.021    0.000    0.299    0.326
   .backward.span     0.084    0.081    1.031    0.303    0.084    0.084
   .letter.numbrng   -0.144    0.073   -1.979    0.048   -0.144   -0.160
   .ct.drm.FA.Rl.R   -0.150    0.075   -1.998    0.046   -0.150   -0.164
   .schmtc.FA.Rl.R    0.075    0.102    0.735    0.463    0.075    0.072
   .objct.s.FA.R.R    0.031    0.071    0.442    0.658    0.031    0.036
   .abstrc..FA.R.R    0.263    0.075    3.508    0.000    0.263    0.286

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .WCST.Prsv.Errr    1.398    0.169    8.297    0.000    1.398    0.960
   .Arithmetic        0.564    0.085    6.660    0.000    0.564    0.670
   .backward.span     0.690    0.100    6.889    0.000    0.690    0.687
   .letter.numbrng    0.551    0.081    6.844    0.000    0.551    0.682
   .ct.drm.FA.Rl.R    0.532    0.077    6.907    0.000    0.532    0.637
   .schmtc.FA.Rl.R    0.960    0.140    6.861    0.000    0.960    0.897
   .objct.s.FA.R.R    0.260    0.075    3.478    0.001    0.260    0.345
   .abstrc..FA.R.R    0.630    0.080    7.851    0.000    0.630    0.748
    exec.func         0.059    0.026    2.240    0.025    1.000    1.000
   .false.memory      0.212    0.053    3.989    0.000    0.697    0.697

R-Square:
                   Estimate
    WCST.Prsv.Errr    0.040
    Arithmetic        0.330
    backward.span     0.313
    letter.numbrng    0.318
    ct.drm.FA.Rl.R    0.363
    schmtc.FA.Rl.R    0.103
    objct.s.FA.R.R    0.655
    abstrc..FA.R.R    0.252
    false.memory      0.303


Group 2 [YA]:

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  exec.func =~                                                          
    WCST.P.           1.000                               0.292    0.386
    Arthmtc (.p2.)    2.171    0.467    4.645    0.000    0.634    0.634
    bckwrd. (.p3.)    2.313    0.506    4.571    0.000    0.675    0.680
    lttr.nm (.p4.)    2.090    0.458    4.560    0.000    0.610    0.581
  false.memory =~                                                       
    c..FA.R           1.000                               0.737    0.708
    s.FA.R. (.p6.)    0.603    0.105    5.772    0.000    0.445    0.459
    o..FA.R (.p7.)    1.275    0.131    9.754    0.000    0.939    0.867
    a..FA.R (.p8.)    0.836    0.097    8.577    0.000    0.616    0.609

Regressions:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  false.memory ~                                                        
    exec.func        -1.008    0.305   -3.304    0.001   -0.399   -0.399

Intercepts:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .WCST.Prsv.Errr    0.182    0.053    3.438    0.001    0.182    0.240
   .Arithmetic       -0.218    0.069   -3.159    0.002   -0.218   -0.218
   .backward.span    -0.060    0.068   -0.884    0.377   -0.060   -0.061
   .letter.numbrng    0.104    0.072    1.436    0.151    0.104    0.099
   .ct.drm.FA.Rl.R    0.106    0.073    1.454    0.146    0.106    0.101
   .schmtc.FA.Rl.R   -0.069    0.077   -0.894    0.371   -0.069   -0.071
   .objct.s.FA.R.R   -0.020    0.075   -0.268    0.789   -0.020   -0.019
   .abstrc..FA.R.R   -0.205    0.071   -2.886    0.004   -0.205   -0.202

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .WCST.Prsv.Errr    0.487    0.052    9.418    0.000    0.487    0.851
   .Arithmetic        0.597    0.080    7.415    0.000    0.597    0.598
   .backward.span     0.529    0.081    6.561    0.000    0.529    0.537
   .letter.numbrng    0.733    0.091    8.071    0.000    0.733    0.663
   .ct.drm.FA.Rl.R    0.541    0.073    7.447    0.000    0.541    0.499
   .schmtc.FA.Rl.R    0.741    0.090    8.206    0.000    0.741    0.789
   .objct.s.FA.R.R    0.290    0.078    3.727    0.000    0.290    0.248
   .abstrc..FA.R.R    0.644    0.074    8.746    0.000    0.644    0.629
    exec.func         0.085    0.033    2.553    0.011    1.000    1.000
   .false.memory      0.456    0.086    5.313    0.000    0.841    0.841

R-Square:
                   Estimate
    WCST.Prsv.Errr    0.149
    Arithmetic        0.402
    backward.span     0.463
    letter.numbrng    0.337
    ct.drm.FA.Rl.R    0.501
    schmtc.FA.Rl.R    0.211
    objct.s.FA.R.R    0.752
    abstrc..FA.R.R    0.371
    false.memory      0.159

These analyses reveal that the unique effects of all three cognitive factors on overall FM are significant. However, these effects are suppressed when all three are included in a single model. Substantively, this means that the effects of these factors on FM are redundant with one another.

Applying equality constraints to test whether there is moderation of the unique regression effects:

# Categorical DRM-FM

cat.drm.fm.indiv.model = '
  # measurement model
    semantic.disc =~ PPVT + PPT
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates + object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ c(v1,v1)*semantic.disc
'

cat.drm.fm.indiv.fit = sem(cat.drm.fm.indiv.model, 
                     missing = 'ML', 
                     data = data.z, 
                     group = 'Group', 
               group.equal = "loadings")

cat.drm.fm.indiv.chi = anova(cat.drm.fm.fit, cat.drm.fm.indiv.fit)

bf.cat.drm.fm.indiv = bic_to_bf(c(BIC(cat.drm.fm.fit), 
                                   BIC(cat.drm.fm.indiv.fit)), 
                                 denominator = BIC(cat.drm.fm.fit))[2]


# Frontal-FM

exec.fm.indiv.model = '
  # measurement model
    exec.func =~ WCST.Persev.Errors + Arithmetic + backward.span + letter.numbering
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates + object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ c(v1,v1)*exec.func
'

exec.fm.indiv.fit = sem(exec.fm.indiv.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

exec.fm.indiv.chi = anova(exec.fm.fit, exec.fm.indiv.fit)

bf.exec.fm.indiv = bic_to_bf(c(BIC(exec.fm.fit), BIC(exec.fm.indiv.fit)), 
                             denominator = BIC(exec.fm.fit))[2]

# Object Similarity-FM

object.sim.fm.indiv.model = '
  # measurement model
    per.disc =~ MVPT + OOO.High.Hit.Rate + OOO.Size.Hit.Rate
    false.memory =~ cat.drm.FA.Related.Rates + schematic.FA.Related.Rates + object.sim.FA.Related.Rates + abstract.img.FA.Related.Rates
  # regressions
    false.memory ~ c(v1,v1)*per.disc
  # residual correlations
    OOO.High.Hit.Rate ~~ OOO.Size.Hit.Rate
'

object.sim.fm.indiv.fit = sem(object.sim.fm.indiv.model, 
                     missing = "ML", 
                     data = data.z, 
                     group = "Group", 
               group.equal = c("loadings"))

object.sim.fm.indiv.chi = anova(object.sim.fm.fit, object.sim.fm.indiv.fit)

bf.object.sim.fm.indiv = bic_to_bf(c(BIC(object.sim.fm.fit), BIC(object.sim.fm.indiv.fit)), 
                            denominator = BIC(object.sim.fm.fit))[2]
LRT BF10
Semantic to False Memory X 2 (1) = 0.362, p = 0.547 0.063
Frontal Functioning to False Memory X 2 (1) = 0.434, p = 0.510 0.065
Perceptual to False Memory X 2 (1) = 0.246, p = 0.620 0.059

There is no evidence of moderation, suggesting that the individual effects of the three cognitive abilities on FM do not depend on age.