What is the difference between srmr and srmr_bollen fit measures?

508 views
Skip to first unread message

Jacek Bieliński

unread,
Oct 6, 2017, 9:14:56 AM10/6/17
to lavaan
Sorry, but googled around and could not find the answer: what is the difference between srmr and srmr_bollen fit measures reported by lava an package?

Best regards,
Jacek

Terrence Jorgensen

unread,
Oct 9, 2017, 4:24:04 AM10/9/17
to lavaan

what is the difference between srmr and srmr_bollen fit measures reported by lava an package?

The default SRMR is calculated using Bollen's formula (found in his 1989 book), which first standardized both the observed and model-implied covariance matrices, then subtracts them to calculate standardized residuals (differences between observed and expected correlations).  So in lavaan's fitMeasures(), you will always see the same value for srmr and srmr_bollen.  

resid(fit, type = "cor")
resid(fit, type = "cor.bollen")

SRMR can also be caculated using Bentler's formula (found in his EQS manual), which first calculates unstandardized covariance residuals, then standardized them using the model-implied variances. Sort of arbitrary, and often makes little to no difference in practice unless constraints are put on residual variances, so that the model-implied variances are not identical to observed variances.

resid(fit, type = "cor.bentler")

I like Bentler's formula because it includes information about misspecification regarding variance estimates.  Bollen's formula will always return zeros on the diagonal because it subtracts 2 correlation matrices, so it is a bit less informative.  However, Bentler's method standardizes differences relative to model-implied variances only, whereas Bollen's method standardizes each matrix relative to its own diagonal elements.  Again, it's probably of little consequence in practice, but Mplus uses Bentler's formula for diagonal elements and Bollen's formula for off-diagonal elements (srmr_mplus).

Terrence D. Jorgensen
Postdoctoral Researcher, Methods and Statistics
Research Institute for Child Development and Education, the University of Amsterdam


Mark Seeto

unread,
Dec 5, 2017, 8:19:28 PM12/5/17
to lavaan
On Monday, October 9, 2017 at 7:24:04 PM UTC+11, Terrence Jorgensen wrote:
So in lavaan's fitMeasures(), you will always see the same value for srmr and srmr_bollen.  

 
As far as I can see, this is not correct. For example:


model <- '
  # measurement model
    ind60 =~ x1 + x2 + x3
    dem60 =~ y1 + y2 + y3 + y4
    dem65 =~ y5 + y6 + y7 + y8
  # regressions
    dem60 ~ ind60
    dem65 ~ ind60 + dem60
  # residual correlations
    y1 ~~ y5
    y2 ~~ y4 + y6
    y3 ~~ y7
    y4 ~~ y8
    y6 ~~ y8
'

fit <- sem(model, data=PoliticalDemocracy)

fitMeasures(fit, c("srmr", "srmr_bentler", "srmr_bollen"))

##  srmr srmr_bentler  srmr_bollen 
## 0.044        0.044        0.045

Terrence Jorgensen

unread,
Dec 7, 2017, 8:42:56 AM12/7/17
to lavaan
As far as I can see, this is not correct. 

Woops, you're right.  Defaults depend on other options, as well, but the Bentler one seems to be used most often.  See lines 1121-1135 in the source code for details:

Reply all
Reply to author
Forward
0 new messages