Unconstraining single items in measurementInvariance function

28 views
Skip to first unread message

AM

unread,
Mar 26, 2019, 6:39:53 AM3/26/19
to lavaan
This question has been asked before, however no satisfactory answer was given.

Let's say that I have the following CFA model:

fit.a.cfa <- '
A =~ A1 + A2 + A3 + A4 + A5 + A6
A ~~ A
' %>% cfa(data = A_data)

If I wanted to assess measurement invariance of this model across genders, I would use:

fit.a.cfa <- '
A =~ A1 + A2 + A3 + A4 + A5 + A6
A ~~ A
' %>% measurementInvariance(model = ., data = A_data, group = "Gender", std.lv = T)

Running this function revealed that there is no full measurement invariance, and so I proceeded with partial measurement invariance:

fit.a.cfa.partial.weak <- partialInvariance(fit.a.cfa, type = "weak", return.fit = T)

This procedure has revealed that there is partial weak measurement invariance - the model in which the factor loadings on the 5th item are unconstrained across groups, and all the other loadings are constrained works as well as the configural model. The next step is strong partial invariance testing. However, it is not possible to simply use something like:

fit.a.cfa.partial.strong <- partialInvariance(fit.a.cfa, type = "strong", return.fit = T)

because this will compare various model with freed/fixed intercepts with the model in which all the factor loadings are constrained to be equal. This is not what I need, I need a model in which all the factor loadings except the 5th one are constrained to be equal. While browsing through the previous question asked on the forum, I found that Terrence Jorgensen said: 

Notice the help page tells you that you can pass any other arguments to cfa() via ...
 
?measurementInvariance 


So if you know what parameters you want to free, you can run measurementInvariance() again with the group.partial argument, and your degrees of freedom should reflect how many parameters are not being constrained.  If any factor loadings have to be freed, remember to free those item intercepts as well.

However, this doesn't seem to work. I used the following code:

 fit.a.cfa <- '
A =~ A1 + A2 + A3 + A4 + A5 + A6
A ~~ A
' %>% measurementInvariance(model = ., data = A_data, group = "Gender", std.lv = T, group.partial = "A=~A1")

Calling summary(fit.a.cfa$fit.loadings)reveals that the factor loadings of the 5th item are equal in both groups, like I didn't pass the group.partial argument at all. Am I doing something wrong? How can I get the model I need for comparison during the strong partial invariance testing?

Terrence Jorgensen

unread,
Mar 29, 2019, 5:56:57 AM3/29/19
to lavaan
However, this doesn't seem to work. I used the following code:

 fit.a.cfa <- '
A =~ A1 + A2 + A3 + A4 + A5 + A6
A ~~ A
' %>% measurementInvariance(model = ., data = A_data, group = "Gender", std.lv = T, group.partial = "A=~A1")

Calling summary(fit.a.cfa$fit.loadings)reveals that the factor loadings of the 5th item are equal in both groups, like I didn't pass the group.partial argument at all.

A1 is the first, not 5th indicator.  What happens with group.partial = "A=~A5"?

How can I get the model I need for comparison during the strong partial invariance testing?

For more control, and to understand what you are doing at each step (i.e., not fitting unnecessary models automatically), try using the new measEq.syntax() function to write syntax (and optionally run) one model at a time. 

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

Reply all
Reply to author
Forward
0 new messages