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.079555826 -0.405492666
#> A2  0.006995906  0.677314599
#> A3 -0.028286034  0.759520634
#> A4  0.144929552  0.438715276
#> A5  0.027451617  0.602373230
#> C1  0.570731188 -0.060703984
#> C2  0.636810136 -0.013275697
#> C3  0.541561971  0.031615351
#> C4 -0.649203758 -0.003661286
#> C5 -0.561778839 -0.057948301
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.212558
#> 
#> - 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.395
#> 2     C2  -2299.940
#> 3     C3   -292.427
#> 4     C4 -31439.886
#> 5     C5    -92.983
#> 6     A1    -24.979
#> 7     A2  -9372.309
#> 8     A3   -720.000
#> 9     A4     -8.163
#> 10    A5   -480.499

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.