Multigroup invariance and second-order-factor

1,351 views
Skip to first unread message

ohlse...@gmail.com

unread,
Jun 1, 2015, 11:07:09 AM6/1/15
to lav...@googlegroups.com
Hi!
I plan to do a multigroup-model (two groups) with invariance tests and a second order factor, that´s just identified.
I switched to lavaan and haven´t found an answer on how it could be done the best way. I know lavaan has this conventient argument "group.equal" to fix groups of parameters to be equal.

a) When i use a second-order-factor in my SEM. How does "group.equal=c(...)) behave?
For example, if i test weak-invariance (factor loadings) does lavaan now fix the first- and second-order-factor loadings invariant in one step? Or does lavaan produce two models where the first model only has first order factor loadings fixed to be invariant and then runs a second Model, where first and second order factor loadings are invariant?

Additional-Question: If it´s possible to use group.equal for second-order-factors, is the loading of the first first-order factor on the second order factor fixed to 1 or is the second order factor-mean fixed to 0 and the variance fixed to 1 for supplying a metric to the second order factor? That would be importend if i would like to compare factor means after strict invariance might be confirmed.

b) Is group.equal not capable of second order factors and i should specify invariance of parameters manually? Or are there other possibilities?


Thank you very much

Terrence Jorgensen

unread,
Jun 5, 2015, 7:02:04 AM6/5/15
to lav...@googlegroups.com

a) When i use a second-order-factor in my SEM. How does "group.equal=c(...)) behave?

Second-order "loadings" are latent-variable regressions (the beta matrix, not the lambda matrix).  If those are the only latent regressions in the model, then "regressions" might work in the group.equal argument.  But you should (a) test invariance for first-order factors first, without any higher-order factors in the model, then (b) add the second-order factors after invariance is established, which will be your new "configural" model for the higher-order CFA.  In other words, follow the steps of testing invariance independently, one "level" at a time.  

Additional-Question: If it´s possible to use group.equal for second-order-factors, is the loading of the first first-order factor on the second order factor fixed to 1 or is the second order factor-mean fixed to 0 and the variance fixed to 1 for supplying a metric to the second order factor?

It's been a while since I ran a model like this, so I forget what the default behavior would be, but if you are using the"=~" operator for the second-order factors, it is probably decided by std.lv=TRUE/FALSE.  You'll find out when you try to fit the model.  But if I were you, I would use the lavaan() function and specify your parameters explicitly to make sure you fit the model you intend to fit.

Terry

Yves Rosseel

unread,
Jun 11, 2015, 11:13:26 AM6/11/15
to lav...@googlegroups.com
On 06/01/2015 05:07 PM, ohlse...@gmail.com wrote:
> Hi!
> I plan to do a multigroup-model (two groups) with invariance tests and a
> second order factor, that´s just identified.
> I switched to lavaan and haven´t found an answer on how it could be done
> the best way. I know lavaan has this conventient argument "group.equal"
> to fix groups of parameters to be equal.

I would strongly suggest to avoid the group.equal= argument, and use the
syntax. Much better for clarity and understanding...

Yves.

Niels

unread,
Jul 1, 2015, 5:35:22 AM7/1/15
to lav...@googlegroups.com
Hi everyone, and thank you very much for your input!
I´m trying to build my model right now and have some further questions. This will be a longer post, but will try to make my questions clear. I also want to do a post in my blog about this, so that other people can use it as information resource. I would be very thankful for any comments.

I´ve estimated a cfa - model with CFI >.96 for the whole sample and now i´m trying to look for gender differences. So i introduced the binary grouping variable "gender". My model has a second order factor, and also some single-indicator factors.

Here is my plan for the measurement invariance test models:
1) configural invariance model  / seperate model for each group without invariance
2) weak invariance model        / invariance of 1st order loadings
3) weak invariance model        / invariance of 1st & 2nd order loadings
4) strong invariance                / invariance of 1st & 2nd order loadings + item intercepts
5) strong invariance                / invariance of 1st & 2nd order loadings + item intercepts & 1st order factor intercept
# 6) strict invariance               / invariance of 1st & 2nd order loadings + item intercepts & 1st order factor intercept + first order factor disturbances
# 7) strict invariance               / invariance of 1st & 2nd order loadings + item intercepts & 1st order factor intercept + first order factor disturbances & item uniqueness
I don´t think, i will test strict invariance.


