simple_structure: Simple Structure Quality Measures

simple_structureR Documentation

Simple Structure Quality Measures

Description

Functions for assessing the quality of simple structure in a rotated factor solution. Four criterion-free measures are available:

calc_AUC

Area Under the Curve measure of factor loading simplicity, computed per factor and overall (Liu et al., 2023).

calc_FSI

Factor Simplicity Index, computed per factor and overall (Lorenzo-Seva, 2003).

calc_simplicity

Three overall solution measures: Hoffman (1978), Gini (Kaiser, 1974), and Bentler (1977).

calc_hyperplane

Hyperplane count per factor and overall, measuring coordinate sparsity in the rotated solution.

calc_fitstats

Chi-square, SMRS, RMSEA with confidence interval, valid for MLE extracted loadings only.

All measures are criterion-free — they do not depend on how the rotation was obtained — making them useful for comparing simple structure quality across different rotation methods applied to the same unrotated solution. The table below summarizes the measures, their scope, range, and interpretation:

Measure Scope Range Good Poor
AUC per factor [0.5, 1.0] near 1.0 near 0.5
FSI per factor [0.0, 1.0] near 1.0 near 0.0
Hoffman overall solution [0.0, 1.0] near 1.0 near 0.0
Gini overall solution [0.0, 1.0] near 1.0 near 0.0
Bentler overall solution [0.0, 1.0] near 1.0 near 0.0
Hyperplane per factor; overall [0, p(k-1)] high count low count

Note: No universally accepted cutoffs exist for these measures. The ranges above are approximate guidelines based on empirical experience. Always interpret in conjunction with substantive theory and model fit indices such as RMSEA and SRMR.

Note on Bentler: the Bentler index tends to be low when factor intercorrelations are high, even when simple structure is otherwise clean. A low Bentler value should therefore be interpreted in conjunction with AUC, FSI, and hyperplane counts rather than in isolation. High AUC and hyperplane counts alongside a low Bentler value typically indicate correlated factors rather than poor simple structure.

These functions are used internally by print.GPArotation and summary.GPArotation and are displayed automatically when printing or summarising a GPArotation object. They can also be called directly using the triple-colon operator, for example GPArotation:::calc_AUC(x).

Usage

## Not exported -- access via GPArotation:::calc_AUC(x) etc.
## calc_AUC(x, digits = 3L)
## calc_FSI(x, digits = 3L)
## calc_simplicity(x, digits = 3L)
## calc_hyperplane(x, cutoff = 0.1, digits = 3L)
## calc_fitstats(x)

Arguments

x

a GPArotation object, a factanal object, or a factor loading matrix. For oblique rotations all measures are computed from the pattern matrix, not the structure matrix.

digits

integer. Number of decimal places for rounding. Default 3.

cutoff

numeric. Half-width of the hyperplane band for calc_hyperplane. Loadings with absolute value below cutoff are counted as hyperplane loadings. Default 0.1. Common choices are 0.1 (strict) and 0.15 (lenient). Results should always be reported with the cutoff value used.

Details

All four measures are criterion-free — they do not depend on how the rotation was obtained — making them useful for comparing simple structure quality across different rotation methods applied to the same unrotated solution.

AUC (Liu et al., 2023)

For each factor j the squared loadings are sorted in descending order and their cumulative proportions of total factor variance are plotted against their rank. AUC is the area under this curve:

AUC_j = \frac{1}{p} \sum_{i=1}^{p} \frac{\sum_{r=1}^{i} l_{(r)j}^2}{\sum_{r=1}^{p} l_{(r)j}^2}

AUC = 1 indicates perfect simple structure (one non-zero loading); AUC = 0.5 indicates no simple structure (equal loadings). Adjusted AUC subtracts 0.5 so that 0 corresponds to no simple structure.

FSI (Lorenzo-Seva, 2003)

Based on the kurtosis of the squared loadings within each factor:

FSI_j = \frac{p \sum l_{ij}^4 - \left(\sum l_{ij}^2\right)^2} {(p-1)\left(\sum l_{ij}^2\right)^2}

