Hi all,
I am trying to run an RI-CLPM in blavaan and have a handful of questions. I'll start with the "simplest", regarding the fit indices. Based on the 2020 paper, I know that gammahat and BCFI are the best to use, but I don't know if I should be concerned about the considerably "outside the cutoff" values for BRMSEA, adj gammahat, and BTLI. For model evaluation, how should I incorporate those other indices with the good-to-acceptable BCFI and gammahat values? For context, the sample size is ~8,000 with all variables having between 3 and 6 waves of data. Below is also the structure of my current model, which includes a mix of latent and observed variables in the cross-lagged paths, though other models I run with only observed variables have similar issues. Thanks so much.
Posterior summary statistics and highest posterior density (HPD)
90% credible intervals for devm-based fit indices:
EAP Median MAP SD lower upper
BRMSEA 0.097 0.097 0.097 0.000 0.096 0.097
BGammaHat 0.975 0.975 0.975 0.000 0.975 0.976
adjBGammaHat 0.754 0.754 0.754 0.002 0.751 0.757
BMc 0.859 0.859 0.859 0.001 0.857 0.860
BCFI 0.941 0.941 0.941 0.000 0.940 0.942
BTLI 0.683 0.683 0.684 0.002 0.680 0.687
BNFI 0.940 0.940 0.940 0.000 0.940 0.941
ri_clpm_model = '
########################################
# Mediator Measurement Model
########################################
# measurement model
MED_W2 =~ c1*indicator1_W2 + c2*indicator2_W2 + c3*indicator3_W2
MED_W4 =~ c1*indicator1_W4 + c2*indicator2_W4 + c3*indicator3_W4
MED_W6 =~ c1*indicator1_W6 + c2*indicator2_W6 + c3*indicator3_W6
# equal intercepts across time
indicator3_W2 ~ i1*1
indicator2_W2 ~ 1
indicator1_W2 ~ i2*1
indicator3_W4 ~ i1*1
indicator2_W4 ~ 1
indicator1_W4 ~ i3*1
indicator3_W6 ~ i1*1
indicator2_W6 ~ 1
indicator1_W6 ~ i3*1
# latent means: fix baseline to 0, estimate later waves
MED_W2 ~ 0*1
MED_W4 ~ m4*1
MED_W6 ~ m6*1
# Correlated within-task residuals across time
indicator1_W6 ~~ indicator1_W4 + indicator1_W2
indicator1_W4 ~~ indicator1_W2
indicator3_W6 ~~ indicator3_W4 + indicator3_W2
indicator3_W4 ~~ indicator3_W2
indicator2_W6 ~~ indicator2_W4 + indicator2_W2
indicator2_W4 ~~ indicator2_W2
########################################
# Create between components (RIs)
########################################
RI_predictor =~ 1*predictor_W1 + 1*predictor_W2 + 1*predictor_W3 +
1*predictor_W4 + 1*predictor_W5 + 1*predictor_W6
RI_outcome =~ 1*outcome_W1 + 1*outcome_W2 + 1*outcome_W3 +
1*outcome_W4 + 1*outcome_W5 + 1*outcome_W6
RI_med2 =~ 1*mediator2_W2 + 1*mediator2_W4 + 1*mediator2_W6
RI_med1 =~ 1*MED_W2 + 1*MED_W4 + 1*MED_W6
########################################
# Set residual variances of all lvs to 0
########################################
MED_W2 ~~ 0*MED_W2
MED_W4 ~~ 0*MED_W4
MED_W6 ~~ 0*MED_W6
########################################
# Set residual variances of all ovs to 0
########################################
# Predictor observed variables (waves 1-6)
predictor_W1 ~~ 0*predictor_W1
predictor_W2 ~~ 0*predictor_W2
predictor_W3 ~~ 0*predictor_W3
predictor_W4 ~~ 0*predictor_W4
predictor_W5 ~~ 0*predictor_W5
predictor_W6 ~~ 0*predictor_W6
# Outcome observed variables (waves 1-6)
outcome_W1 ~~ 0*outcome_W1
outcome_W2 ~~ 0*outcome_W2
outcome_W3 ~~ 0*outcome_W3
outcome_W4 ~~ 0*outcome_W4
outcome_W5 ~~ 0*outcome_W5
outcome_W6 ~~ 0*outcome_W6
# Mediator2 observed variables (waves 2, 4, 6)
mediator2_W2 ~~ 0*mediator2_W2
mediator2_W4 ~~ 0*mediator2_W4
mediator2_W6 ~~ 0*mediator2_W6
########################################
# Create within components
########################################
# Predictor within-person
wp_predictor_W1 =~ 1*predictor_W1
wp_predictor_W2 =~ 1*predictor_W2
wp_predictor_W3 =~ 1*predictor_W3
wp_predictor_W4 =~ 1*predictor_W4
wp_predictor_W5 =~ 1*predictor_W5
wp_predictor_W6 =~ 1*predictor_W6
# Outcome within-person
wp_outcome_W1 =~ 1*outcome_W1
wp_outcome_W2 =~ 1*outcome_W2
wp_outcome_W3 =~ 1*outcome_W3
wp_outcome_W4 =~ 1*outcome_W4
wp_outcome_W5 =~ 1*outcome_W5
wp_outcome_W6 =~ 1*outcome_W6
# Mediator2 within-person
wp_med2_W2 =~ 1*mediator2_W2
wp_med2_W4 =~ 1*mediator2_W4
wp_med2_W6 =~ 1*mediator2_W6
# Mediator1 within-person
wp_med1_W2 =~ 1*MED_W2
wp_med1_W4 =~ 1*MED_W4
wp_med1_W6 =~ 1*MED_W6
########################################
# Estimate lagged effects between within-person centered variables
########################################
# Predictor → Outcome
wp_outcome_W3 ~ c1p*wp_predictor_W1
wp_outcome_W4 ~ wp_predictor_W2
wp_outcome_W5 ~ c2p*wp_predictor_W3
wp_outcome_W6 ~ wp_predictor_W4
# Outcome → Predictor
wp_predictor_W3 ~ c3p*wp_outcome_W1
wp_predictor_W4 ~ wp_outcome_W2
wp_predictor_W5 ~ c4p*wp_outcome_W3
wp_predictor_W6 ~ wp_outcome_W4
# Predictor/Outcome → Mediators at wave 2
wp_med2_W2 ~ a1*wp_predictor_W1 + a3*wp_outcome_W1
wp_med1_W2 ~ a2*wp_predictor_W1 + a4*wp_outcome_W1
# Wave 2 → Wave 3 (bidirectional)
wp_outcome_W3 ~ b1*wp_med2_W2 + b2*wp_med1_W2
wp_predictor_W3 ~ b3*wp_med2_W2 + b4*wp_med1_W2
# Mediation effects (wave 1→2→3)
ind_dir1 := a1*b1
ind_dir2 := a2*b2
tot_dir1 := c1p + (a1*b1) + (a2*b2)
ind_revdir1 := a3*b3
ind_revdir2 := a4*b4
tot_revdir1 := c3p + (a3*b3) + (a4*b4)
# Wave 3 → Wave 4
wp_med2_W4 ~ a5*wp_predictor_W3 + a7*wp_outcome_W3
wp_med1_W4 ~ a6*wp_predictor_W3 + a8*wp_outcome_W3
# Wave 4 → Wave 5 (bidirectional)
wp_outcome_W5 ~ b5*wp_med2_W4 + b6*wp_med1_W4
wp_predictor_W5 ~ b7*wp_med2_W4 + b8*wp_med1_W4
# Mediation effects (wave 3→4→5)
ind_dir3 := a5*b5
ind_dir4 := a6*b6
tot_dir2 := c2p + (a5*b5) + (a6*b6)
ind_revdir3 := a7*b7
ind_revdir4 := a8*b8
tot_revdir2 := c4p + (a7*b7) + (a8*b8)
# Wave 5 → Wave 6
wp_med2_W6 ~ wp_predictor_W5 + wp_outcome_W5
wp_med1_W6 ~ wp_predictor_W5 + wp_outcome_W5
########################################
# Estimate covariance between within-person variables at first wave
########################################
wp_predictor_W1 ~~ wp_outcome_W1
wp_med2_W2 ~~ wp_med1_W2 + wp_predictor_W2 + wp_outcome_W2
wp_med1_W2 ~~ wp_predictor_W2 + wp_outcome_W2
########################################
# Estimate covariances between residuals of within-person variables
########################################
wp_predictor_W2 ~~ wp_outcome_W2
wp_predictor_W3 ~~ wp_outcome_W3
wp_predictor_W4 ~~ wp_outcome_W4 + wp_med2_W4 + wp_med1_W4
wp_outcome_W4 ~~ wp_med2_W4 + wp_med1_W4
wp_med2_W4 ~~ wp_med1_W4
wp_predictor_W5 ~~ wp_outcome_W5
wp_predictor_W6 ~~ wp_outcome_W6 + wp_med2_W6 + wp_med1_W6
wp_outcome_W6 ~~ wp_med2_W6 + wp_med1_W6
wp_med2_W6 ~~ wp_med1_W6
########################################
# Estimate variance and covariance of random intercepts
########################################
RI_predictor ~~ RI_outcome + RI_med2 + RI_med1 + RI_predictor
RI_outcome ~~ RI_med2 + RI_med1 + RI_outcome
RI_med2 ~~ RI_med1 + RI_med2
RI_med1 ~~ RI_med1
########################################
# Estimate (residual) variance of within-person centered variables
########################################
wp_predictor_W1 ~~ wp_predictor_W1 # Variances
wp_outcome_W1 ~~ wp_outcome_W1
wp_predictor_W2 ~~ wp_predictor_W2
wp_outcome_W2 ~~ wp_outcome_W2
wp_med1_W2 ~~ wp_med1_W2
wp_med2_W2 ~~ wp_med2_W2
wp_predictor_W3 ~~ wp_predictor_W3 # Residual variances
wp_outcome_W3 ~~ wp_outcome_W3
wp_predictor_W4 ~~ wp_predictor_W4
wp_outcome_W4 ~~ wp_outcome_W4
wp_med1_W4 ~~ wp_med1_W4
wp_med2_W4 ~~ wp_med2_W4
wp_predictor_W5 ~~ wp_predictor_W5
wp_outcome_W5 ~~ wp_outcome_W5
wp_predictor_W6 ~~ wp_predictor_W6
wp_outcome_W6 ~~ wp_outcome_W6
wp_med1_W6 ~~ wp_med1_W6
wp_med2_W6 ~~ wp_med2_W6
########################################
# Within-person autoregressions
########################################
# Mediator2
wp_med2_W6 ~ wp_med2_W4
wp_med2_W4 ~ wp_med2_W2
# Mediator1
wp_med1_W6 ~ wp_med1_W4
wp_med1_W4 ~ wp_med1_W2
# Predictor
wp_predictor_W6 ~ wp_predictor_W5
wp_predictor_W5 ~ wp_predictor_W4
wp_predictor_W4 ~ wp_predictor_W3
wp_predictor_W3 ~ wp_predictor_W2
wp_predictor_W2 ~ wp_predictor_W1
# Outcome
wp_outcome_W6 ~ wp_outcome_W5
wp_outcome_W5 ~ wp_outcome_W4
wp_outcome_W4 ~ wp_outcome_W3
wp_outcome_W3 ~ wp_outcome_W2
wp_outcome_W2 ~ wp_outcome_W1
########################################
# Additional constraints
########################################
# Set correlations between RIs and within-person factors at exogenous wave at 0
RI_predictor ~~ 0*wp_predictor_W1
RI_outcome ~~ 0*wp_outcome_W1
RI_med2 ~~ 0*wp_med2_W2
RI_med1 ~~ 0*wp_med1_W2
'
cat("Model fit began at:", format(Sys.time()), "\n")
model_bayes = blavaan::bcfa(
model = ri_clpm_model,
data = my_data,
n.chains = 3,
burnin = 1000,
sample = 5000,
meanstructure = T,
int.ov.free = F,
bcontrol = list(cores = 3),
control = list(
adapt_delta = 0.9,
max_treedepth = 10
)
)