My Questions:
  • General comments on my code - did i do this right?
  • Should i test i.e. the strong invariance model against the configural model or against the weak invariance model?
  • I´m not sure if i should use the marker variable apporach oder the fixed factor mean@0 / @1 approach for supplying a scale to my factors?
  • If i use the marker variable appoach- when i set the first order factor interecepts equal (model 5), how do i prevent lavaan from giving a mean of zero to the factor? (that seems to be the lavaan-default) Should i use std.lv = FALSE and fix every other latent to zero? I get an error on model 5 (please see below)
  • How do i handle single-indicator items? I can´t test any invariance for them, so they are the same for both groups anyway? I´ve fixed them to 10% of the observed variables´ variance (whole sample). Or should i estimate the variance for group A / group B seperatly?
  • Until now, i handled missing data (mar) by multiple imputation so i can use the MLM estimator. Lavaan Survey can´t work with multiple groups and multiply imputed data, so i have to switch to FIML for my multigroup models. Now i can´t use MLM anymore. MLR doesn´t seem to work because of lavaan survey. Do you have any ideas how i can get robust estimates? Should i use test="Yuan-Bentler"?

#--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

#----------------------------------------------------
#model 1 - configural invariance


model
.configural<-'
#measurement model
a        =~ c(1,1)*F09_a + c(a11,a12)*F09_b + c(a21,a22)*F09_c
b        =~ c(1,1)*F10_a + c(b11,b12)*F10_b + c(b21,b22)*F10_c
c        =~ c(1,1)*F10_d + c(c11,c12)*F10_e
lat1     =~ NA*a + NA*b + c(1,1)*c
lat2   =~ c(1,1)*F12_a + c(d11,d12)*F12_b
lat3   =~ c(1,1)*F12_d + c(e11,e12)*F12_e
lat4   =~ c(1,1)*F12_c
lat5   =~ c(1,1)*F12_g
lat6   =~ c(1,1)*F12_f

#single-indicator errorterm variances
F12_c ~~ 0.1581*F12_c
F12_f ~~ 0.1246*F12_f
F12_g ~~ 0.1068*F12_g
'


lavaan
.fit_configural<-cfa(model.configural, data=datensatz, group="gender")
survey
.fit_configural<-lavaan.survey(lavaan.fit_configural, svy.df)
summary
(survey.fit_configural,fit.measures=TRUE,standardized=TRUE)


######################################################################################

# model2 - weak invariance 1st order factor loadings

model
.weak1<-'
#measurement
a        =~ c(1,1)*F09_a + c(a1,a1)*F09_b + c(a2,a2)*F09_c
b        =~ c(1,1)*F10_a + c(b1,b1)*F10_b + c(b2,b2)*F10_c
c        =~ c(1,1)*F10_d + c(c1,c1)*F10_e
lat1     =~ c(lat21,lat22)*a + c(lat31,lat32)*b + c(1,1)*c

lat2   =~ c(1,1)*F12_a + c(d1,d1)*F12_b
lat3   =~ c(1,1)*F12_d + c(e1,e1)*F12_e
lat4   =~ c(1,1)*F12_c
lat5   =~ c(1,1)*F12_g
lat6   =~ c(1,1)*F12_f

#errorterm variances
F12_c ~~ c(0.1581,0.1581)*F12_c
F12_f ~~ c(0.1246,0.1246)*F12_f
F12_g ~~ c(0.1068,0.1068)*F12_g
'

lavaan
.fit_weak1<-cfa(model.weak1, data=datensatz, group="gender")
survey
.fit_weak1<-lavaan.survey(lavaan.fit_weak1, svy.df)
summary
(survey.fit_weak1,fit.measures=TRUE,standardized=TRUE)


# invariance test accounting for survey design
lavTestLRT
( survey.fit_configural , survey.fit_weak1 , SB.classic = TRUE )

fit
.configural<-fitMeasures(survey.fit_configural, c("chisq","df", "pvalue","cfi"))
fit
.weak1<-fitMeasures(survey.fit_weak1, c("chisq","df", "pvalue","cfi"))
fit
.configural
fit
.weak1


