Difference between standardized values

15 views
Skip to first unread message

Pierre-Charles Soulié

unread,
Mar 10, 2026, 10:35:23 AM (22 hours ago) Mar 10
to lavaan
Hi lavaan users,

I have a question regarding differences between a bifactor model and a second-order model estimated using the same covmat.

My covmat is specified to get a bifactor model with all loadings equal to 7.

When I estimated the bifactor on this covmat both my unstandardized and standardized values have a value of 7.

When I estimate a second-order model on the same covmat only the unstandardized values have the expected value of 7.

Why there is this difference with the second-order model ?

Thanks in advance for your helpful replies.

Hereunder is my syntax and the results.

library(lavaan)



lower <- '

1
0.98 1
0.98 0.98 1
0.49 0.49 0.49 1
0.49 0.49 0.49 0.98 1
0.49 0.49 0.49 0.98 0.98 1
0.49 0.49 0.49 0.49 0.49 0.49 1
0.49 0.49 0.49 0.49 0.49 0.49 0.98 1
0.49 0.49 0.49 0.49 0.49 0.49 0.98 0.98 1
0.49 0.49 0.49 0.49 0.49 0.49 0.49 0.49 0.49 1
0.49 0.49 0.49 0.49 0.49 0.49 0.49 0.49 0.49 0.98 1
0.49 0.49 0.49 0.49 0.49 0.49 0.49 0.49 0.49 0.98 0.98 1



'

model.cov <-
  getCov(lower, names = c("y1", "y2", "y3", "y4",
                          "y5", "y6","y7", "y8","y9","y10", "y11", "y12"))

model_bif <- '

g  =~ NA*y1 + y2 + y3 + y4 + y5 + y6 + y7 + y8 + y9+ y10 + y11 + y12
S1 =~ NA*y1 + y2 + y3
S2 =~ NA*y4 + y5 + y6
S3 =~ NA*y7 + y8 + y9
S4 =~ NA*y10 + y11 + y12

S1 + S2 + S3 + S4 ~~ 0*g
S1 + S2 + S3 ~~ 0*S4
S1 + S2 ~~ 0*S3
S1 ~~ 0*S2

g  ~~ 1*g
S1 ~~ 1*S1
S2 ~~ 1*S2
S3 ~~ 1*S3
S4 ~~ 1*S4'



model_sec <- '

S1 =~ NA*y1 + y2 + y3
S2 =~ NA*y4 + y5 + y6
S3 =~ NA*y7 + y8 + y9
S4 =~ NA*y10 + y11 + y12
g =~ NA*S1 + S2 + S3 + S4

S1 + S2 + S3 + S4 ~~ 0*g
S1 + S2 + S3 ~~ 0*S4
S1 + S2 ~~ 0*S3
S1 ~~ 0*S2

g  ~~ 1*g
S1 ~~ 1*S1
S2 ~~ 1*S2
S3 ~~ 1*S3
S4 ~~ 1*S4'



fit_bifactor <- sem(model_bif,
                    sample.cov = model.cov,
                    sample.nobs = 2000)
summary(fit_bifactor, fit.measures =TRUE, standardized = TRUE)


fit_second_order <- sem(model_sec,
                        sample.cov = model.cov,
                        sample.nobs = 2000)
summary(fit_second_order, fit.measures =TRUE, standardized = TRUE)


lavaan 0.6-21 ended normally after 137 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                        36

  Number of observations                          2000

Model Test User Model:
                                                     
  Test statistic                                 0.000
  Degrees of freedom                                42
  P-value (Chi-square)                           1.000

Model Test Baseline Model:

  Test statistic                             56204.876
  Degrees of freedom                                66
  P-value                                        0.000

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    1.000
  Tucker-Lewis Index (TLI)                       1.001

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -5946.085
  Loglikelihood unrestricted model (H1)      -5946.085
                                                     
  Akaike (AIC)                               11964.171
  Bayesian (BIC)                             12165.803
  Sample-size adjusted Bayesian (SABIC)      12051.429

Root Mean Square Error of Approximation:

  RMSEA                                          0.000
  90 Percent confidence interval - lower         0.000
  90 Percent confidence interval - upper         0.000
  P-value H_0: RMSEA <= 0.050                    1.000
  P-value H_0: RMSEA >= 0.080                    0.000

Standardized Root Mean Square Residual:

  SRMR                                           0.000

