Page 1 of 1

BI-Factor EFA

Posted: Fri Dec 26, 2025 9:24 am
by ecelik
Hello,

I replicated the bifactor EFA example from Muthén & Muthén using SEMLj (jamovi). While all fit indices are identical to the Mplus results, I observe small differences in factor loadings and standard errors.

The SEMLj syntax used is:

Code: Select all

efa("efa1")*FG +
efa("efa1")*FF1 +
efa("efa1")*FF2 =~
y1 + y2 + y3 + y4 + y5 + y65 + y6 + y7 + y8 + y9 + y10
FG  ~~ 0*FF1
FG  ~~ 0*FF2
FF1 ~~ 0*FF2
Rotation: Geomin
Geomin epsilon: 0.0001

The model specifies a bifactor structure with one general factor (FG) and two specific factors (FF1, FF2), constrained to be orthogonal.

Given that the fit indices are identical, could the small discrepancies in loadings and SEs be attributed to:
  • Numerical optimization in Geomin rotation
  • Differences in starting values or rotation algorithms (GPA vs. Mplus defaults)
  • Factor scaling or sign indeterminacy
  • Numerical computation of standard errors
Is it expected in bifactor EFA / ESEM frameworks that parameter estimates differ slightly while model fit remains identical?

Any insights would be greatly appreciated.

Thank you.

Mplus: https://www.statmodel.com/usersguide/chap5/ex5.29.html
SEMLj: https://drive.google.com/file/d/1ceoDYC ... sp=sharing

Re: BI-Factor EFA

Posted: Sat Dec 27, 2025 10:52 pm
by mcfanda@gmail.com
I do not have access to Mplus (it's not open source). Did you try to check the results with R lavaan?

Re: BI-Factor EFA

Posted: Mon Jan 05, 2026 9:11 am
by ecelik
Dear Prof. Gallucci,
Thank you very much for your response.
Yes — I replicated the analysis in R using lavaan.
I'm sharing the lavaan and SEMLj syntax I used with you.
I’d be very grateful for suggestions.
Thanks again!

Code: Select all

#SEMlj Bifactor ESEM
efa("efa1")*FG +efa("efa1")*FF1 +efa("efa1")*FF2 
=~y1 + y2 + y3 + y4 + y5 +y6 + y7 + y8 + y9 + y10
FG  ~~ 0*FF1
FG  ~~ 0*FF2
FF1 ~~ 0*FF2

Code: Select all

#lavaan Bifactor ESEM
#Read  data Mplus example  bi-factor EFA
ex5.29 <- read.table("http://statmodel.com/usersguide/chap5/ex5.29.dat")
names(ex5.29) = paste0("y",1:10)

#install packages
library(lavaan)
library(lavaanPlot)
library(GPArotation)
library(semTools)

#Define EFA block
model.BESEM <- '
  efa("efa1")*FG +
  efa("efa1")*F1 +
  efa("efa1")*F2 =~ y1+y2+y3+y4+y5+y6+y7+y8+y9+y10
  '
#fit.BESEM
fit.BESEM <- cfa(
  model = model.BESEM,
  data = ex5.29,
  estimator = "ML",
  rotation = "bigeomin",
  rotation.args = list(
    rstarts = 30,
    algorithm = "gpa",
    orthogonal = TRUE,
    std.ov = TRUE,
    geomin.epsilon = 0.0001
  ),
)
  summary(fit.BESEM, standardized = TRUE)
  #BifactorESEM graph 
  lavaanPlot(name = "BifactorESEM",
             model = fit.BESEM)

Re: BI-Factor EFA

Posted: Mon Jan 05, 2026 9:18 am
by ecelik

Re: BI-Factor EFA

Posted: Thu Jan 08, 2026 11:21 pm
by mcfanda@gmail.com
What was the correspondence between lavaan and SEMLj?