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.079555911 -0.405492149
#> A2  0.006995423  0.677314802
#> A3 -0.028286487  0.759520586
#> A4  0.144928895  0.438716478
#> A5  0.027451135  0.602373572
#> C1  0.570729834 -0.060699645
#> C2  0.636808587 -0.013270843
#> C3  0.541560625  0.031619489
#> C4 -0.649202167 -0.003666238
#> C5 -0.561777425 -0.057952599
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
#> A1 1.077
#> A2 1.000
#> A3 1.003
#> A4 1.216
#> A5 1.004
#> C1 1.023
#> C2 1.001
#> C3 1.007
#> C4 1.000
#> C5 1.021

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.242545
#>   F2: 0.212561
#> 
#> - 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.407
#> 2     C2  -2301.612
#> 3     C3   -292.349
#> 4     C4 -31354.854
#> 5     C5    -92.969
#> 6     A1    -24.979
#> 7     A2  -9373.610
#> 8     A3   -719.976
#> 9     A4     -8.163
#> 10    A5   -480.517

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.