Hello Terrence, I ran the scalar invariance testing in another model and scalar invariance was not supported . To identify constraints that might be released I ran lavTestScore including the argument cumulative=TRUE to identify the highest statistics value. After that, I used partable to find parameter labels but I am not certain If I am selecting the correct constraint to release based on the results. I am copying an example with a selection of parts of the table.
#specify the model
TIS.model1001 <- ' factora =~ TI2 + TI3 + TI4 + TI5 + TI6 + TI8 '
# model 1: configural invariance TRAUMA_INDEX
fit1_trauma <- cfa(TIS.model1001, data = pcl_ti_data_amostra1001, estimator = "MLR", group = "TRAUMA_INDEX")
# model 2: metric (weak) invariance TRAUMA_INDEX
fit2_trauma <- cfa(TIS.model1001, data=pcl_ti_data_amostra1001, estimator="MLR", group="TRAUMA_INDEX",group.equal="loadings")
# model 3: scalar (strong) invariance TRAUMA_INDEX
fit3_trauma <- cfa(TIS.model1001, data=pcl_ti_data_amostra1001, estimator="MLR", group="TRAUMA_INDEX", group.equal=c("loadings", "intercepts"))
lavTestScore(fit3_trauma, cumulative = TRUE)
univariate score tests:
lhs op rhs X2 df p.value
1 .p2. == .p22. 0.066 1 0.797
2 .p3. == .p23. 0.678 1 0.410
3 .p4. == .p24. 0.970 1 0.325
4 .p5. == .p25. 0.332 1 0.564
5 .p6. == .p26. 2.042 1 0.153
6 .p14. == .p34. 8.657 1 0.003
7 .p15. == .p35. 3.589 1 0.058
8 .p16. == .p36. 9.023 1 0.003
9 .p17. == .p37. 0.488 1 0.485
10 .p18. == .p38. 18.499 1 0.000
...
cumulative score tests:
lhs op rhs X2 df p.value
10 .p18. == .p38. 18.499 1 0
22 .p19. == .p59. 30.278 2 0
20 .p17. == .p57. 42.846 3 0
> partable(fit3_trauma)
id lhs op rhs user block group free ustart exo label plabel start est se
36 36 TI4 ~1 0 2 2 33 NA 0 .p16. .p36. 2.577 2.064 0.128
37 37 TI5 ~1 0 2 2 34 NA 0 .p17. .p37. 2.046 1.811 0.110
38 38 TI6 ~1 0 2 2 35 NA 0 .p18. .p38. 3.163 3.438 0.115
39 39 TI8 ~1 0 2 2 36 NA 0 .p19. .p39. 2.092 1.773 0.125
So , I tested for partial invariance after releasing
"TI6 ~ 1":
#partial scalar invariance model
fit4_trauma <- cfa(TIS.model1001, data=pcl_ti_data_amostra1001, estimator="MLR", group="TRAUMA_INDEX", group.equal=c("loadings", "intercepts"), group.partial = c("TI6 ~ 1" )).
As scalar and metric invariance models were still different , I released the second constraint in the cumulative score tests list:
cumulative score tests:
lhs op rhs X2 df p.value
10 .p18. == .p38. 18.499 1 0
22 .p19. == .p59. 30.278 2 0
> partable(fit3_trauma)
id lhs op rhs user block group free ustart exo label plabel start est se
...
50 50 TI5 ~~ TI5 0 3 3 46 NA 0 .p50. 1.947 2.244 0.239
51 51 TI6 ~~ TI6 0 3 3 47 NA 0 .p51. 2.297 2.541 0.225
52 52 TI8 ~~ TI8 0 3 3 48 NA 0 .p52. 1.927 1.909 0.244
53 53 factora ~~ factora 0 3 3 49 NA 0 .p53. 0.050 3.076 0.269
54 54 TI2 ~1 0 3 3 50 NA 0 .p14. .p54. 2.298 1.954 0.135
55 55 TI3 ~1 0 3 3 51 NA 0 .p15. .p55. 2.580 2.252 0.149
56 56 TI4 ~1 0 3 3 52 NA 0 .p16. .p56. 2.302 2.064 0.128
57 57 TI5 ~1 0 3 3 53 NA 0 .p17. .p57. 1.706 1.811 0.110
58 58 TI6 ~1 0 3 3 54 NA 0 .p18. .p58. 3.478 3.438 0.115
59 59 TI8 ~1 0 3 3 55 NA 0 .p19. .p59. 1.686 1.773 0.125
60 60 factora ~1 0 3 3 56 NA 0 .p60. 0.000 0.171 0.178
61 61 factora =~ TI2 1 4 4 0 1 0 .p61. 1.000 1.000 0.000
#partial scalar invariance model
fit4_trauma <- cfa(TIS.model1001, data=pcl_ti_data_amostra1001, estimator="MLR", group="TRAUMA_INDEX", group.equal=c("loadings", "intercepts"), group.partial = c("TI6 ~ 1", "TI8 ~ 1" )).
My questions are:
1- Is this an acceptable way of identifying which constraints should be released?
2- The constraints to be released were identified correctly after checking for their labels in partable?
3- Is the partial scalar variance model correct?
Thanks in advance