Exploratory Factor Analysis
Multivariate Statistics
efa
factor-analysis
loading
rotation
Identifying latent factors from correlated manifest variables, with extraction, rotation, and number-of-factors decisions
Introduction
Exploratory factor analysis (EFA) searches for a small number of latent factors that explain the correlations among a larger set of observed variables. It is a cornerstone of psychometrics and scale development.
Prerequisites
Correlation, PCA.
Theory
Common factor model:
\[X = \Lambda F + U,\]
where \(\Lambda\) is the loading matrix, \(F\) are common factors, and \(U\) is unique (specific) variance. Unlike PCA, EFA explicitly separates common and unique variance.
Steps:
- Check factorability (KMO, Bartlett).
- Choose number of factors (parallel analysis, scree, Kaiser).
- Extract (ML, PAF, principal).
- Rotate (varimax for orthogonal, promax / oblimin for oblique).
- Interpret loadings.
Assumptions
- Multivariate normal data (for ML extraction).
- Linearity of item-factor relationships.
- Sufficient sample size (commonly 5-10 cases per item).
R Implementation
library(psych); library(GPArotation)
d <- bfi[, 1:25] # 25-item big-five inventory
# Factorability
KMO(d)
cortest.bartlett(cor(d, use = "pairwise"), n = nrow(d))
# Number of factors
fa.parallel(d, fa = "fa")
# EFA with 5 factors, oblique rotation
efa <- fa(d, nfactors = 5, rotate = "oblimin", fm = "ml")
print(efa, cut = 0.3)Output & Results
Rotated loadings, explained variance, factor correlations.
Interpretation
“Five-factor solution with oblimin rotation explained 45 % of the variance. Loadings aligned with the big-five theoretical structure, with factors representing extraversion, neuroticism, conscientiousness, agreeableness, and openness.”
Practical Tips
- Use parallel analysis for number-of-factors; avoid the “eigenvalue > 1” rule.
- Oblique rotation is usually more realistic; uncorrelated factors are rare in psychology.
- Check Heywood cases (loadings > 1 or communality > 1); they indicate over-extraction.
- For confirmatory hypotheses, use CFA (
lavaan). - Polychoric correlations for ordinal items:
fa(..., cor = "poly").