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 a selection of maladaptive defence mechanisms cited in organisational literature and reviews model fit.
Based on a literature review of psychoanalytic processes within organisations, selected eight maladaptive defence mechanisms for investigation. These maladaptive defence mechanisms (latent factors) were: dissociation, displacement, isolation of affect, reaction formation, denial, projection, passive aggression and acting out. Items to measure these eight defences were sourced from “The defense style questionnaire”. Two items were selected from this scale to measure each defence, resulting in a survey instrument containing 16 items.
The survey instrument was implemented in 10 public and private sector organisations implementing organisational change, gathering 604 usable responses.
The raw data set was wrangled and tidied 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 the base model fit and modification indices, built a revised model to refine the fit. Compared fit statistics for both models against targets to arrive at a model with an improved and acceptable fit.
Chart 1 illustrates the distribution of responses for each of the 16 manifest variables.
Table 1 is a statistical summary for each of the 16 manifest variables.
| vars | n | mean | sd | median | trimmed | mad | min | max | range | skew | kurtosis | se | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| diss.e | 1 | 604 | 2.40 | 1.33 | 2 | 2.18 | 0.00 | 1 | 7 | 6 | 1.43 | 1.67 | 0.05 |
| diss.g | 2 | 604 | 2.90 | 1.43 | 2 | 2.80 | 1.48 | 1 | 7 | 6 | 0.70 | -0.49 | 0.06 |
| disp.o | 3 | 604 | 2.59 | 1.38 | 2 | 2.43 | 1.48 | 1 | 7 | 6 | 0.94 | 0.14 | 0.06 |
| disp.p | 4 | 604 | 3.38 | 1.75 | 3 | 3.32 | 1.48 | 1 | 7 | 6 | 0.29 | -1.25 | 0.07 |
| isaf.q | 5 | 604 | 3.49 | 1.79 | 3 | 3.45 | 1.48 | 1 | 7 | 6 | 0.23 | -1.31 | 0.07 |
| isaf.t | 6 | 604 | 3.33 | 1.59 | 3 | 3.27 | 1.48 | 1 | 7 | 6 | 0.32 | -1.09 | 0.06 |
| refo.c | 7 | 604 | 3.55 | 1.89 | 3 | 3.49 | 1.48 | 1 | 7 | 6 | 0.28 | -1.24 | 0.08 |
| refo.l | 8 | 604 | 4.76 | 1.42 | 5 | 4.88 | 1.48 | 1 | 7 | 6 | -0.60 | -0.40 | 0.06 |
| deni.d | 9 | 604 | 2.67 | 1.37 | 2 | 2.52 | 1.48 | 1 | 7 | 6 | 0.97 | 0.12 | 0.06 |
| deni.h | 10 | 604 | 2.18 | 1.24 | 2 | 1.96 | 1.48 | 1 | 7 | 6 | 1.57 | 2.48 | 0.05 |
| proj.b | 11 | 604 | 2.54 | 1.24 | 2 | 2.39 | 0.00 | 1 | 7 | 6 | 1.15 | 0.74 | 0.05 |
| proj.m | 12 | 604 | 2.50 | 1.27 | 2 | 2.37 | 1.48 | 1 | 7 | 6 | 0.92 | 0.18 | 0.05 |
| paag.j | 13 | 604 | 2.15 | 1.24 | 2 | 1.93 | 1.48 | 1 | 7 | 6 | 1.69 | 2.96 | 0.05 |
| paag.s | 14 | 604 | 2.97 | 1.35 | 2 | 2.86 | 1.48 | 1 | 7 | 6 | 0.74 | -0.21 | 0.05 |
| acou.f | 15 | 604 | 3.74 | 1.65 | 4 | 3.72 | 1.48 | 1 | 7 | 6 | 0.05 | -1.30 | 0.07 |
| acou.i | 16 | 604 | 3.33 | 1.59 | 3 | 3.28 | 1.48 | 1 | 7 | 6 | 0.31 | -1.12 | 0.06 |
Chart 2 box plot shows the distribution for each of the 16 manifest variables explaining the eight latent factors. Measures have median values ranging from “2” to “5”.
Chart 3 maladaptive defence mechanisms correlation heatmap calculates coefficients ranging from -0.12 to 0.48. All pairs of items measuring the same latent factor are reasonably correlated except for reaction formation (refo) and denial (deni), with correlation coefficients of 0.07.
The base model was built on the eight maladaptive defence mechanisms under investigation. Chart 4 path diagram shows correlations between the eight latent factors and standardised loadings between latent factors and their respective manifest variables for this data set.
Note: Please magnify the screen to see Chart 4 in greater detail.
Reviewed standardised loadings and modification indices for Model 1. The latent factors “denial” and particularly “reaction formation” had comparatively poor standardised loadings with their manifest variables.
Improving model fit is an iterative process of reassigning and removing redundant items where appropriate, guided by theoretical concepts. Respecified the model in a number of different ways. Removing the “reaction formation” manifest variables resulted in a high out-of-bounds correlation between “denial” and “dissociation”, indicating multicollinearity or a strong similarity between these two factors. For an improved fit, “denial” was removed from the scale for two reasons. First, because of a poor standardised loading item, and second another latent factor, dissociation, was capturing the measure.
Chart 5 illustrates the revised model. The standardised loadings between latent factors and their manifest variables in Model 2 were mainly moderate.
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 |
|---|---|---|---|---|---|---|
| dissociation | diss.e | 0.7793 | 0.0929 | 8.3859 | 0 | 0.5854 |
| dissociation | diss.g | 0.5684 | 0.0800 | 7.1029 | 0 | 0.3984 |
| displacement | disp.o | 0.9093 | 0.1197 | 7.5983 | 0 | 0.6578 |
| displacement | disp.p | 0.4567 | 0.0889 | 5.1373 | 0 | 0.2605 |
| isolationaffect | isaf.q | 0.9653 | 0.1007 | 9.5877 | 0 | 0.5388 |
| isolationaffect | isaf.t | 1.1199 | 0.1032 | 10.8512 | 0 | 0.7065 |
| projection | proj.b | 0.7785 | 0.0563 | 13.8203 | 0 | 0.6281 |
| projection | proj.m | 0.9644 | 0.0602 | 16.0249 | 0 | 0.7614 |
| pass.aggress. | paag.j | 0.4903 | 0.0605 | 8.1066 | 0 | 0.3958 |
| pass.aggress. | paag.s | 0.8155 | 0.0781 | 10.4470 | 0 | 0.6058 |
| actingout | acou.f | 0.9985 | 0.0940 | 10.6257 | 0 | 0.6042 |
| actingout | acou.i | 0.9592 | 0.0903 | 10.6169 | 0 | 0.6033 |
Chart 6 qq-plot shows the residuals for Model 2. The residuals mostly fall within the 0.95 confidence level.
Compared fit for both models. Output 1 shows, based on this data set, Model 2 is preferred 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
dmmal_cfa_fit2 85.618† 39 .000 .949† .913† .978† .044† .036† 25191.798†
dmmal_cfa_fit1 202.990 76 .000 .901 .843 .960 .053 .050 33616.234
bic
dmmal_cfa_fit2 25363.537†
dmmal_cfa_fit1 33880.448
Finally, assessed the overall reliability and internal consistency of the scale. There was a slight improvement in the standardised Cronbach’s alpha for the revised model. Internal consistency and reliability increased from α = 0.6865 in Model 1 to α = 0.6921 in Model 2. This measure of scale reliability was moderate and acceptable.
Reference:
Maladaptive defence mechanisms were measured using selected items from ‘The Defense Style Questionnaire’ by Andrews, Singh and Bond, published in The Journal of Nervous and Mental Disease.
## ─ 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.
##
## ──────────────────────────────────────────────────────────────────────────────