#------------------------------------------------------------------------
# model2 - weak invariance 1st and 2nd order factor loadings

model
.weak2<-'
#measurement
a        =~ c(1,1)*F09_a + c(a1,a1)*F09_b + c(a2,a2)*F09_c
b        =~ c(1,1)*F10_a + c(b1,b1)*F10_b + c(b2,b2)*F10_c
c        =~ c(1,1)*F10_d + c(c1,c1)*F10_e
lat1     =~ c(lat2,lat2)*a + c(lat3,lat3)*b + c(1,1)*c

lat2   =~ c(1,1)*F12_a + c(d1,d1)*F12_b
lat3   =~ c(1,1)*F12_d + c(e1,e1)*F12_e
lat4   =~ c(1,1)*F12_c
lat5   =~ c(1,1)*F12_g
lat6   =~ c(1,1)*F12_f

#errorterm variances
F12_c ~~ 0.1581*F12_c
F12_f ~~ 0.1246*F12_f
F12_g ~~ 0.1068*F12_g
'

lavaan
.fit_weak2<-cfa(model.weak2, data=datensatz, group="gender")
survey
.fit_weak2<-lavaan.survey(lavaan.fit_weak2, svy.df)
summary
(survey.fit_weak2,fit.measures=TRUE,standardized=TRUE)


# invariance test accounting for survey design
lavTestLRT
( survey.fit_configural , survey.fit_weak2 , SB.classic = TRUE )
lavTestLRT
( survey.fit_weak1 , survey.fit_weak2 , SB.classic = TRUE )

fit
.configural<-fitMeasures(survey.fit_configural, c("chisq","df", "pvalue","cfi"))
fit
.weak1<-fitMeasures(survey.fit_weak1, c("chisq","df", "pvalue","cfi"))
fit
.weak2<-fitMeasures(survey.fit_weak2, c("chisq","df", "pvalue","cfi"))
fit
.configural
fit
.weak1
fit
.weak2

#------------------------------------------------------------------------
#model4 - strong invariance 1st & 2nd order loadings + item intercepts

model
.strong1<-'
#measurement
a        =~ c(1,1)*F09_a + c(a1,a1)*F09_b + c(a2,a2)*F09_c
b        =~ c(1,1)*F10_a + c(b1,b1)*F10_b + c(b2,b2)*F10_c
c        =~ c(1,1)*F10_d + c(c1,c1)*F10_e
lat1     =~ c(lat2,lat2)*a + c(lat3,lat3)*b + c(1,1)*c

lat2   =~ c(1,1)*F12_a + c(d1,d1)*F12_b
lat3   =~ c(1,1)*F12_d + c(e1,e1)*F12_e
lat4   =~ c(1,1)*F12_c
lat5   =~ c(1,1)*F12_g
lat6   =~ c(1,1)*F12_f

#errorterm variances
F12_c ~~ 0.1581*F12_c
F12_f ~~ 0.1246*F12_f
F12_g ~~ 0.1068*F12_g

#intercepts
F09_a ~ c(int11, int11)*1
F09_b ~ c(int21, int21)*1
F09_c ~ c(int31, int31)*1
F10_a ~ c(int41, int41)*1
F10_b ~ c(int51, int51)*1
F10_c ~ c(int61, int61)*1
F10_d ~ c(int71, int71)*1
F10_e ~ c(int81, int81)*1
F12_a ~ c(int13, int13)*1
F12_b ~ c(int23, int23)*1
F12_c ~ c(int33, int33)*1
F12_d ~ c(int43, int43)*1
F12_e ~ c(int53, int53)*1
F12_f ~ c(int63, int63)*1
F12_g ~ c(int73, int73)*1
'


lavaan
.fit_strong1<-cfa(model.strong1, data=datensatz, group="gender")
survey
.fit_strong1<-lavaan.survey(lavaan.fit_strong1, svy.df)
summary
(survey.fit_strong1,fit.measures=TRUE,standardized=TRUE)

# invariance test accounting for survey design
lavTestLRT
( survey.fit_configural , survey.fit_strong1 , SB.classic = TRUE )
lavTestLRT
( survey.fit_weak2 ,survey.fit_strong1, SB.classic = TRUE )

