Semtools EFA / negative factor loadings

108 views
Skip to first unread message

Jan Brederecke

unread,
Mar 25, 2019, 10:30:29 AM3/25/19
to lavaan
Hello everyone,

I have a question concerning semTools' EFA function.

Currently I'm working on a project regarding a 27 item questionnaire that was developed but never evaluated.
I decided that an EFA was the way to go and as the items are categorical, WLSMV would be the recommended procedure of estimation as I understand.

After trying different solutions using the fa function of the psych package and the factanal function I found out about semTools' EFA ability and the chance to use WLSMV estimation as was recommended to me.

Now the problem:

The results look fine and everything is pretty close to my former results with the other functions but no matter which estimator I use, the items of one factor produce negative loadings when semTools is used.
This does not happen in any of the other functions.

Additionally, I have a second sample that I want to use to apply CFA and as it seems, there are no negative loadings on the factors either.


Can anyone help? I would really like to use the semTools package for this but at the moment it does not yet seem correct to me...

Thank you all in advance, any help is appreciated!

Jan Brederecke   

Terrence Jorgensen

unread,
Mar 25, 2019, 11:17:56 AM3/25/19
to lavaan
the items of one factor produce negative loadings when semTools is used.

Flipping their signs would produce a statistically equivalent result.  In the usual CFA case where you specify your own model syntax, you could label one loading and constrain it to be positive to make sure the optimizer looks on that side of the number line instead, but that is trickier with efaUnrotate() because it internally writes the syntax for you.  If you look at the output of parTable(fit), you can see what labels are used for one of the loadings you want to be positive, then constrain it to be positive using the constraints= argument in a second run.  From the help-page examples:

unrotated <- efaUnrotate(HolzingerSwineford1939, nf = 3,
                         varList
= paste0("x", 1:9), estimator = "mlr")
## suppose you want to constrain the first loading
(PT <- parTable(unrotated))
## duplicate the last row, which is already a constraint
PT
<- rbind(PT, PT[nrow(PT), ])
## change righthand side of new row to be the loading you want to be positive
PT$op
[nrow(PT)] <- "<"
PT$rhs
[nrow(PT)] <- "load1_1"
## fit the model again
unrotated1
<- update(unrotated, model = PT)


You could also try using a target rotation, as shown on the ?funRotate help page (last example)

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

Jan Brederecke

unread,
Mar 25, 2019, 1:08:16 PM3/25/19
to lavaan
Dear Terrence,

thank you so much for your incredibly fast answer!
Even though it seriously melted my brain (I'm still pretty much an R newbie), I found out how to implement your advice and I guess it helped me again to better understand factor analysis methods.

Thank you!
Jan
Reply all
Reply to author
Forward
0 new messages