negative loading of single indicator in CFA

208 views
Skip to first unread message

Ilse Coolen

unread,
Feb 5, 2019, 5:53:04 AM2/5/19
to lavaan
Hello all, 

We're having a problem with our data outcome and would welcome any advice.

We have a 3-factor CFA model (which previously showed to fit better than a 2-factor CFA model), with 4 indicators for 1 factor(F1), 4 for F2 and 1 indicator loading on F3 (this was not what we wanted, but it was data driven).

All the correlations (parametric and non-parametric) between the observed measures are positive as expected.

When we run a CFA for these measures at Timepoint 1, everything looks like we expected: 

CODE FOR TIME 1: 

HS.modelT1dual <- 'F1T1 =~ y1T1 + y2T1 + y3T1 + y4T1                  

                                F2T1 =~ y5T1 + y6T1 + y7T1 + y8T1

                                F3T1 =~ y9T1'

 

cfaT1dual <- cfa(HS.modelT1dual, data=data,estimator = "MLR", std.lv=TRUE, missing="fiml")

summary(cfaT1dual, fit.measures=TRUE, modindices = TRUE, standardized=TRUE, rsquare=TRUE)             

 

OUTCOME FOR TIME 1:


Latent Variables:

                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all

  F1T1 =~                                                              

    y1T1            0.067    0.028    2.398    0.016    0.067    0.362

    y2T1         11.918    2.235    5.332    0.000   11.918    0.509

    y3T1           0.307    0.088    3.476    0.001    0.307    0.404

    y4T1            0.116    0.027    4.220    0.000    0.116    0.535

  F2T1 =~                                                        

    y5T1          3.515    0.475    7.396    0.000    3.515    0.547

    y6T1       6.949    1.011    6.873    0.000    6.949    0.564

    y7T1        1.565    0.193    8.095    0.000    1.565    0.642

    y8T1           2.199    0.130   16.952    0.000    2.199    0.897

  F3T1 =~                                                      

    Y9T1          0.156    0.008   20.154    0.000    0.156    1.000

 

Covariances:

                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all

  F1T1 ~~                                                               

    F2T1        0.763    0.115    6.614    0.000    0.763    0.763

    F3T1     0.732    0.127    5.767    0.000    0.732    0.732

  F2T1 ~~                                                        

    F3T1     0.537    0.069    7.756    0.000    0.537    0.537


However, when we do the same for Time 2, the single indicator (y9) loads negatively onto it's factor


CODE FOR TIME 2: 


 

HS.modelT2dual <- 'F1T2 =~ y1T2 + y2T2 + y3T2 + y4T2

                                F2T2 =~ y5T2 + y6T2 + y7T2 + y8T2

                                F3T2 =~ y9T2'

 

cfaT2dual <- cfa(HS.modelT2dual, data = data, estimator = "MLR", std.lv=TRUE, missing="fiml")

summary(cfaT2dual, fit.measures=TRUE,modindices=TRUE, standardized=TRUE, rsquare=TRUE)

 


OUTCOME FOR TIME 2:


Latent Variables:

                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all

  F1T2 =~                                                              

    y1T2            0.077    0.025    3.074    0.002    0.077    0.401

    y2T2         11.298    1.747    6.466    0.000   11.298    0.552

    y3T2           0.281    0.075    3.765    0.000    0.281    0.366

    y4T2            0.113    0.019    6.081    0.000    0.113    0.572

  F2T2 =~                                                        

    y5T2          2.726    0.434    6.277    0.000    2.726    0.521

    y6T2       7.783    1.171    6.644    0.000    7.783    0.573

    y7T2        2.857    0.301    9.487    0.000    2.857    0.729

    y8T2           3.213    0.317   10.149    0.000    3.213    0.784

  F3T2 =~                                                     

    y9T2         -0.118    0.007  -15.837    0.000   -0.118   -1.000

 

Covariances:

                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all

  F1T2 ~~                                                              

    F2T2        0.708    0.082    8.650    0.000    0.708    0.708

    F3T2    -0.650    0.109   -5.953    0.000   -0.650   -0.650

  F2T2 ~~                                                        

    F3T2    -0.448    0.068   -6.607    0.000   -0.448   -0.448



We tried multiple things to understand this or to fix it but nothing made it positive: 


1) we tried to specify the variance of the observed variable to be equal to 0 (y9T2~~0*y9T2)

 

2) we checked modification indices and improved the model by fixing covariance and variance, but y9 estimation remains negative. 

 

3) we tried Bootstrapping

 

4) I don't think we can try and force the sign to flip, as we're using the factor loadings in regressions.


When forcing y9 to load onto F2, it is positive and there is no problem, but 3-factor model is better than 2-factor model. covariance and variance is also only negative when y9 is indicator of its own factor and not when loading onto F2.

 

Basically, to us it seems best to just drop y9 as an observed measure, but we can't find a data driven justification (AIC for model including y9 is better than without it, but CFI and RMSEA fit indices are better for the 2-factor model).


I read about Heywood cases, but I don't think this is such a case. But since it is a single indicator, we don't have error variance for y9.


If anyone knows of any references about a single indicator loading negatively onto its factor or any reference that would help us to find justification to drop y9.


Any advice on how to deal with this weird measure that decides to flip is more than welcome.

Terrence Jorgensen

unread,
Feb 5, 2019, 6:25:21 AM2/5/19
to lavaan

We tried multiple things to understand this or to fix it but nothing made it positive: 


You said this was data-driven.  Did you check your data to see if y9 is in fact negatively correlated with your other variables at time 2?

lavInspect(cfaT2dual, "sampstat")


1) we tried to specify the variance of the observed variable to be equal to 0 (y9T2~~0*y9T2)


That should already be the case (lavaan's default behavior), simply for identification. 

2) we checked modification indices and improved the model by fixing covariance and variance, but y9 estimation remains negative. 


Modification indices tell you what fixed parameters to free, not what free parameters to fix. 

3) we tried Bootstrapping


That does not change the point estimates, it just estimates an empirical sampling distribution of the point estimates (or any other statistic) for inference.

4) I don't think we can try and force the sign to flip, as we're using the factor loadings in regressions.


What does that mean?  factor loadings are regressions.  You can constrain it to be positive with a label:

F3T2 =~ foo*y9T2
...
foo
> 0

 

If anyone knows of any references about a single indicator loading negatively onto its factor or any reference that would help us to find justification to drop y9.


This has nothing to do with lavaan.  Try posting on SEMNET:


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

Ilse Coolen

unread,
Feb 5, 2019, 6:36:23 AM2/5/19
to lavaan
Hi Terrence, 

Thank you for taking the time to answer my questions. I just have a final question on your suggestion to just make it positive.

  Did you check your data to see if y9 is in fact negatively correlated with your other variables at time 2?

lavInspect(cfaT2dual, "sampstat")


Yes we did try this, they are all positive as we would expect them to be. 



4) I don't think we can try and force the sign to flip, as we're using the factor loadings in regressions.


What does that mean?  factor loadings are regressions.  You can constrain it to be positive with a label:

F3T2 =~ foo*y9T2
...
foo
> 0

 
I mean that we will be using the latent factors in extra regressions after the CFA (sorry for not being clear). I read somewhere that you can't just use the latent factor if you have flipped the sign. I am also really not sure about using this latent factor in further regressions if I do not understand why it is negative in the first place, while it should be positive.
I can't really find any references on this though. 

Just a lot of uncertainties about this unexpected negative loading.

Thank you so much for your help.

Ilse
Reply all
Reply to author
Forward
0 new messages