fit
.configural<-fitMeasures(survey.fit_configural, c("chisq","df", "pvalue","cfi"))
fit
.weak1<-fitMeasures(survey.fit_weak1, c("chisq","df", "pvalue","cfi"))
fit
.weak2<-fitMeasures(survey.fit_weak2, c("chisq","df", "pvalue","cfi"))
fit
.strong1<-fitMeasures(survey.fit_strong1, c("chisq","df", "pvalue","cfi"))
fit
.configural
fit
.weak1
fit
.weak2
fit
.strong1


#------------------------------------------------------------------------
#model5 - strong invariance 1st & 2nd order loadings + item intercepts & intercepts of first order factor intercepts (a,b,c)

model
.strong2<-'
#measurement
a        =~ c(1,1)*F09_a + c(a1,a1)*F09_b + c(a2,a2)*F09_c
b        =~ c(1,1)*F10_a + c(b1,b1)*F10_b + c(b2,b2)*F10_c
c        =~ c(1,1)*F10_d + c(c1,c1)*F10_e
lat1     =~ c(lat2,lat2)*a + c(lat3,lat3)*b + c(1,1)*c

lat2   =~ c(1,1)*F12_a + c(d1,d1)*F12_b
lat3   =~ c(1,1)*F12_d + c(e1,e1)*F12_e
lat4   =~ c(1,1)*F12_c
lat5   =~ c(1,1)*F12_g
lat6   =~ c(1,1)*F12_f

#errorterm variances
F12_c ~~ 0.1581*F12_c
F12_f ~~ 0.1246*F12_f
F12_g ~~ 0.1068*F12_g

#1st order factor intercepts / mean
a ~ c(inta,inta)*1
b ~ c(intb,intb)*1
c ~ c(intc,intc)*1

#intercepts
F09_a ~ c(int11, int11)*1
F09_b ~ c(int21, int21)*1
F09_c ~ c(int31, int31)*1
F10_a ~ c(int41, int41)*1
F10_b ~ c(int51, int51)*1
F10_c ~ c(int61, int61)*1
F10_d ~ c(int71, int71)*1
F10_e ~ c(int81, int81)*1
F12_a ~ c(int13, int13)*1
F12_b ~ c(int23, int23)*1
F12_c ~ c(int33, int33)*1
F12_d ~ c(int43, int43)*1
F12_e ~ c(int53, int53)*1
F12_f ~ c(int63, int63)*1
F12_g ~ c(int73, int73)*1
'


lavaan
.fit_strong2<-cfa(model.strong2, data=datensatz, group="gender")
survey
.fit_strong2<-lavaan.survey(lavaan.fit_strong2, svy.df)
summary
(survey.fit_strong2,fit.measures=TRUE,standardized=TRUE)

# invariance test accounting for survey design
lavTestLRT
( survey.fit_configural , survey.fit_strong2 , SB.classic = TRUE )
lavTestLRT
( survey.fit_strong1 ,survey.fit_strong2, SB.classic = TRUE )

fit
.configural<-fitMeasures(survey.fit_configural, c("chisq","df", "pvalue","cfi","rmsea"))
fit
.weak1<-fitMeasures(survey.fit_weak1, c("chisq","df", "pvalue","cfi","rmsea"))
fit
.weak2<-fitMeasures(survey.fit_weak2, c("chisq","df", "pvalue","cfi","rmsea"))
fit
.strong1<-fitMeasures(survey.fit_strong1, c("chisq","df", "pvalue","cfi","rmsea"))
fit
.strong2<-fitMeasures(survey.fit_strong2, c("chisq","df", "pvalue","cfi","rmsea"))
fit
.configural
fit
.weak1
fit
.weak2
fit
.strong1
fit
.strong2



Errror on Model 5:
> lavTestLRT( survey.fit_strong1 ,survey.fit_strong2, SB.classic = TRUE )
Scaled Chi Square Difference Test (method = "satorra.bentler.2001")


# Df   AIC   BIC  Chisq Chisq diff Df diff Pr(>Chisq)
# survey.fit_strong2 172 15264 15651 287.45                             
# survey.fit_strong1 175 15258 15633 287.45                  3          
# Warning message:
#  In lav_test_diff_SatorraBentler2001(mods[[m]], mods[[m + 1]]) :
#  lavaan WARNING: scaling factor is negative


