Partial strong invariance: need help on the model syntax (fixed factor and effects coding)

37 views
Skip to first unread message

Amonet

unread,
Jul 28, 2018, 10:03:35 AM7/28/18
to lavaan
Hi all, 

For my longitudinal model (4 time points) I would like to see if partial strong measurement invariance holds - in my case 1 intercept freely estimated over time and the others all constrained. 
Please see the model syntax I used for the standardised or fixed factor scaling method, and then the effects coding method. I made the most important parts of the model for this question bold

The reason I am not sure if these models are correct: did I correctly change the constraints to scale the latent variables? If not, could you suggest how it should be done?

The weak model: 

Model2 <- ' 
# latent variables
Time0 =~ A1*Item1 + B1*Item3 + C1*Item4 + D1*Item5 + E1*Item6
Time1 =~ A1*Item1 + B1*Item3 + C1*Item4 + D1*Item5 + E1*Item6
Time3 =~ A1*Item1 + B1*Item3 + C1*Item4 + D1*Item5 + E1*Item6
Time4 =~ A1*Item1 + B1*Item3 + C1*Item4 + D1*Item5 + E1*Item6

# Item covariances

Item1 ~~ Item1 + Item1 + Item1
Item1 ~~ Item1 + Item1
Item1 ~~ Item1 

Item3 ~~ Item3 + Item3 +  Item3 
Item3 ~~ Item3 + Item3 
Item3 ~~ Item3 

Item4 ~~ Item4 + Item4 + Item4 
Item4 ~~ Item4 + Item4 
Item4 ~~ Item4 

Item5 ~~ Item5 + Item5 + Item5 
Item5 ~~ Item5 + Item5 
Item5 ~~ Item5 

Item6 ~~ Item6 + Item6 + Item6
Item6 ~~ Item6 + Item6
Item6 ~~ Item6 

Time0 ~~ Time1 + Time3 + Time4
Time1 ~~ Time3 + Time4
Time3 ~~ Time4

# Item intercepts 

Item1 ~ a1*1
Item1 ~ a2*1
Item1 ~ a3*1
Item1 ~ a4*1

Item3 ~ b1*1
Item3 ~ b2*1
Item3 ~ b3*1
Item3 ~ b4*1

Item4 ~ c1*1
Item4 ~ c2*1
Item4 ~ c3*1 
Item4 ~ c4*1 

Item5 ~ d1*1
Item5 ~ d2*1
Item5 ~ d3*1
Item5 ~ d4*1

Item6 ~ e1*1
Item6 ~ e2*1
Item6 ~ e3*1
Item6 ~ e4*1

Time0 ~ 0*1
Time1 ~ 0*1
Time3 ~ 0*1
Time4 ~ 0*1

Time0 ~~ 1*Time0
Time1 ~~ Time1
Time3 ~~ Time3
Time4 ~~ Time4
'
fit2d <- lavaan(model = Model2, data = data, auto.var = TRUE,  missing = 'fiml', estimator = 'mlr')

Partially strong invariant model

Model3 <- ' 
# latent variables
Time0 =~ A1*Item1 + B1*Item3 + C1*Item4 + D1*Item5 + E1*Item6
Time1 =~ A1*Item1 + B1*Item3 + C1*Item4 + D1*Item5 + E1*Item6
Time3 =~ A1*Item1 + B1*Item3 + C1*Item4 + D1*Item5 + E1*Item6
Time4 =~ A1*Item1 + B1*Item3 + C1*Item4 + D1*Item5 + E1*Item6

# Item covariances

Item1 ~~ Item1 + Item1 + Item1
Item1 ~~ Item1 + Item1
Item1 ~~ Item1 

Item3 ~~ Item3 + Item3 +  Item3 
Item3 ~~ Item3 + Item3 
Item3 ~~ Item3 

Item4 ~~ Item4 + Item4 + Item4 
Item4 ~~ Item4 + Item4 
Item4 ~~ Item4 

Item5 ~~ Item5 + Item5 + Item5 
Item5 ~~ Item5 + Item5 
Item5 ~~ Item5 

Item6 ~~ Item6 + Item6 + Item6
Item6 ~~ Item6 + Item6
Item6 ~~ Item6 

