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
Published

April 17, 2026

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:

  1. Check factorability (KMO, Bartlett).
  2. Choose number of factors (parallel analysis, scree, Kaiser).
  3. Extract (ML, PAF, principal).
  4. Rotate (varimax for orthogonal, promax / oblimin for oblique).
  5. 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").