Terrence Jorgensen

unread,
Jul 4, 2015, 9:02:39 AM7/4/15
to lav...@googlegroups.com
I don´t think, i will test strict invariance.

It isn't necessary for making inferences about latent parameters, so unless you are actually interested in testing heteroscedasticity of errors across genders, there is no reason to fit those models.
 
  • General comments on my code - did i do this right?
Looks like you have the idea. 
  • Should i test i.e. the strong invariance model against the configural model or against the weak invariance model?
Compare each one to the model immediately preceding it.  You test the hypothesis reflected by the difference between models, so if you compare the strong to the configural, it is a simultaneous test of equivalent scale and location parameters.
  • I´m not sure if i should use the marker variable apporach oder the fixed factor mean@0 / @1 approach for supplying a scale to my factors?
The marker variable method rests on the assumption that you have chosen an indicator that meets the assumptions of invariance (same loadings and and intercepts across groups).  Unless you have good reason to justify this assumption, I think it is better to use the fixed-factor method (remembering to free group-2's latent variances when you constrain factor loadings across groups, and to free group-2's factor means when you constrain intercepts across groups) -- or to use the effects-coding method.


  • If i use the marker variable appoach- when i set the first order factor interecepts equal (model 5), how do i prevent lavaan from giving a mean of zero to the factor? (that seems to be the lavaan-default) Should i use std.lv = FALSE and fix every other latent to zero? I get an error on model 5 (please see below)
You need to identify the location of the latent variable somehow.  When you constrain intercepts to equality across groups, you also need to free the latent means in the second group:

a + b + c ~ c(0, NA)*1

When you want to test the 2nd-order intercepts for equality, you go back to the default of fixing them all to zero (i.e., you are testing that they are all equal, and zero  is the value you choose in order to set the arbitrary location so the model is identified).
  • How do i handle single-indicator items? I can´t test any invariance for them, so they are the same for both groups anyway? I´ve fixed them to 10% of the observed variables´ variance (whole sample). Or should i estimate the variance for group A / group B seperatly?
You can impose equality constraints and see how they affect the fit of the model, but if the fit is worse, you can't tell whether it's because the loading or latent variance differs across groups.  The same holds for 2-indicator constructs: if the equality constraints hold, then you can assume invariance, but if they don't, then you don't have enough indicators to test which indicator's loading is actually different (or whether it is just the latent variance that differs).  You need three indicators to test more than the omnibus hypothesis.  You can test them in the models you have now, but you could also just test the equivalence of single-indicator constructs in a separate step (before or after testing measurement invariance of your just-identified constructs) -- it's arbitrary.

Terry

Message has been deleted

Niels

unread,
Jul 7, 2015, 5:38:33 AM7/7/15
to lav...@googlegroups.com
 Hi Terrence,

 i was so glad, when i read your post on saturday. Thank you very much for taking your time on this detailed and very helpful answer.  I learned a bunch of things and i hope, i can get unstuck with this step of my analysis now.
 You made me think about using fixed factor or marker-variable method for identification of my latents. I think, i will first use the fixed factor mean & variance method, to find out if the loadings i want to use are invariant. After that, i´ll switch to the marker variable approach, for better interpretation.

 I tried fitting a configural model with mean fixed to 0 and variance fixed to 1. But i get this error:

 "Error in getModifier(rhs[[2L]]) :
  lavaan ERROR: can not parse modifier:cNANA"





 Could you help me, figure out what i did wrong?
 Niels


 ####################################################
 
# Code for Configural model / lavaan 0.5-18
 
####################################################
 model
