CFI=1 and RMSEA=0: is this a problem?

886 views
Skip to first unread message

Josie K

unread,
Oct 6, 2023, 6:31:56 PM10/6/23
to lavaan
I would really appreciate help/ advice with this!

I've done a CFA to validate a scale I created. I used the WLSMV estimator (diagonally weighted least squares) because my data are ordinal and non-normal (due to floor effects). 

The scale is 10 items, 5 of which are positive ("I feel empowered") and 5 negative ("I feel worthless"). 

The fit for CFI and RMSEA seems too good to be true for a two-factor model (positive is one factor, negative is the other). My question is whether this is a problem and indicates something wrong. I've put the results below.

Sample size = 452
Chi squared = 24.621
Degrees of freedom = 34
SRMR = 0.038
P value = .881
CFI = 1
RMSEA = 0.000


Here's the code in case I've made a mistake there!

model <- '
Positive =~ F_Positive_Validated + F_Positive_Understood + F_Positive_Empowered + F_Positive_Relieved + F_Positive_Understandable
Negative =~ F_Negative_Worthless + F_Negative_Distressed + F_Negative_Frustrated + F_Negative_Overwhelmed + F_Negative_Wrong
'

cfaModel <- cfa(model = model,     
                 data = data2,        
                 estimator = "WLSMV")

Shu Fai Cheung (張樹輝)

unread,
Oct 6, 2023, 8:35:20 PM10/6/23
to lavaan
To analyze ordinal variables, using the argument ordered and let lavaan set other options for us is more reliable than setting the estimator manually:


The ordinal variables will not be treated as ordinal if you just use estimator = "WLSMV". You can use lavInspect(cfaMode, "ordered")to check the analysis. I believe the result is character(0), showing that no variables were treated as ordinal.

Regards,
Shu Fai

Prof. Gavin Brown

unread,
Oct 6, 2023, 8:47:01 PM10/6/23
to lavaan
In my experience when x2 is less than df (as in your case x2=25, df=34), the CFI will be 1.00 and the RMSEA will be .000
this happens because the discrepancy between the data and the model is so small. 

Josie K

unread,
Oct 6, 2023, 9:12:22 PM10/6/23
to lavaan
Hi Shu Fai,

Thank you so much for explaining this! You were completely right that I got  character(0). I think your solution fixed the problem.

I now get
chisq df pvalue cfi srmr rmsea 92.997 34.000 0.000 0.998 0.044 0.062

Shu Fai Cheung (張樹輝)

unread,
Oct 6, 2023, 11:42:22 PM10/6/23
to lavaan
Did you use fit.measures() to get the fit measures? If yes, you should read the values named cfi.robust, tli.robust, rmsea.robust, etc..

A more friendly way to read the fit measures is calling summary() and set fit.measures = TRUE. E.g.,

summary(cfaModel, fit.measures = TRUE)

Hope this helps.

-- Shu Fai
Reply all
Reply to author
Forward
0 new messages