# How to free the first indicator in a CFA, and set equality constraint with other parameters?

I want to test Tau-Equivalence in a CFA model, under LAVAAN. If I don't free the first item in a factor, it will be automatically set to 1 (reference indicator), so I fixed the factor variance to 1, and freed the loading linking the first indicator to the factor:

model <- 'F1 =~ NA * x1 +  x2 + x3
F2 =~ x4 + x5 + x6
F1 ~~ 1 * F1'


Now, in order to test for Tau-Equivalence, I need to give identical names to x1, x2 and x3. I tried:

model <- 'F1 =~ NA * b1 * x1 +  b1 * x2 + b1 * x3
F2 =~ x4 + x5 + x6
F1 ~~ 1 * F1'


Fitting that model produced:

fit <- cfa(model2, sample.cov=covmat, sample.nobs=200)

Latent Variables:
Estimate  Std.Err  z-value  P(>|z|)
F1 =~
x1        (b1)    1.000
x2        (b1)    1.000
x3        (b1)    1.000
F2 =~
x4                1.000
x5                1.023    0.060   17.071    0.000
x6                1.023    0.061   16.821    0.000


I get the exact same result if I don't free the loading for x1.

How should I define the model in order to test a condition such as tau-equivalence, in LAVAAN?

Thanks for any help!

Just a quick add-on, in case anyone else has a similar question:

If you want to estimate the first indicator freely in a (essentially) tau-equivalent model you have to automatically estimate all indicators freely since you have this equality constraint of the factor loadings in tau equivalent models. This means the variance of the factor needs to be fixed to 1, otherwise the model is not identified. This is shown by Daniel Coulombe:

tau.eq <- 'F1 =~ a*x1 + a*x2 + a*x3  # This model is tau-equivalent
F2 =~ x4 + x5 + x6        # This model is not tau-equivalent'
# "a" is just a random name to tell lavaan the unstandardized factor loadings
# are fixed to the same value

model <- cfa(tau.eq, data = data, std.lv = TRUE)
summary(model, standardized=TRUE)


However, you could also want to estimate the variance of your factor in the model (i.e. not set the variances of the factors to 1). Then you would have to set the unstandardized factor loadings of all of your items to 1.

tau.eq <- 'F1 =~ 1*x1 + 1*x2 + 1*x3
F2 =~ x4 + x5 + x6'

model <- cfa(tau.eq, data = data, std.lv = FALSE)
summary(model, standardized=TRUE)


Any other factors in this model (when std.lv = FALSE) will automatically be identified via a scaling indicator which in lavaan by default is the first indicator of that factor.

These two models shown here are identical. It just depends what type of information you are interested in. However, once you set standardized=TRUE in your summary command you will automatically also get the estimates for when your latent variables are standardized, even if you set std.lv = FALSE.

Using the std.lv = TRUE argument to the cfa() command did the trick. The command looks like:

model <- 'F1 =~ v1x1 + v1x2 + v1*x3 F2 =~ x4 + x5 + x6'

fit <- cfa(model, sample.cov=covmat, sample.nobs=200, std.lv = TRUE)