.configural<-'
 #measurement model

 lata        =~ c(NA, NA)*F09_a + c(a11,a12)*F09_a + c(a21,a22)*F09_b + c(a31,a32)*F09_c
 latb        =~ c(NA, NA)*F10_a + c(b11,b12)*F10_a + c(b21,b22)*F10_b + c(b31,b32)*F10_c
 latc        =~ c(NA, NA)*F10_d + c(c11,c12)*F10_d + c(c21,c22)*F10_e
 lat1     =~ c(NA, NA)*latc + c(l1,l2)*latc + (l3,l4)*lata + (l5,l6)*latb
 lat2   =~ c(NA, NA)*F12_a + c(d11,d12)*F12_a + c(d21,d22)*F12_b
 lat3   =~ c(NA, NA)*F12_d + c(e11,e12)*F12_d + c(e21,e22)*F12_e

 lat4   =~ c(1,1)*F12_c
 lat5   =~ c(1,1)*F12_g
 lat6   =~ c(1,1)*F12_f

 #single-indicator errorterm variances
 F12_c ~~ 0.1581*F12_c
 F12_f ~~ 0.1246*F12_f
 F12_g ~~ 0.1068*F12_g

 # latent means (fixed to zero in both groups until strong invariance)
 a ~ c(0,0)*1
 b ~ c(0,0)*1
 c ~ c(0,0)*1
 lat1 ~ c(0,0)*1
 lat2 ~ c(0,0)*1
 lat3 ~ c(0,0)*1
 lat4 ~ c(0,0)*1
 lat5 ~ c(0,0)*1
 lat6 ~ c(0,0)*1

 #latent variances (fixed to zero in both groups until strong invariance)
 lata ~ c(1,1)*lata
 latb ~ c(1,1)*latb
 latc ~ c(1,1)*latc
 lat1 ~~ c(1,1)*lat1
 lat2 ~~ c(1,1)*lat2
 lat3 ~~ c(1,1)*lat3
 lat4 ~~ c(1,1)*lat4
 lat5 ~~ c(1,1)*lat5
 lat6 ~~ c(1,1)*lat6
 '




 lavaan
.fit_configural<-cfa(model.configural, data=datensatz, group="gender")
 survey
.fit_configural<-lavaan.survey(lavaan.fit_configural, svy.df)
 summary
(survey.fit_configural,fit.measures=TRUE,standardized=TRUE)

Terrence Jorgensen

unread,
Jul 7, 2015, 6:03:38 AM7/7/15
to lav...@googlegroups.com
 "Error in getModifier(rhs[[2L]]) :
  lavaan ERROR: can not parse modifier:cNANA"

I'm not sure about this, but I *think* that you can't use the lines like this:

c(NA, NA)*F09_a

where both values are NA to indicate both groups should have free estimates.  I think that the syntax for fixing/freeing parameters needs at least one fixed parameter.  But you don't need that syntax anyway.  Just keep the ones with the labels for constraints, and when you call the cfa() function, include the argument "std.lv = TRUE" -- that will automatically fix latent variances to 1 and freely estimate all factor loadings, as opposed to the default behavior (std.lv = FALSE) of fixing the first loading to 1.  

In the configural model, using "std.lv = TRUE" means you also don't need lines like

lata ~ c(1,1)*lata

because the latent variances are fixed to 1 automatically.  But in the weak invariance models (when factor loadings are constrained across groups), you will need to free the variances in  the second group like this:

lata ~ c(1, NA)*lata

Terry

Niels

unread,
Jul 8, 2015, 1:56:32 PM7/8/15
to lav...@googlegroups.com
Hi Terrance,

i hope i´m not asking too much, but could you have a second look on this? I tried to make myself clear, how i should specify my model to test multigroup invariance with the second order factor (lat1) and reference group scaling.
Especially with model 4 and 5 (strong invariance) i´m not completely sure.

best regards,
Niels

#-----------------------------------------------------------------------------------------------------------------------------------

Multigroup Invariance (reference group method)




Modell 1 parameter Group A Group B
configural model



Item loadings free free

Item intercepts free free

second-order loadings free free

first order factor means 0 0

first order factor variance 1 1

second-order-factor mean 0 0

second-order-factor variance 1 1




Modell 2 parameter Group A Group B
weak 1 model



Item loadings = =

Item intercepts free free

second-order loadings free free

first order factor means 0 0

first order factor variance 1 free

second-order-factor mean 0 0

second-order-factor variance 1 1 (or also free?)




Modell 3 parameter Group A Group B
weak 2 model



Item loadings = =

Item intercepts free free

second-order loadings = =

first order factor means 0 0

first order factor variance 1 free

second-order-factor mean 0 0

second-order-factor variance 1 free




Modell 4 parameter Group A Group B
strong 1 model



Item loadings = =

Item intercepts  = =

second-order loadings = =

first order factor means 0 free

