Exploratory Factor Analysis Workflow

Prepare and check ordinal items

The example creates three simulated domains with explicit reverse keys.

set.seed(2401)
latent <- matrix(stats::rnorm(300 * 3), ncol = 3)
ordinal_items <- as.data.frame(sapply(seq_len(12), function(j) {
  as.integer(cut(0.8 * latent[, ceiling(j / 4)] + stats::rnorm(300, sd = 0.6),
                 breaks = c(-Inf, -1, -0.3, 0.3, 1, Inf), labels = FALSE))
}))
names(ordinal_items) <- sprintf("item%02d", 1:12)
attr(ordinal_items, "reverse_keys") <- c("item03", "item07", "item11")
ordinal_items[attr(ordinal_items, "reverse_keys")] <-
  lapply(ordinal_items[attr(ordinal_items, "reverse_keys")], function(x) 6L - x)
attr(ordinal_items, "factor_structure") <- list(
  factor1 = names(ordinal_items)[1:4], factor2 = names(ordinal_items)[5:8],
  factor3 = names(ordinal_items)[9:12]
)

items <- PsychoMatic::reverse_items(
  ordinal_items,
  items = attr(ordinal_items, "reverse_keys"),
  min_score = 1,
  max_score = 5,
  overwrite = TRUE
)
specification <- PsychoMatic::psychomatic_spec(
  items,
  level = "ordinal",
  missing = "available",
  language = "eng"
)

An explicit ordered declaration prevents integer codes from carrying more meaning than the researcher intended. Item membership still requires substantive judgment.

Reliability is not dimensionality

reliability <- PsychoMatic::reliability_auto(
  items,
  items = attr(ordinal_items, "factor_structure")$factor1,
  level = "ordinal",
  language = "eng"
)
#> 
#> ================================================================================
#> RELIABILITY
#> ================================================================================
#> 
#> DATA AND METHOD
#> N: 300
#> Items: 4
#> Complete: 300
#> Measurement: ordinal
#> Keying: none
#> 
#> RELIABILITY COEFFICIENTS
#>  group       factor             coefficient      estimate status   reason 
#>  Data sample All selected items Alpha (Cronbach) 0.854    Adequate >= 0.70
#>  Data sample All selected items Ordinal alpha    0.877    Adequate >= 0.70
#>  Data sample All selected items Omega            0.855    Adequate >= 0.70
#> 
#> ITEM ANALYSIS: RELIABILITY IF DELETED
#>  item   N cases Item-rest r Alpha if deleted Ordinal alpha if deleted
#>  item01 300     0.738       0.796            0.827                   
#>  item02 300     0.679       0.821            0.848                   
#>  item03 300     0.673       0.824            0.851                   
#>  item04 300     0.694       0.815            0.843                   
#>  Omega if deleted
#>  0.795           
#>  0.820           
#>  0.823           
#>  0.815           
#> 
#> COMPUTATION AND INTERPRETATION
#> Alpha (Cronbach): k/(k-1) * (1 - sum of item variances / variance of the sum).
#> Uses the raw covariance matrix with pairwise available observations.
#> 
#> Ordinal alpha applies the alpha formula to the polychoric matrix. Its estimand
#> is the continuous latent-response scale, not the observed score.
#> 
#> Omega: single-factor congeneric model (ML for continuous data; WLSMV for
#> ordinal data), without equal-loading constraints. Ordinal omega targets
#> observed-score reliability using Green and Yang's correction. It does not
#> establish unidimensionality or good model fit.
#> 
#> Corrected item-total correlation excludes the item from the sum and uses
#> full-scale complete cases. Alpha uses pairwise observations; omega uses
#> complete cases per fit. Item deletion refits omega and may change N. A
#> coefficient increase alone does not justify deleting an item.
#> 
#> Selected-item alpha and model factor coefficients may refer to different
#> scores. Overall alpha does not establish unidimensionality.
#> 
#> 
#> REFERENCES
#> Cronbach, L. J. (1951). Coefficient alpha and the internal structure of tests.
#> Psychometrika, 16, 297-334. https://doi.org/10.1007/BF02310555
#> 
#> Green, S. B., & Yang, Y. (2009). Reliability of summed item scores using
#> structural equation modeling: An alternative to coefficient alpha.
#> Psychometrika, 74(1), 155-167. https://doi.org/10.1007/s11336-008-9099-3
#> 
#> Jorgensen, T. D., Pornprasertmanit, S., Schoemann, A. M., & Rosseel, Y. (2026).
#> semTools: Useful tools for structural equation modeling (Version 0.5.10) [R
#> package]. https://CRAN.R-project.org/package=semTools
#> 
#> McDonald, R. P. (1999). Test theory: A unified treatment. Lawrence Erlbaum
#> Associates.
#> 
#> Zumbo, B. D., Gadermann, A. M., & Zeisser, C. (2007). Ordinal versions of
#> coefficients alpha and theta for Likert rating scales. Journal of Modern
#> Applied Statistical Methods, 6(1), 21-29.
#> https://doi.org/10.22237/jmasm/1177992180
summary(reliability)$coefficients
#>   group factor    coefficient  estimate                  estimand
#> 1  <NA>   <NA> alpha_observed 0.8537928            observed_score
#> 2  <NA>   <NA>  alpha_ordinal 0.8768378           latent_response
#> 3  <NA>   <NA>          omega 0.8552822 observed_score_congeneric
#>                   matrix keying status reason diagnostic_value
#> 1         raw_covariance   none     ok   <NA>     0.853792....
#> 2             polychoric   none     ok   <NA>     0.876837....
#> 3 ordinal_observed_score   none     ok   <NA>     0.855282....

The example estimates reliability within the first known simulated domain, not across the three-domain item set. reliability_auto() labels each coefficient’s estimand and correlation basis. Coefficient alpha, ordinal alpha, and omega rely on different assumptions and none demonstrates unidimensionality or validity by itself.

EFA with non-destructive screening

efa <- PsychoMatic::efa_auto(
  specification,
  rotation = "oblique",
  refine = "suggest",
  parallel_iter = 500,
  seed = 2401,
  verbose = FALSE,
  language = "eng"
)
summary(efa)$loadings
summary(efa)$decisions

This model-fitting chunk is not evaluated during vignette construction because polychoric estimation plus parallel simulation can be slow on constrained CRAN workers. refine = "suggest" retains all items and reports flags; automatic removal is not a replacement for content review or cross-validation. Loading, communality, cross-loading, KMO, Bartlett, and retention cutoffs are heuristics. Inspect requested/effective correlation methods, missing-case counts, repaired status, conditions, and any not_evaluable configuration before interpreting the factor solution.