Skip to contents

nomo_efa() estimates a common-factor exploratory factor analysis while keeping the consequential analytical choices visible. Oblique rotation is the default, item-level diagnostics are framed as prompts for inspection, and no item is automatically deleted or model silently refit.

Usage

nomo_efa(
  data,
  items = NULL,
  factors,
  factor_count = NULL,
  rotation = "oblimin",
  fm = "minres",
  correlation = NULL,
  types = NULL,
  missing = NULL,
  smooth = NULL,
  guidance = nomo_defaults()
)

Arguments

data

A data frame containing candidate items.

items

Optional character vector identifying item columns. If factors is a nomo_factors object and items = NULL, its item set is inherited. Otherwise all columns are used when items = NULL.

factors

A positive integer number of factors to extract, or a nomo_factors object. For a nomo_factors object, the selected parallel-analysis factor count is used unless factor_count is supplied.

factor_count

Optional positive integer. This may be supplied only when factors is a nomo_factors object. It keeps that result's items, modeling types, correlations, and missing-data handling while recording a researcher-selected factor count, rather than implying that the parallel-analysis suggestion was adopted.

rotation

Rotation passed to psych::fa(). The default is "oblimin". Orthogonal rotations are allowed but are recorded as a researcher choice.

fm

Common-factor extraction method passed to psych::fa(). The default is "minres". Supported values are "minres", "uls", "ols", "wls", "gls", "pa", "ml", "minchi", "minrank", "alpha", and "old.min".

correlation

Optional correlation strategy: "auto", "pearson", "polychoric", "tetrachoric", or "mixed". If NULL, the value is inherited from a supplied nomo_factors object when possible; otherwise "auto" is used.

types

Optional named character vector declaring selected items as "continuous", "ordinal", or "binary". If NULL, modeling types are inherited from a supplied nomo_factors object when possible; otherwise they are inferred using the same conservative rules as nomo_factors().

missing

Optional missing-data strategy: "pairwise" or "complete". If NULL, the value is inherited from a supplied nomo_factors object when possible; otherwise "pairwise" is used.

smooth

Optional logical. If NULL (default), smoothing is inherited from a supplied nomo_factors object when that object explicitly used smoothing; otherwise FALSE. If FALSE, a non-positive-definite correlation matrix stops the analysis. If TRUE, psych::cor.smooth() is used explicitly and the intervention is recorded.

guidance

Guidance settings from nomo_defaults().

Value

An object of class nomo_efa. The fields to read are:

  • items, n_factors, and factor_source, which records whether the count was the researcher's or taken from a nomo_factors result.

  • correlation_method and correlation_matrix: the correlations analyzed.

  • pattern_matrix, structure_matrix, and factor_correlations.

  • communalities, uniquenesses, and complexity.

  • item_summary: one row per item, with its primary and secondary loadings, communality, flags, and the explanation of any flag.

  • residual_matrix, residual_pairs, and rmsr: local misfit.

  • sample_adequacy: sample size, KMO, and Bartlett's test.

  • decision_log.

Other fields record the call, the settings used, and intermediate engine results. They may change between releases and are not part of the stable interface (see ?nomologR).

Details

The factor count may be supplied directly as a positive integer or by passing a nomo_factors object. When a nomo_factors object is supplied, its primary parallel-analysis suggestion is used as the requested EFA factor count and, unless overridden, its item set, modeling types, correlation model, and missing-data strategy are carried forward.

References

Browne, M. W. (2001). An overview of analytic rotation in exploratory factor analysis. Multivariate Behavioral Research, 36(1), 111-150. doi:10.1207/S15327906MBR3601_05

Conway, J. M., & Huffcutt, A. I. (2003). A review and evaluation of exploratory factor analysis practices in organizational research. Organizational Research Methods, 6(2), 147-168. doi:10.1177/1094428103251541

Costello, A. B., & Osborne, J. W. (2005). Best practices in exploratory factor analysis: Four recommendations for getting the most from your analysis. Practical Assessment, Research, and Evaluation, 10, Article 7. doi:10.7275/jyj1-4868