Time0 ~~ Time1 + Time3 + Time4
Time1 ~~ Time3 + Time4
Time3 ~~ Time4

# Item intercepts 

#all observed items equal over time, except item 5
Item1 ~ a1*1
Item1 ~ a1*1
Item1 ~ a1*1
Item1 ~ a1*1

Item3 ~ b1*1
Item3 ~ b1*1
Item3 ~ b1*1
Item3 ~ b1*1

Item4 ~ c1*1
Item4 ~ c1*1
Item4 ~ c1*1 
Item4 ~ c1*1 

# Variant item --> freely estimating 
Item5 ~ d1*1
Item5 ~ d2*1
Item5 ~ d3*1
Item5 ~ d4*1

Item6 ~ e1*1
Item6 ~ e1*1
Item6 ~ e1*1
Item6 ~ e1*1

Time0 ~ 0*1
Time1 ~ 1
Time3 ~ 1
Time4 ~ 1

Time0 ~~ 1*Time0
Time1 ~~ Time1
Time3 ~~ Time3
Time4 ~~ Time4
'

fit3d <- lavaan(model = Model3, data = data,  auto.var = TRUE, missing = 'fiml', estimator = 'mlr')

Output of anova test:

Scaled Chi Square Difference Test (method = "satorra.bentler.2001")

       Df    AIC    BIC  Chisq Chisq diff Df diff Pr(>Chisq)
fit2d 146 3713.0 3949.2 194.14                              
fit3d 155 3707.1 3918.0 206.26     11.808       9     0.2244


Effects coding method for scaling the latent variable

Weak invariant model

Model2 <- ' 
# latent variables
Time0 =~ A1*Item1 + B1*Item3 + C1*Item4 + D1*Item5 + E1*Item6
Time1 =~ A1*Item1 + B1*Item3 + C1*Item4 + D1*Item5 + E1*Item6
Time3 =~ A1*Item1 + B1*Item3 + C1*Item4 + D1*Item5 + E1*Item6
Time4 =~ A1*Item1 + B1*Item3 + C1*Item4 + D1*Item5 + E1*Item6

# Item covariances

Item1 ~~ Item1 + Item1 + Item1
Item1 ~~ Item1 + Item1
Item1 ~~ Item1 

Item3 ~~ Item3 + Item3 +  Item3 
Item3 ~~ Item3 + Item3 
Item3 ~~ Item3 

Item4 ~~ Item4 + Item4 + Item4 
Item4 ~~ Item4 + Item4 
Item4 ~~ Item4 

Item5 ~~ Item5 + Item5 + Item5 
Item5 ~~ Item5 + Item5 
Item5 ~~ Item5 

Item6 ~~ Item6 + Item6 + Item6
Item6 ~~ Item6 + Item6
Item6 ~~ Item6 

Time0 ~~ Time1 + Time3 + Time4
Time1 ~~ Time3 + Time4
Time3 ~~ Time4

A1 + B1 + C1 + D1 + E1 == 5

Item1 ~ a1*1
Item1 ~ a2*1
Item1 ~ a3*1
Item1 ~ a4*1

Item3 ~ b1*1
Item3 ~ b2*1
Item3 ~ b3*1
Item3 ~ b4*1

Item4 ~ c1*1
Item4 ~ c2*1
Item4 ~ c3*1 
Item4 ~ c4*1 

Item5 ~ d1*1
Item5 ~ d2*1
Item5 ~ d3*1
Item5 ~ d4*1

Item6 ~ e1*1
Item6 ~ e2*1
Item6 ~ e3*1
Item6 ~ e4*1

a1 + b1 + c1 + d1 + e1 == 0
a2 + b2 + c2 + d2 + e2 == 0
a3 + b3 + c3 + d3 + e3 == 0
a4 + b4 + c4 + d4 + e4 == 0

Time0 ~ 1
Time1 ~ 1
Time3 ~ 1
Time4 ~ 1 
'

fit2d <- lavaan(model = Model2, data = data, auto.var = TRUE, missing = 'fiml', estimator = 'mlr')


Partially strong invariant model

Model3 <- ' 
# latent variables
Time0 =~ A1*Item1 + B1*Item3 + C1*Item4 + D1*Item5 + E1*Item6
Time1 =~ A1*Item1 + B1*Item3 + C1*Item4 + D1*Item5 + E1*Item6
Time3 =~ A1*Item1 + B1*Item3 + C1*Item4 + D1*Item5 + E1*Item6
Time4 =~ A1*Item1 + B1*Item3 + C1*Item4 + D1*Item5 + E1*Item6