first order factor variance 1 free

second-order-factor mean 0 0

second-order-factor variance 1 free




Modell 5 parameter Group A Group B
strong 2 model



Item loadings = =

Item intercepts = =

second-order loadings = =

first order factor means 0 0

first order factor variance 1 free

second-order-factor mean 0 0

second-order-factor variance 1 free

Terrence Jorgensen

unread,
Jul 9, 2015, 4:42:42 AM7/9/15
to lav...@googlegroups.com
Good so far.
Yes, free Group-2's first-order factor variance, but  you need to keep both second-order factor variances fixed to 1 for the model to be identified.  You free the 2nd-order variance when you equate the second-order loadings.
Yes.
Yes.  But just so you know, the order of your Model 3 and Model 4 is arbitrary.  After equating first-order loadings, you can next equate either the intercepts or the 2nd-order loadings, followed by the other.  In either case, you compare the fit to the model in the previous step, so you only test one set of equality constraints at a time.
Almost.  Here, you are simultaneously testing whether first-order "means" (really, the intercepts of first-order latent variables) are equal across groups, AS WELL AS whether the means of  the 2nd-order latent variable are equal across groups.  Instead,  you need to test one set of constraints at a time.  So here, you equate the intercepts of first-order factors by fixing them all to zero, but you also free Group 2's 2nd-order factor mean.   Then, if you are interested, you can have a Model 6 to test whether 2nd-order latent means differ by fixing them both to zero again, and a Model 7 to test whether the 2nd-order latent variances differ by setting them both to 1 again.  (And as with Models 3 and 4, the order of testing 2nd-order latent means and 2nd-order latent variances is arbitrary.)

Terry

yleni...@gmail.com

unread,
Dec 28, 2015, 1:35:57 PM12/28/15
to lavaan
I noticed that the automatic settings of lavaan do something a bit different from this. Specifically, I don't understand why the latent variances for group 2 need to be freed in the weak invariance model. What is accomplished by doing this?

Ylenio

Terrence Jorgensen

unread,
Dec 30, 2015, 12:54:39 PM12/30/15
to lavaan
I don't understand why the latent variances for group 2 need to be freed in the weak invariance model. What is accomplished by doing this?

The only reason you fix the latent variances to 1 is to set an arbitrary scale for the latent construct.  It doesn't have to be the same -- you could fix it to 1 in the first group and 2 in the second group, but you probably don't have any reason to do that.  The only way to estimate from the data whether the latent variances differ across groups is to assume a 1-unit change in the latent variable produces the same amount of change (lambda) in an indicator for both groups, which corresponds to weak-invariance constraints on factor loadings.  If you constrain the factor loadings to equality without freeing the latent variances in all but 1 group (for scale-identification), then you are not testing weak invariance alone, but rather 2 hypotheses that should be treated independently: (a) are the factor loadings the same and (b) are the latent variances the same.  There is no theoretical reason to test both of those hypotheses in a single step.

Terry

Message has been deleted

Julia X

unread,
Oct 29, 2020, 6:49:27 AM10/29/20
to lavaan
Hi Niels,

could you send me the link to your blog? That would be great, thanks!

niels

unread,
Oct 31, 2020, 4:26:54 PM10/31/20
to lav...@googlegroups.com
Hi Julia, 
here is my blog, but i haven‘t written something for years and i‘m not sure if it‘s up to date with the current development. Is there anything specific you‘re looking for? https://statistics.ohlsen-web.de/

best
—niels


Von meinem Smartphone gesendet


Am 29.10.2020 um 11:49 schrieb Julia X <studen...@gmail.com>:

Hi Niels,
--
You received this message because you are subscribed to a topic in the Google Groups "lavaan" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/lavaan/i3ysXhrbgPU/unsubscribe.
To unsubscribe from this group and all its topics, send an email to lavaan+un...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/lavaan/46f895a2-d6ce-452f-96b7-8076ca4302efn%40googlegroups.com.

Julia X

unread,
Nov 16, 2020, 8:31:27 AM11/16/20
to lavaan
Thank you, Niels! :)

I am interested in the explanation of multigroup invariance testing for second-order factor (maybe with an example). Therefore, I asked for the link.
Reply all
Reply to author
Forward
0 new messages