FSI = 0 indicates no simple structure; FSI = 1 indicates perfect simple structure. More sensitive to dominant loadings than AUC.

Overall solution measures

Hoffman (1978):

H = 1 - \frac{\sum_j \sum_i l_{ij}^2 (1 - l_{ij}^2)}{p \cdot k \cdot 0.25}

Measures how far loadings are from 0.5. H = 1 when all loadings are 0 or 1; H = 0.25 when all loadings equal 0.5.

Gini (Kaiser, 1974): Based on the Gini coefficient of the absolute loadings within each factor, averaged across factors. Higher values indicate greater concentration of variance on fewer indicators per factor.

Bentler (1977): Ratio of between-factor to within-factor variance of squared loadings. Values near 1 indicate clean simple structure.

Hyperplane count (Mair, 2018)

For each factor j:

HP_j = \sum_{i=1}^{p} \mathbf{1}(|l_{ij}| < c)

where c is the hyperplane cutoff. The theoretical maximum is p(k-1), achieved when each indicator loads on exactly one factor. The percentage of the theoretical maximum provides a scale-free summary of hyperplane density.

AUC and FSI are per-factor measures shown in print.GPArotation. All four measures plus their summaries are shown in summary.GPArotation.

Author(s)

Coen A. Bernaards.

References

Bentler, P.M. (1977) Factor simplicity index and transformations. Psychometrika, 42(2), 277–295. \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1007/BF02294054")}

Hoffman, P.J. (1978) The paramorphic representation of clinical judgment. Psychological Bulletin, 55(2), 116–131. \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1037/h0047807")}

Kaiser, H.F. (1974) An index of factorial simplicity. Psychometrika, 39(1), 31–36. \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1007/BF02291575")}

Liu, X., Wallin, G., Chen, Y., and Moustaki, I. (2023). Rotation to sparse loadings using L^p losses and related inference problems. Psychometrika, 88(2), 527–553. \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1007/s11336-023-09911-y")}

Lorenzo-Seva, U. (2003) A factor simplicity index. Psychometrika, 68(1), 49–60. \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1007/BF02296652")}

Mair, P. (2018). Modern Psychometrics with R. Springer. \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1007/978-3-319-93177-7")}

See Also

print.GPArotation, summary.GPArotation

Examples

data("CCAI", package = "GPArotation")
fa.un <- factanal(factors = 3, covmat = CCAI_R, n.obs = 461,
                  rotation = "none")

res.tan <- tandemI(fa.un)
res.ob  <- oblimin(fa.un)

# Simple structure measures shown automatically in print
# Orthogonal: SS loadings, Proportion Var, Cumulative Var, AUC, FSI
print(res.tan)

# Oblique: SS loadings, AUC, FSI, Phi
print(res.ob)

# Summary adds overall measures: Hoffman, Gini, Bentler, hyperplane
summary(res.tan)
summary(res.ob)

# Direct access for custom analyses
GPArotation:::calc_AUC(res.ob)
GPArotation:::calc_FSI(res.ob)
GPArotation:::calc_simplicity(res.ob)
GPArotation:::calc_hyperplane(res.ob)

# Stricter hyperplane cutoff
GPArotation:::calc_hyperplane(res.ob, cutoff = 0.05)

# Compare simple structure across rotation methods
auc.tan <- GPArotation:::calc_AUC(res.tan)$AUC_mean
auc.ob  <- GPArotation:::calc_AUC(res.ob)$AUC_mean
fsi.tan <- GPArotation:::calc_FSI(res.tan)$FSI_mean
fsi.ob  <- GPArotation:::calc_FSI(res.ob)$FSI_mean

cat(paste0(formatC("Tandem I", width = 10, flag = "-"),
           "  AUC: ", round(auc.tan, 3),
           "  FSI: ", round(fsi.tan, 3), "\n"))
cat(paste0(formatC("Oblimin", width = 10, flag = "-"),
           "  AUC: ", round(auc.ob, 3),
           "  FSI: ", round(fsi.ob, 3), "\n"))           

GPArotation documentation built on June 18, 2026, 9:06 a.m.