Fabrigar, L. R., Wegener, D. T., MacCallum, R. C., & Strahan, E. J. (1999). Evaluating the use of exploratory factor analysis in psychological research. Psychological Methods, 4(3), 272-299. doi:10.1037/1082-989X.4.3.272

Kaiser, H. F. (1958). The varimax criterion for analytic rotation in factor analysis. Psychometrika, 23(3), 187-200. doi:10.1007/BF02289233

Watkins, M. W. (2018). Exploratory factor analysis: A guide to best practice. Journal of Black Psychology, 44(3), 219-246. doi:10.1177/0095798418771807

Examples

efa <- nomo_efa(nomo_demo_continuous, factors = 2)
efa
#> <nomo_efa> Exploratory factor analysis
#> Cases: 500 | Items: 10 | Factors: 2 (researcher specified)
#> Correlation: pearson | Extraction: minres | Rotation: oblimin
#> Off-diagonal RMSR: 0.018 | Flags: 2 review, 1 concern
#> No items were automatically deleted or refit.
efa$item_summary[, c("item", "primary_loading", "secondary_loading", "attention")]
#> # A tibble: 10 × 4
#>    item  primary_loading secondary_loading attention    
#>    <chr>           <dbl>             <dbl> <chr>        
#>  1 a1              0.808          -0.0444  KEEP         
#>  2 a2              0.709           0.0643  KEEP         
#>  3 a3              0.667           0.0153  KEEP         
#>  4 a4              0.770          -0.0377  KEEP         
#>  5 a5              0.414           0.335   REVIEW       
#>  6 b1              0.783           0.0141  KEEP         
#>  7 b2              0.693          -0.0200  KEEP         
#>  8 b3              0.783          -0.00673 KEEP         
#>  9 b4              0.637          -0.0119  REVIEW       
#> 10 b5              0.332           0.0286  STRONG REVIEW

# Carry retention evidence and its modeling decisions into the EFA
fac <- nomo_factors(nomo_demo_continuous, n_iter = 20, seed = 2026)
efa_from_evidence <- nomo_efa(nomo_demo_continuous, factors = fac)
summary(efa_from_evidence)
#> <nomo_efa summary> Exploratory factor analysis
#> Cases: 500 | Items: 10 | Factors: 2 (from nomo_factors())
#> Correlation: pearson | Extraction: minres | Rotation: oblimin
#> Supporting adequacy: KMO 0.874
#> 
#> Item structure
#>   Item  Factor  Loading  Next factor  Loading  Communality  Flag
#>   a1    F1        0.808  F2            -0.044        0.624
#>   a2    F1        0.709  F2             0.064        0.547
#>   a3    F1        0.667  F2             0.015        0.454
#>   a4    F1        0.770  F2            -0.038        0.569
#>   a5    F1        0.414  F2             0.335        0.406  review
#>   b1    F2        0.783  F1             0.014        0.623
#>   b2    F2        0.693  F1            -0.020        0.469
#>   b3    F2        0.783  F1            -0.007        0.608
#>   b4    F2        0.637  F1            -0.012        0.400  review
#>   b5    F2        0.332  F1             0.029        0.120  concern
#> 
#> Flagged items
#>   - a5 (review): secondary loading |0.34| meets/exceeds the 0.30 cross-loading
#>     reference
#>   - b4 (review): communality 0.40 is below the 0.40 teaching reference
#>   - b5 (concern): primary loading |0.33| is below the 0.40 teaching reference;
#>     communality 0.12 is below the 0.40 teaching reference
#> 
#> Factor correlations
#>   Factor 1  Factor 2      r
#>   F1        F2        0.439
#> 
#> Largest residual correlations
#>   Off-diagonal RMSR: 0.018
#>   Item 1  Item 2  Residual
#>   b4      b5         0.042
#>   a5      b5        -0.039
#>   a4      b5         0.038
#>   a2      a5         0.030
#>   b2      b5        -0.028
#> 
#> Numerical references trigger inspection, not automatic deletion or hidden
#> refitting.