Confirmatory Factor Analysis (CFA)
Wikipedia describes confirmatory factor analysis (CFA) as a particular form of factor analysis used to test whether a construct’s measures are consistent with the nature of that construct. CFA tests whether data fits a hypothesised measurement model.
This vignette performs a CFA on the irrational belief scale and reviews model fit.
In their book A New Guide to Rational Living, authors Ellis and Harper describe 10 irrational ideas that influence an individual’s emotions and behaviours. These irrational ideas were measured in 10 public and private sector organisations implementing organisational change using the “Irrational belief scale”, gathering 593 usable responses.
The raw data set was wrangled before processing. Conducted a brief exploratory analysis comprising a statistical summary, visualisation and correlation analysis to understand the manifest variables.
The CFA process commenced by building and fitting a base model. After reviewing base model fit statistics and modification indices, revised the model to refine the fit. Compared fit statistics for both models against targets to arrive at a preferred model for this data set.
Chart 1 illustrates the distribution of responses for each of the 20 manifest variables.
Table 1 is a statistical summary for each of the 20 manifest variables.
| vars | n | mean | sd | median | trimmed | mad | min | max | range | skew | kurtosis | se | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ii01.c | 1 | 593 | 3.55 | 1.74 | 3 | 3.51 | 1.48 | 1 | 7 | 6 | 0.24 | -1.31 | 0.07 |
| ii01.r | 2 | 593 | 4.87 | 1.60 | 5 | 4.99 | 1.48 | 1 | 7 | 6 | -0.70 | -0.54 | 0.07 |
| ii02.a | 3 | 593 | 3.38 | 1.81 | 3 | 3.31 | 1.48 | 1 | 7 | 6 | 0.46 | -1.23 | 0.07 |
| ii02.o | 4 | 593 | 4.76 | 1.64 | 5 | 4.86 | 1.48 | 1 | 7 | 6 | -0.66 | -0.67 | 0.07 |
| ii03.d | 5 | 593 | 3.02 | 1.45 | 3 | 2.93 | 1.48 | 1 | 7 | 6 | 0.69 | -0.26 | 0.06 |
| ii03.l | 6 | 593 | 3.40 | 1.60 | 3 | 3.33 | 1.48 | 1 | 7 | 6 | 0.31 | -0.90 | 0.07 |
| ii04.h | 7 | 593 | 3.85 | 1.52 | 4 | 3.85 | 1.48 | 1 | 7 | 6 | -0.13 | -1.20 | 0.06 |
| ii04.n | 8 | 593 | 3.52 | 1.46 | 3 | 3.47 | 1.48 | 1 | 7 | 6 | 0.16 | -1.22 | 0.06 |
| ii05.b | 9 | 593 | 3.85 | 1.63 | 4 | 3.84 | 1.48 | 1 | 7 | 6 | -0.02 | -1.17 | 0.07 |
| ii05.q | 10 | 593 | 3.86 | 1.62 | 4 | 3.85 | 1.48 | 1 | 7 | 6 | 0.00 | -1.24 | 0.07 |
| ii06.f | 11 | 593 | 4.90 | 1.39 | 5 | 5.08 | 1.48 | 1 | 7 | 6 | -0.84 | -0.35 | 0.06 |
| ii06.m | 12 | 593 | 3.22 | 1.52 | 3 | 3.16 | 1.48 | 1 | 7 | 6 | 0.39 | -1.03 | 0.06 |
| ii07.i | 13 | 593 | 2.57 | 1.30 | 2 | 2.42 | 1.48 | 1 | 7 | 6 | 1.07 | 0.57 | 0.05 |
| ii07.s | 14 | 593 | 1.96 | 1.00 | 2 | 1.81 | 0.00 | 1 | 7 | 6 | 1.93 | 5.71 | 0.04 |
| ii08.e | 15 | 593 | 2.96 | 1.52 | 2 | 2.87 | 1.48 | 1 | 7 | 6 | 0.64 | -0.82 | 0.06 |
| ii08.k | 16 | 593 | 2.68 | 1.39 | 2 | 2.56 | 1.48 | 1 | 7 | 6 | 0.92 | -0.13 | 0.06 |
| ii09.j | 17 | 593 | 4.33 | 1.56 | 5 | 4.40 | 1.48 | 1 | 7 | 6 | -0.38 | -1.01 | 0.06 |
| ii09.t | 18 | 593 | 4.68 | 1.73 | 5 | 4.77 | 1.48 | 1 | 7 | 6 | -0.53 | -0.88 | 0.07 |
| ii10.g | 19 | 593 | 4.45 | 1.59 | 4 | 4.46 | 1.48 | 1 | 7 | 6 | -0.21 | -0.76 | 0.07 |
| ii10.p | 20 | 593 | 3.66 | 1.34 | 4 | 3.61 | 1.48 | 1 | 7 | 6 | 0.10 | -0.81 | 0.06 |
Chart 2 is a box plot of the 20 manifest variables explaining the 10 latent factors. Measures have median values ranging from “2” to “5”.
Chart 3 is a correlation heatmap of irrational ideas. Correlation coefficients are mostly positive, ranging from -0.03 to 0.58. Chart 3 shows that all items measuring the same latent factor are moderately correlated except for ii05, with a correlation coefficient of 0.16.
The base model has 10 latent factors consistent with the irrational ideas theoretical framework. Chart 4 path diagram shows correlations between the 10 latent factors and standardised loadings between latent factors and their respective manifest variables.
Note: Please magnify the screen to see Chart 4 in greater detail.
Chart 4 shows an out-of-bounds correlation between latent factors ii05 (managing feelings) and ii10 (passive existence) with a coefficient of 1.04. Out-of-bounds correlations between latent factors are addressed by respecifying the model.
Improving model fit is an iterative process of reassigning and removing redundant items where appropriate, guided by theoretical concepts. Reviewed model statistics and modification indices to understand ways to improve fit. To maintain the theoretical framework and retain the 10 latent factors, removed the item with the poorest loading (ii05.b) from the model. Chart 5 shows that standardised loadings for the remaining manifest variables in Model 2 are moderate, and correlations between latent factors are now within bounds.
Note: Please magnify the screen to see Chart 5 in greater detail.
Table 2 summarises the relationship between latent factors and manifest variables for Model 2.
| latent factor | item | estimate | std.err | z-value | p-value | std.all |
|---|---|---|---|---|---|---|
| ii01 | ii01.c | 1.2083 | 0.0841 | 14.3655 | 0 | 0.6938 |
| ii01 | ii01.r | 0.8619 | 0.0730 | 11.8137 | 0 | 0.5382 |
| ii02 | ii02.a | 1.0228 | 0.0900 | 11.3615 | 0 | 0.5666 |
| ii02 | ii02.o | 1.0037 | 0.0839 | 11.9584 | 0 | 0.6123 |
| ii03 | ii03.d | 0.9934 | 0.0694 | 14.3074 | 0 | 0.6838 |
| ii03 | ii03.l | 1.0565 | 0.0759 | 13.9251 | 0 | 0.6594 |
| ii04 | ii04.h | 1.1239 | 0.0600 | 18.7252 | 0 | 0.7406 |
| ii04 | ii04.n | 1.1360 | 0.0574 | 19.8079 | 0 | 0.7801 |
| ii05 | ii05.q | 1.6183 | 0.0470 | 34.4384 | 0 | 1.0000 |
| ii06 | ii06.f | 0.5741 | 0.0689 | 8.3333 | 0 | 0.4124 |
| ii06 | ii06.m | 0.9742 | 0.0904 | 10.7784 | 0 | 0.6394 |
| ii07 | ii07.i | 0.5477 | 0.0701 | 7.8125 | 0 | 0.4224 |
| ii07 | ii07.s | 0.6115 | 0.0653 | 9.3675 | 0 | 0.6146 |
| ii08 | ii08.e | 0.9648 | 0.0683 | 14.1338 | 0 | 0.6364 |
| ii08 | ii08.k | 1.0949 | 0.0652 | 16.7933 | 0 | 0.7897 |
| ii09 | ii09.j | 1.1324 | 0.0753 | 15.0316 | 0 | 0.7279 |
| ii09 | ii09.t | 0.9974 | 0.0792 | 12.5991 | 0 | 0.5775 |
| ii10 | ii10.g | 1.0104 | 0.0702 | 14.3907 | 0 | 0.6352 |
| ii10 | ii10.p | 0.9548 | 0.0603 | 15.8461 | 0 | 0.7112 |
Chart 6 qq-plot shows the residuals for Model 2. The residuals fall mainly on a straight line, within the 0.95 confidence level.
Compared fit for both models. Output 1 shows that both models have similar and acceptable fit statistics. However, Model 2 is slightly better overall, with improved absolute and relative fit statistics.
Note: Fit measure targets: CFI, TLI, GFI > 0.90 | RMSEA, SRMR < 0.05 | model with lowest AIC and BIC.
Output 1 Comparison of model fit
####################### Model Fit Indices ###########################
chisq df pvalue cfi tli gfi rmsea srmr aic
ii_cfa_fit2 267.549† 108 .000 .937† .900† .953† .050 .037† 38877.682†
ii_cfa_fit1 301.047 125 .000 .933 .898 .949 .049† .038 41065.716
bic
ii_cfa_fit2 39237.268†
ii_cfa_fit1 41438.458
Finally, assessed the overall reliability and internal consistency of the scale. The standardised Cronbach’s alpha for the revised scale (α = 0.8427) and the original scale (α = 0.8464) were similar, and being above 0.80, were considered to be very good.
Reference:
Irrational ideas were measured using the ‘Irrational belief scale’ developed by Malouff and Schutte, published in the Sourcebook of Adult Assessment Strategies, based on Ellis and Harper’s work, published in A New Guide to Rational Living.
## ─ Session info ───────────────────────────────────────────────────────────────
## setting value
## version R version 4.4.0 (2024-04-24 ucrt)
## os Windows 11 x64 (build 22631)
## system x86_64, mingw32
## ui RTerm
## language (EN)
## collate English_Australia.utf8
## ctype English_Australia.utf8
## tz Australia/Brisbane
## date 2024-07-29
## pandoc 3.1.11 @ C:/Program Files/RStudio/resources/app/bin/quarto/bin/tools/ (via rmarkdown)
##
## ─ Packages ───────────────────────────────────────────────────────────────────
## ! package * version date (UTC) lib source
## abind 1.4-5 2016-07-21 [1] CRAN (R 4.4.0)
## arm 1.14-4 2024-04-01 [1] CRAN (R 4.4.0)
## backports 1.5.0 2024-05-23 [1] CRAN (R 4.4.0)
## base64enc 0.1-3 2015-07-28 [1] CRAN (R 4.4.0)
## boot 1.3-30 2024-02-26 [2] CRAN (R 4.4.0)
## bslib 0.7.0 2024-03-29 [1] CRAN (R 4.4.0)
## cachem 1.1.0 2024-05-16 [1] CRAN (R 4.4.0)
## car * 3.1-2 2023-03-30 [1] CRAN (R 4.4.0)
## carData * 3.0-5 2022-01-06 [1] CRAN (R 4.4.0)
## checkmate 2.3.1 2023-12-04 [1] CRAN (R 4.4.0)
## cli 3.6.3 2024-06-21 [1] CRAN (R 4.4.1)
## cluster 2.1.6 2023-12-01 [2] CRAN (R 4.4.0)
## coda 0.19-4.1 2024-01-31 [1] CRAN (R 4.4.0)
## codetools 0.2-20 2024-03-31 [2] CRAN (R 4.4.0)
## colorspace 2.1-0 2023-01-23 [1] CRAN (R 4.4.1)
## corpcor 1.6.10 2021-09-16 [1] CRAN (R 4.4.0)
## data.table * 1.15.4 2024-03-30 [1] CRAN (R 4.4.0)
## devtools 2.4.5 2022-10-11 [1] CRAN (R 4.4.0)
## digest 0.6.36 2024-06-23 [1] CRAN (R 4.4.1)
## dplyr * 1.1.4 2023-11-17 [1] CRAN (R 4.4.0)
## ellipsis 0.3.2 2021-04-29 [1] CRAN (R 4.4.0)
## emmeans 1.10.3 2024-07-01 [1] CRAN (R 4.4.1)
## estimability 1.5.1 2024-05-12 [1] CRAN (R 4.4.0)
## evaluate 0.24.0 2024-06-10 [1] CRAN (R 4.4.0)
## fansi 1.0.6 2023-12-08 [1] CRAN (R 4.4.0)
## farver 2.1.2 2024-05-13 [1] CRAN (R 4.4.0)
## fastmap 1.2.0 2024-05-15 [1] CRAN (R 4.4.0)
## fdrtool 1.2.17 2021-11-13 [1] CRAN (R 4.4.0)
## forcats * 1.0.0 2023-01-29 [1] CRAN (R 4.4.0)
## foreign 0.8-86 2023-11-28 [2] CRAN (R 4.4.0)
## Formula 1.2-5 2023-02-24 [1] CRAN (R 4.4.0)
## fs 1.6.4 2024-04-25 [1] CRAN (R 4.4.0)
## generics 0.1.3 2022-07-05 [1] CRAN (R 4.4.0)
## GGally * 2.2.1 2024-02-14 [1] CRAN (R 4.4.0)
## ggplot2 * 3.5.1 2024-04-23 [1] CRAN (R 4.4.0)
## ggstats 0.6.0 2024-04-05 [1] CRAN (R 4.4.0)
## glasso 1.11 2019-10-01 [1] CRAN (R 4.4.0)
## glue 1.7.0 2024-01-09 [1] CRAN (R 4.4.0)
## gridExtra 2.3 2017-09-09 [1] CRAN (R 4.4.0)
## gtable 0.3.5 2024-04-22 [1] CRAN (R 4.4.0)
## gtools 3.9.5 2023-11-20 [1] CRAN (R 4.4.0)
## here * 1.0.1 2020-12-13 [1] CRAN (R 4.4.0)
## highr 0.11 2024-05-26 [1] CRAN (R 4.4.0)
## Hmisc 5.1-3 2024-05-28 [1] CRAN (R 4.4.0)
## hms 1.1.3 2023-03-21 [1] CRAN (R 4.4.0)
## htmlTable 2.4.3 2024-07-21 [1] CRAN (R 4.4.1)
## htmltools 0.5.8.1 2024-04-04 [1] CRAN (R 4.4.0)
## htmlwidgets 1.6.4 2023-12-06 [1] CRAN (R 4.4.0)
## httpuv 1.6.15 2024-03-26 [1] CRAN (R 4.4.0)
## igraph 2.0.3 2024-03-13 [1] CRAN (R 4.4.0)
## jpeg 0.1-10 2022-11-29 [1] CRAN (R 4.4.0)
## jquerylib 0.1.4 2021-04-26 [1] CRAN (R 4.4.0)
## jsonlite 1.8.8 2023-12-04 [1] CRAN (R 4.4.0)
## kableExtra * 1.4.0 2024-01-24 [1] CRAN (R 4.4.0)
## knitr 1.48 2024-07-07 [1] CRAN (R 4.4.1)
## kutils 1.73 2023-09-17 [1] CRAN (R 4.4.0)
## labeling 0.4.3 2023-08-29 [1] CRAN (R 4.4.0)
## later 1.3.2 2023-12-06 [1] CRAN (R 4.4.0)
## lattice 0.22-6 2024-03-20 [2] CRAN (R 4.4.0)
## lavaan * 0.6-18 2024-06-07 [1] CRAN (R 4.4.0)
## lifecycle 1.0.4 2023-11-07 [1] CRAN (R 4.4.0)
## likert 1.3.5 2016-12-31 [1] CRAN (R 4.4.0)
## lisrelToR 0.3 2024-02-07 [1] CRAN (R 4.4.0)
## lme4 1.1-35.5 2024-07-03 [1] CRAN (R 4.4.1)
## lubridate * 1.9.3 2023-09-27 [1] CRAN (R 4.4.0)
## magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.4.0)
## MASS 7.3-60.2 2024-04-24 [2] local
## Matrix 1.7-0 2024-03-22 [2] CRAN (R 4.4.0)
## memoise 2.0.1 2021-11-26 [1] CRAN (R 4.4.0)
## mi 1.1 2022-06-06 [1] CRAN (R 4.4.0)
## mime 0.12 2021-09-28 [1] CRAN (R 4.4.0)
## miniUI 0.1.1.1 2018-05-18 [1] CRAN (R 4.4.0)
## minqa 1.2.7 2024-05-20 [1] CRAN (R 4.4.0)
## mnormt 2.1.1 2022-09-26 [1] CRAN (R 4.4.0)
## multcomp 1.4-26 2024-07-18 [1] CRAN (R 4.4.1)
## munsell 0.5.1 2024-04-01 [1] CRAN (R 4.4.0)
## mvtnorm 1.2-5 2024-05-21 [1] CRAN (R 4.4.0)
## nlme 3.1-164 2023-11-27 [2] CRAN (R 4.4.0)
## nloptr 2.1.1 2024-06-25 [1] CRAN (R 4.4.1)
## nnet 7.3-19 2023-05-03 [2] CRAN (R 4.4.0)
## OpenMx 2.21.11 2023-11-28 [1] CRAN (R 4.4.0)
## openxlsx 4.2.6.1 2024-07-23 [1] CRAN (R 4.4.1)
## pbapply 1.7-2 2023-06-27 [1] CRAN (R 4.4.0)
## pbivnorm 0.6.0 2015-01-23 [1] CRAN (R 4.4.0)
## pillar 1.9.0 2023-03-22 [1] CRAN (R 4.4.0)
## pkgbuild 1.4.4 2024-03-17 [1] CRAN (R 4.4.0)
## pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.4.0)
## pkgload 1.4.0 2024-06-28 [1] CRAN (R 4.4.1)
## plyr 1.8.9 2023-10-02 [1] CRAN (R 4.4.0)
## png 0.1-8 2022-11-29 [1] CRAN (R 4.4.0)
## profvis 0.3.8 2023-05-02 [1] CRAN (R 4.4.0)
## promises 1.3.0 2024-04-05 [1] CRAN (R 4.4.0)
## psych * 2.4.6.26 2024-06-27 [1] CRAN (R 4.4.1)
## purrr * 1.0.2 2023-08-10 [1] CRAN (R 4.4.0)
## qgraph 1.9.8 2023-11-03 [1] CRAN (R 4.4.0)
## quadprog 1.5-8 2019-11-20 [1] CRAN (R 4.4.0)
## R6 2.5.1 2021-08-19 [1] CRAN (R 4.4.0)
## RColorBrewer 1.1-3 2022-04-03 [1] CRAN (R 4.4.0)
## Rcpp 1.0.13 2024-07-17 [1] CRAN (R 4.4.1)
## D RcppParallel 5.1.8 2024-07-06 [1] CRAN (R 4.4.1)
## readr * 2.1.5 2024-01-10 [1] CRAN (R 4.4.0)
## remotes 2.5.0 2024-03-17 [1] CRAN (R 4.4.0)
## reshape2 1.4.4 2020-04-09 [1] CRAN (R 4.4.0)
## rlang 1.1.4 2024-06-04 [1] CRAN (R 4.4.0)
## rmarkdown 2.27 2024-05-17 [1] CRAN (R 4.4.0)
## rockchalk 1.8.157 2022-08-06 [1] CRAN (R 4.4.0)
## rpart 4.1.23 2023-12-05 [2] CRAN (R 4.4.0)
## rprojroot 2.0.4 2023-11-05 [1] CRAN (R 4.4.0)
## rstudioapi 0.16.0 2024-03-24 [1] CRAN (R 4.4.0)
## sandwich 3.1-0 2023-12-11 [1] CRAN (R 4.4.0)
## sass 0.4.9 2024-03-15 [1] CRAN (R 4.4.0)
## scales 1.3.0 2023-11-28 [1] CRAN (R 4.4.0)
## sem 3.1-15 2022-04-10 [1] CRAN (R 4.4.0)
## semPlot * 1.1.6 2022-08-10 [1] CRAN (R 4.4.0)
## semTools * 0.5-6 2022-05-10 [1] CRAN (R 4.4.0)
## sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.4.0)
## shiny 1.8.1.1 2024-04-02 [1] CRAN (R 4.4.0)
## stringi 1.8.4 2024-05-06 [1] CRAN (R 4.4.0)
## stringr * 1.5.1 2023-11-14 [1] CRAN (R 4.4.0)
## survival 3.5-8 2024-02-14 [2] CRAN (R 4.4.0)
## svglite 2.1.3 2023-12-08 [1] CRAN (R 4.4.0)
## systemfonts 1.1.0 2024-05-15 [1] CRAN (R 4.4.0)
## TH.data 1.1-2 2023-04-17 [1] CRAN (R 4.4.0)
## tibble * 3.2.1 2023-03-20 [1] CRAN (R 4.4.0)
## tidyr * 1.3.1 2024-01-24 [1] CRAN (R 4.4.0)
## tidyselect 1.2.1 2024-03-11 [1] CRAN (R 4.4.0)
## tidyverse * 2.0.0 2023-02-22 [1] CRAN (R 4.4.0)
## timechange 0.3.0 2024-01-18 [1] CRAN (R 4.4.0)
## tzdb 0.4.0 2023-05-12 [1] CRAN (R 4.4.0)
## urlchecker 1.0.1 2021-11-30 [1] CRAN (R 4.4.0)
## usethis 2.2.3 2024-02-19 [1] CRAN (R 4.4.0)
## utf8 1.2.4 2023-10-22 [1] CRAN (R 4.4.0)
## vctrs 0.6.5 2023-12-01 [1] CRAN (R 4.4.0)
## viridisLite 0.4.2 2023-05-02 [1] CRAN (R 4.4.0)
## withr 3.0.0 2024-01-16 [1] CRAN (R 4.4.0)
## xfun 0.46 2024-07-18 [1] CRAN (R 4.4.1)
## XML 3.99-0.17 2024-06-25 [1] CRAN (R 4.4.1)
## xml2 1.3.6 2023-12-04 [1] CRAN (R 4.4.0)
## xtable 1.8-4 2019-04-21 [1] CRAN (R 4.4.0)
## yaml 2.3.9 2024-07-05 [1] CRAN (R 4.4.1)
## zip 2.3.1 2024-01-27 [1] CRAN (R 4.4.0)
## zoo 1.8-12 2023-04-13 [1] CRAN (R 4.4.0)
##
## [1] C:/Users/wayne/AppData/Local/R/win-library/4.4
## [2] C:/Program Files/R/R-4.4.0/library
##
## D ── DLL MD5 mismatch, broken installation.
##
## ──────────────────────────────────────────────────────────────────────────────