Example 2: Assessing Factor Simplicity from psych::fa() Output

Example 2: Assessing Factor Simplicity from psych::fa() Output

This example demonstrates how to compute factor simplicity and complexity indices using loadings obtained from an exploratory factor analysis conducted via psych::fa().

Step 1: Load data from psych

We use the bfi dataset available in the psych package.

data(bfi, package = "psych")

Step 2: Fit a 2-factor exploratory model

We fit an EFA model with 2 factors using oblimin rotation and unweighted least squares (ULS) estimation.

fa.output <- psych::fa(bfi[, 1:10], 
                       nfactors = 2, 
                       rotate = "oblimin",
                       fm = "uls")
#> Loading required namespace: GPArotation

Step 3: View and save the loading matrix

We inspect the factor loadings and convert them to a standard data frame for analysis.

unclass(fa.output$loadings)
#>            ULS2         ULS1
#> A1  0.079554317 -0.405491274
#> A2  0.006997858  0.677314053
#> A3 -0.028283698  0.759519562
#> A4  0.144930243  0.438716708
#> A5  0.027453266  0.602373014
#> C1  0.570728682 -0.060696669
#> C2  0.636807499 -0.013267586
#> C3  0.541559855  0.031622209
#> C4 -0.649201121 -0.003669539
#> C5 -0.561776717 -0.057955391
fa.load <- as.data.frame(unclass(fa.output$loadings))

Step 4: Compute complexity and simplicity indices

We now use the facomplex package to compute various measures of factor simplicity and complexity.

Hofmann Index

Hofmann(fa.load)
#>     CHof CHof_R
#> A1 1.077  0.929
#> A2 1.000  1.000
#> A3 1.003  0.997
#> A4 1.216  0.823
#> A5 1.004  0.996
#> C1 1.023  0.978
#> C2 1.001  0.999
#> C3 1.007  0.993
#> C4 1.000  1.000
#> C5 1.021  0.979

Bentler’s Simplicity Index

BSI(fa.load)
#> [1] 0.9998469

Kaiser-Cerny (KC) Criterion

KC(data = fa.load, b = 4)
#> Kaiser-Cerny Factor Simplicity Analysis:
#> - Threshold f_j for hyperplane inclusion (per factor):
#>   F1: 0.242546
#>   F2: 0.212563
#> 
#> - Ideal hyperplane count:  10

Factor Simplicity Index (FSI)

We define the target items for each factor to compute the total, factor-level, and item-level simplicity.

simload(data = fa.load, 
    items_target = list(
      ULS1 = c(6,7,8,9,10), 
      ULS2 = c(1,2,3,4,5)
    ))
#> $TSFI
#> [1] 0.01
#> 
#> $SFI
#>  ULS1  ULS2 
#> 0.005 0.016 
#> 
#> $IFS
#>    Items        IFS
#> 1     C1    -87.416
#> 2     C2  -2302.735
#> 3     C3   -292.298
#> 4     C4 -31298.368
#> 5     C5    -92.959
#> 6     A1    -24.980
#> 7     A2  -9367.067
#> 8     A3   -720.117
#> 9     A4     -8.163
#> 10    A5   -480.441

This example shows how to apply facomplex to factor solutions derived from classical exploratory methods, making it an accessible tool for researchers working with psych::fa() and other traditional EFA approaches.