# Item covariances

Item1 ~~ Item1 + Item1 + Item1
Item1 ~~ Item1 + Item1
Item1 ~~ Item1 

Item3 ~~ Item3 + Item3 +  Item3 
Item3 ~~ Item3 + Item3 
Item3 ~~ Item3 

Item4 ~~ Item4 + Item4 + Item4 
Item4 ~~ Item4 + Item4 
Item4 ~~ Item4 

Item5 ~~ Item5 + Item5 + Item5 
Item5 ~~ Item5 + Item5 
Item5 ~~ Item5 

Item6 ~~ Item6 + Item6 + Item6
Item6 ~~ Item6 + Item6
Item6 ~~ Item6 

Time0 ~~ Time1 + Time3 + Time4
Time1 ~~ Time3 + Time4
Time3 ~~ Time4

A1 + B1 + C1 + D1 + E1 == 5

All item intercepts invariant over time, except item 5
Item1 ~ a1*1
Item1 ~ a1*1
Item1 ~ a1*1
Item1 ~ a1*1

Item3 ~ b1*1
Item3 ~ b1*1
Item3 ~ b1*1
Item3 ~ b1*1

Item4 ~ c1*1
Item4 ~ c1*1
Item4 ~ c1*1 
Item4 ~ c1*1 

Item5 ~ d1*1
Item5 ~ d2*1
Item5 ~ d3*1
Item5 ~ d4*1

Item6 ~ e1*1
Item6 ~ e1*1
Item6 ~ e1*1
Item6 ~ e1*1

a1 + b1 + c1 + d1 + d2 + d3 + d4 + e1 == 0


Time0 ~ 1
Time1 ~ 1
Time3 ~ 1
Time4 ~ 1 
'
fit3d <- lavaan(model = Model3, data = data, auto.var = TRUE, missing = 'fiml', estimator = 'mlr')

This gives the same anova result / chisquare test result:
Scaled Chi Square Difference Test (method = "satorra.bentler.2001")

       Df    AIC    BIC  Chisq Chisq diff Df diff Pr(>Chisq)
fit2d 146 3713.0 3949.2 194.14                              
fit3d 155 3707.1 3918.0 206.26     11.808       9     0.2244



Thanks for the help!

Kind regards,
Amonet





Terrence Jorgensen

unread,
Jul 29, 2018, 7:54:08 PM7/29/18
to lavaan
The reason I am not sure if these models are correct: did I correctly change the constraints to scale the latent variables?

You are using the exact same variable names for all 4 time points (Item1, Item3, Item4, Item5, and Item6).  If the variable names are not distinct across time, then you don't actually have a longitudinal model.

       Df    AIC    BIC  Chisq Chisq diff Df diff Pr(>Chisq)
fit2d 146 3713.0 3949.2 194.14                              
fit3d 155 3707.1 3918.0 206.26     11.808       9     0.2244

You have 5 indicators at each of 4 occasions.  Equating intercepts reduces the number of estimated intercepts from 5*4=20 to 5, so you gain 15 df, but lose 3 of those by freeing the latent means after time 1.  So your test should have 12 df, not 9.  Try checking which parameters are fixed/free, and note that equality-constrained parameters will have the same parameter number:

lavInspect(fit3d, "free")


a1 + b1 + c1 + d1 + d2 + d3 + d4 + e1 == 0

If you release the intercept constraints for this item across 4 occasions, then you should gain 3 df because you go from 1 to 4 estimated intercepts for this item.  So you should have 9 df, which you do, but I'm not sure this constraint makes sense.  In the case of partial invariance with effects-coding identification, I would recommend only using the equality-constrained items to define the identification constraint.  The df would be the same, as should the fit of the model, but the estimated latent means should not be affected by differences in item intercepts, so I would not include d1-d4.

a1 + b1 + c1 + e1 == 0

Terrence D. Jorgensen
Postdoctoral Researcher, Methods and Statistics
Research Institute for Child Development and Education, the University of Amsterdam

Reply all
Reply to author
Forward
0 new messages