Parameter Estimates:

  Standard errors                             Standard
  Information                                 Expected
  Information saturated (h1) model          Structured

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  g =~                                                                  
    y1                0.700    0.022   31.797    0.000    0.700    0.700
    y2                0.700    0.022   31.797    0.000    0.700    0.700
    y3                0.700    0.022   31.797    0.000    0.700    0.700
    y4                0.700    0.022   31.797    0.000    0.700    0.700
    y5                0.700    0.022   31.797    0.000    0.700    0.700
    y6                0.700    0.022   31.797    0.000    0.700    0.700
    y7                0.700    0.022   31.797    0.000    0.700    0.700
    y8                0.700    0.022   31.797    0.000    0.700    0.700
    y9                0.700    0.022   31.797    0.000    0.700    0.700
    y10               0.700    0.022   31.797    0.000    0.700    0.700
    y11               0.700    0.022   31.797    0.000    0.700    0.700
    y12               0.700    0.022   31.797    0.000    0.700    0.700
  S1 =~                                                                
    y1                0.700    0.015   45.191    0.000    0.700    0.700
    y2                0.700    0.015   45.191    0.000    0.700    0.700
    y3                0.700    0.015   45.191    0.000    0.700    0.700
  S2 =~                                                                
    y4                0.700    0.015   45.191    0.000    0.700    0.700
    y5                0.700    0.015   45.191    0.000    0.700    0.700
    y6                0.700    0.015   45.191    0.000    0.700    0.700
  S3 =~                                                                
    y7                0.700    0.015   45.191    0.000    0.700    0.700
    y8                0.700    0.015   45.191    0.000    0.700    0.700
    y9                0.700    0.015   45.191    0.000    0.700    0.700
  S4 =~                                                                
    y10               0.700    0.015   45.191    0.000    0.700    0.700
    y11               0.700    0.015   45.191    0.000    0.700    0.700
    y12               0.700    0.015   45.191    0.000    0.700    0.700

Covariances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  g ~~                                                                  
    S1                0.000                               0.000    0.000
    S2                0.000                               0.000    0.000
    S3                0.000                               0.000    0.000
    S4                0.000                               0.000    0.000
  S1 ~~                                                                
    S4                0.000                               0.000    0.000
  S2 ~~                                                                
    S4                0.000                               0.000    0.000
  S3 ~~                                                                
    S4                0.000                               0.000    0.000
  S1 ~~                                                                
    S3                0.000                               0.000    0.000
  S2 ~~                                                                
    S3                0.000                               0.000    0.000
  S1 ~~                                                                
    S2                0.000                               0.000    0.000

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
    g                 1.000                               1.000    1.000
    S1                1.000                               1.000    1.000
    S2                1.000                               1.000    1.000
    S3                1.000                               1.000    1.000
    S4                1.000                               1.000    1.000
   .y1                0.020    0.001   20.000    0.000    0.020    0.020
   .y2                0.020    0.001   20.000    0.000    0.020    0.020
   .y3                0.020    0.001   20.000    0.000    0.020    0.020
   .y4                0.020    0.001   20.000    0.000    0.020    0.020
   .y5                0.020    0.001   20.000    0.000    0.020    0.020
   .y6                0.020    0.001   20.000    0.000    0.020    0.020
   .y7                0.020    0.001   20.000    0.000    0.020    0.020
   .y8                0.020    0.001   20.000    0.000    0.020    0.020
   .y9                0.020    0.001   20.000    0.000    0.020    0.020
   .y10               0.020    0.001   20.000    0.000    0.020    0.020
   .y11               0.020    0.001   20.000    0.000    0.020    0.020
   .y12               0.020    0.001   20.000    0.000    0.020    0.020

>
>
> fit_second_order <- sem(model_sec,
+                         sample.cov = model.cov,
+                         sample.nobs = 2000)
> summary(fit_second_order, fit.measures =TRUE, standardized = TRUE)
lavaan 0.6-21 ended normally after 133 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                        28

  Number of observations                          2000

Model Test User Model:
                                                     
  Test statistic                                 0.000
  Degrees of freedom                                50
  P-value (Chi-square)                           1.000

Model Test Baseline Model:

  Test statistic                             56204.876
  Degrees of freedom                                66
  P-value                                        0.000

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    1.000
  Tucker-Lewis Index (TLI)                       1.001

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -5946.085
  Loglikelihood unrestricted model (H1)      -5946.085
                                                     
  Akaike (AIC)                               11948.171
  Bayesian (BIC)                             12104.996
  Sample-size adjusted Bayesian (SABIC)      12016.038

