Hi,
I have followed a few threads on here that have been really helpful:
and have made much use of your slides here:
thank you, but just need some further clarification on lavaan default constraints for assessing measurement invariance with ordinal indicators. In particular, I have one ordinal indicator that is the sole indicator of a latent, and another which sits alongside two continuous indicators; I believe I need to deal with these differently and that is where I come unstuck.
My model is as follows:
mod <- "
f1 =~ 1*ordx1
f2 =~ 1* contx2
f3 =~ 1*contx3
f4 =~ 1*contx4
f5 =~ contx5a + contx5b + ordx5c
f6 =~ 1* contx6
# error variances of continuous single indicators predetermined using reliability
contx2 ~~ ev2*contx2
contx3 ~~ ev2*contx3
contx4 ~~ ev2*contx4
contx6 ~~ ev2*contx6
# choosing to allow identification of single ordinal ordx1 by fixing indicator variance at 0 and latent (residual) variance as 1:
ordx1 ~~ 0*ordx1
f1 ~~ 1*f1 "
I fit this using
fit <- cfa(mod, data, estimator="WLSMV",
std.lv=T)
Question 1: the single ordinal, ordx1, has 4 categories (3 thresholds). The intercept of this is fixed at 0 - do I need to fix the intercept at all? What default call to cfa does/undoes this? I had assumed this was because a numerical intercept of a categorical variable made no theoretical sense, until I begin testing for metric invariance and found that I needed to free the intercepts when constraining thresholds to equivalence across groups.
And so to invariance: I check in the following order as advised in the threads above and by Wu & Esterbrook:
configural -> thresholds -> thresholds and loadings (metric) -> thresholds, loadings and intercepts (scalar)
and constrain thresholds and free intercepts by adding the following:
" ordx1 | c(oa1, oa1)*t1 + c(ob1, ob1)*t2 + c(oc1, oc1)*t3
ordx5c | c(qa1, qa1)*t1 + c(qb1, qb1)*t2
ordx1 ~ c(NA1,NA2)*1
ordx5c | c(NA3,NA4)*1 "
Question 2: should I free the intercepts of the two ordinal variables as above in the model syntax or is there an argument to the cfa function? The other manifest variable intercepts are already free and I want the latent means to remain constrained to 0, I think.
Having done this, constraining loadings (only the three on f5) to fully test metric invariance is fine. Moving on to scalar invariance, is it sufficient now to use "group.equal="intercepts" in the cfa call? From your slides:
" Free identification constraints on common factor means, except for 1 reference category; set v=0 in reference category for identification, so impose equivalence by fixing v=0 in all contexts"
I'm not sure what this means, but by simply using group.equal="intercepts", I estimate a negative variance in ordx1 in one group (0 in the other) - I'm pretty sure this is user error!
Question 3: in order to add constraints on intercepts, should I have released some others? Should I treat the single indicator (ordx1) differently to that with other continuous indicators (ord5c)?
I'd be really grateful for any further insight you can offer, many thanks.
Rebecca