defualt lavvan vs. Wu & Estabrook (2016) or Millsap & Tein (2004) for multiple-group measurement invaraince

40 views
Skip to first unread message

ahmad

unread,
Nov 19, 2025, 7:36:30 AM (2 days ago) Nov 19
to lavaan
Hi,

I want to conduct multiple-group measurement and structural models with categorical data (two latent factors with 7 categories [highly skewed] and one with 3 categories) using the WLSMV estimator. I tried the default options in lavaan (group.equal = "thresholds, loadings, intercepts"), and I also tested the Wu & Estabrook (2016) approach with ID.fac = "std.lv" and the Millsap & Tein (2004) approach using the measEq.syntax function. I have the following questions:

1. Can I use the default lavaan approach for my categorical model, specifying group.equal in the appropriate sequence for categorical indicators and fixing the marker method (e.g., configural → group = "sex"; then group.equal = "thresholds"; then group.equal = c("thresholds", "loadings"); then group.equal = c("thresholds", "loadings", "intercepts")), instead of using the newer identification approaches such as Wu & Estabrook (2016) or Millsap & Tein (2004)?

2. When I compared the three methods, the results were exactly the same for the default lavaan specification (using group.equal manually) and the Wu & Estabrook (2016) method with ID.fac = "std.lv", but both differed from the Millsap & Tein (2004) approach. Why did the first two methods yield identical results?

3. When I used measEq.syntax for Wu & Estabrook (2016) and Millsap & Tein (2004), I did not obtain robust versions of the fit indices (these were NA; only the standard and scaled versions were available). However, when I used group.equal manually, robust fit indices were provided. Why does this happen?

Best wishes,
A

Yves Rosseel

unread,
Nov 20, 2025, 11:31:25 AM (17 hours ago) Nov 20
to lav...@googlegroups.com
On 11/19/25 13:36, ahmad wrote:
> 1. Can I use the default lavaan approach for my categorical model,
> specifying group.equal in the appropriate sequence for categorical
> indicators and fixing the marker method (e.g., configural → group =
> "sex"; then group.equal = "thresholds"; then group.equal =
> c("thresholds", "loadings"); then group.equal = c("thresholds",
> "loadings", "intercepts"))

I would say: yes.

> 2. When I compared the three methods, the results were exactly the same
> for the default lavaan specification (using group.equal manually) and
> the Wu & Estabrook (2016) method with ID.fac = "std.lv"

Indeed. This has changed in recent versions of lavaan. The current
version (0.6-20) will 'mimic' the Wu & Estabrook (2016) approach by default.

> 3. When I used measEq.syntax for Wu & Estabrook (2016) and Millsap &
> Tein (2004), I did not obtain robust versions of the fit indices (these
> were NA; only the standard and scaled versions were available). However,
> when I used group.equal manually, robust fit indices were provided. Why
> does this happen?

Even if you use ID.fac = "std.lv" and get identical results/fit
measures? Then I don't know.

The 'usual' reason why you may get NA for the robust fit indices (in the
categorical case) is that the polychoric correlation matrix is not
positive definite, which unfortunately happens a lot. For the moment, we
have no way around it.

Yves.

--
Yves Rosseel
Department of Data Analysis, Ghent University

Message has been deleted

ahmad

unread,
Nov 20, 2025, 9:42:24 PM (7 hours ago) Nov 20
to lavaan
Thank you for your response, Prof. Rosseel.

Following up on the issue of obtaining NA values for robust fit indices when using measEq.syntax (versus using the default group.equal argument), I tried writing the syntax manually (not the syntax provided by measEq.syntax, and I again obtained NA values, similar to what happens with measEq.syntax.

You asked whether the NA values also occur when using ID.fac = "std.lv". Initially, I used the default approach with the marker method when specifying constraints manually using the group.equal argument, while I used ID.fac = "std.lv" with the Wu and Estabrook (2016) approach via measEq.syntax. I have now rerun the model using the default approach with std.lv = TRUE, and I obtained the same results. Although I am using lavaan.mi with multiply imputed data, it seems that whenever syntax is user-defined, either manually or via measEq.syntax, the model behaves differently. In many cases, the model fails to converge, gives warnings, or produces NA values for robust fit indices from my expericne. I am not sure, but there may be a bug (see below for the syntax and corresponding results).

For example, when comparing the default method and measEq.syntax using the syntax below, the default method produced robust fit indices, whereas measEq.syntax did not. As you can see, the model fit indices (i.e., both standard and scaled) were exactly the same. I also examined all factor loadings, thresholds, intercepts, variances, etc., and they were identical. This contradicts your suggestion that the most common reason for obtaining NA for robust fit indices is a non-positive definite covariance matrix. If that were the case, we should have seen NA values for robust fit indices even when using the default method. NA for robust fit indices is a very common problem. My results suggest that this issue might be due to writing the syntax (i.e., manually specifying the model or using measEq.syntax) versus using the default methods in lavaan, rather than being caused by model mis-specification.
default1.PNG
default.PNG

measEq.PNG
measEq2.PNG

I also have an additional question regarding this topic, and I would greatly appreciate your insight. I plan to conduct multiple-group SEM measurement invariance testing and then compare regression paths (direct, indirect, and total effects) across groups. In this context, I am unsure whether the marker method is compatible with Wu and Estabrook (2016)? and which identification method (marker vs. std.lv) is preferable for categorical indicators for thi purpose. When I used the marker method with Wu and Estabrook (2016) through measEq.syntax, the model did not converge. However, when I used the same model with ID.fac = "std.lv", it converged without any issues (with NA for robust fit indices), whereas when I used the same model with the marker method with the default approach, the model converged without any issue (with robust fit indices). 

Best wishes,
A

Reply all
Reply to author
Forward
0 new messages