Root Mean Square Error of Approximation:

  RMSEA                                          0.000
  90 Percent confidence interval - lower         0.000
  90 Percent confidence interval - upper         0.000
  P-value H_0: RMSEA <= 0.050                    1.000
  P-value H_0: RMSEA >= 0.080                    0.000

Standardized Root Mean Square Residual:

  SRMR                                           0.000

Parameter Estimates:

  Standard errors                             Standard
  Information                                 Expected
  Information saturated (h1) model          Structured

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  S1 =~                                                                
    y1                0.700    0.015   45.746    0.000    0.990    0.990
    y2                0.700    0.015   45.746    0.000    0.990    0.990
    y3                0.700    0.015   45.746    0.000    0.990    0.990
  S2 =~                                                                
    y4                0.700    0.015   45.746    0.000    0.990    0.990
    y5                0.700    0.015   45.746    0.000    0.990    0.990
    y6                0.700    0.015   45.746    0.000    0.990    0.990
  S3 =~                                                                
    y7                0.700    0.015   45.746    0.000    0.990    0.990
    y8                0.700    0.015   45.746    0.000    0.990    0.990
    y9                0.700    0.015   45.746    0.000    0.990    0.990
  S4 =~                                                                
    y10               0.700    0.015   45.746    0.000    0.990    0.990
    y11               0.700    0.015   45.746    0.000    0.990    0.990
    y12               0.700    0.015   45.746    0.000    0.990    0.990
  g =~                                                                  
    S1                1.000    0.043   23.126    0.000    0.707    0.707
    S2                1.000    0.043   23.126    0.000    0.707    0.707
    S3                1.000    0.043   23.126    0.000    0.707    0.707
    S4                1.000    0.043   23.126    0.000    0.707    0.707

Covariances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
 .S1 ~~                                                                
    g                 0.000                               0.000    0.000
 .S2 ~~                                                                
    g                 0.000                               0.000    0.000
 .S3 ~~                                                                
    g                 0.000                               0.000    0.000
 .S4 ~~                                                                
    g                 0.000                               0.000    0.000
 .S1 ~~                                                                
   .S4                0.000                               0.000    0.000
 .S2 ~~                                                                
   .S4                0.000                               0.000    0.000
 .S3 ~~                                                                
   .S4                0.000                               0.000    0.000
 .S1 ~~                                                                
   .S3                0.000                               0.000    0.000
 .S2 ~~                                                                
   .S3                0.000                               0.000    0.000
 .S1 ~~                                                                
   .S2                0.000                               0.000    0.000

Edward Rigdon

unread,
Mar 10, 2026, 10:58:39 AM (22 hours ago) Mar 10
to lav...@googlegroups.com
What happened to the residual variances for the observed variables in
the second order case? What do you get if you ask for R2 in both
cases?
> --
> You received this message because you are subscribed to the Google Groups "lavaan" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to lavaan+un...@googlegroups.com.
> To view this discussion visit https://groups.google.com/d/msgid/lavaan/f9634fb9-32b8-45f8-9a73-91944b7fb39dn%40googlegroups.com.

Edward Rigdon

unread,
Mar 10, 2026, 11:09:45 PM (10 hours ago) Mar 10
to lav...@googlegroups.com
In the second order model, the "variances" of the four first order
factors are residual variances, not total variances. When you refer to
the variances of the first order factors, you are actually referencing
the part of the variances not explained by the second order factor.
The dot '.' in front of the parameter estimate, in the output,
indicates this. You may need to code using nonlinear
constraints--label your parameters and then apply constraints so that
you actually constrain the first order variables total variances to 1,
not their residual variances.

Here is an example of what I mean. I wanted to constrain total
variances to 1 where there was a structural model with f1 predicting
f2 and f2 predicting f3. I achieved that by constraining the residual
variance of f2, labeled c, to be equal to 1 - the squared path from f1
to f2. Since I was constraining the variance of f1 to 1, this
constraint made the total variance of f2 also 1. And the same for f3.

model.std<-'
f1=~NA*y1+y2+y3
f2=~NA*y4+y5+y6
f3=~NA*y7+y8+y9
f2~a*f1
f3~b*f2
f1~~1*f1
f2~~c*f2
f3~~d*f3
c == 1 - a^2
d == 1 - b^2'

I think you can use a similar approach. Good luck.

On Tue, Mar 10, 2026 at 10:35 AM Pierre-Charles Soulié
<souli...@gmail.com> wrote:
>
Reply all
Reply to author
Forward
0 new messages