Constrain first indicator of two latent factors to be equal

450 views
Skip to first unread message

Felix Schönbrodt

unread,
Jun 13, 2018, 10:42:34 AM6/13/18
to lavaan
Hey laavaan-Group,
I have a question concerning the specification of equality constraints for the first indicators in CFA models. Assume that we have a two-dimensional CFA model
f1 =~ V1+V2+V3+V4
f2 =~ V5+V6+V7+V8
Typically, lavaan defines the loading of the first indicator to be 1 and estimates the variance of the factors. However, I would like to estimate the loadings of the first indcators (V1 and V5, while setting the variance of the factors to 1) with the constraint that they are equal. Thus, I would like to estimate a model such as this
f1 =~ l1*NA*V1+V2+V3+V4
f2 =~ l1*NA*V5+V6+V7+V8
f1~~1*f1
f2~~1*f2
or something like this
f1 =~ l1*NA*V1+V2+V3+V4
f2 =~ l2*NA*V5+V6+V7+V8
f1~~1*f1
f2~~1*f2
l1 == l2
However, both definitions do not work. Is there another way to say lavaan that it should estimate the factor loadings of the first indicators of two factors and constraining them to be equal?
Thanks for any help!
Felix

Terrence Jorgensen

unread,
Jun 14, 2018, 4:24:43 AM6/14/18
to lavaan
Typically, lavaan defines the loading of the first indicator to be 1 and estimates the variance of the factors.

Using the sem() or cfa() function, the default argument std.lv=FALSE does that.  But you can switch it to std.lv=TRUE to standardize the latent variable (setting those variances to 1) and freely estimate the first loadings.  Or if you use the bare-bones lavaan() function, no parameters are set to anything but zero by default, so you would need to either specify every parameter in your model syntax, or turn some defaults on (see the ?lavOptions help page for auto* arguments).  If you want to see which defaults the sem() or cfa() wrappers turn on, you can see what call was actually used:

fit <- cfa(...)
fit@call


However, I would like to estimate the loadings of the first indcators (V1 and V5, while setting the variance of the factors to 1) with the constraint that they are equal. Thus, I would like to estimate a model such as this
f1 =~ l1*NA*V1+V2+V3+V4
f2 =~ l1*NA*V5+V6+V7+V8
f1~~1*f1
f2~~1*f2
or something like this
f1 =~ l1*NA*V1+V2+V3+V4
f2 =~ l2*NA*V5+V6+V7+V8
f1~~1*f1
f2~~1*f2
l1 == l2
However, both definitions do not work. Is there another way to say lavaan that it should estimate the factor loadings of the first indicators of two factors and constraining them to be equal?

You can't use multiple operators on a parameter at the same time, but you can add another operator on the same line (although it superficially looks like you would be specifying the same parameter twice, lavaan simply applies both operations to the same parameter).  For example, first tell lavaan to freely estimate the parameter, then apply a label to that parameter:

f1 =~ NA*V1 + l1*V1 + V2 + V3 + V4
f2
=~ NA*V5 + l1*V5 + V6 + V7 + V8

Anything in the model syntax will override arguments like std.lv= or any auto*= arguments.

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

Felix Schönbrodt

unread,
Jun 14, 2018, 8:00:48 AM6/14/18
to lavaan
Thanks Terrence, it worked.

Best
Felix
Reply all
Reply to author
Forward
0 new messages