Skip to Content
AlgorithmsAlgorithms
  • Article
  • Open Access

17 July 2026

13 Pages

Exploratory Factor Analysis by Gauss-Newton

Departments of Computational Medicine, Human Genetics, and Statistics, University of California, Los Angeles, CA 90095, USA

Abstract

After more than a century, factor analysis remains one of the most popular tools in applied statistics. Exploratory factor analysis tends to be driven by iterated principal axis factorization. Confirmatory factor analysis tends to rely on maximum likelihood estimation. This paper demonstrates the computational superiority of the Gauss–Newton method in minimizing the principal axis loss. On sample problems, Gauss–Newton is more than three orders of magnitude faster than popular implementations of maximum likelihood factor analysis. As part of this comparison, we derive an alternative Gauss–Newton method that leverages the MM principle of optimization. We also explore a simple perturbation correction that dramatically improves the accuracy of the factor loading matrices derived from approximate spectral decompositions. Finally, we suggest a robust version of iterated principal axis factorization that leverages the MM principle, block descent, and the Gauss–Newton method. These innovations are implemented in Julia code and applied to a sequence of representative problems.

1. Introduction

In factor analysis driven by iterated principal axis factorization [1], one minimizes the loss
f ( F , D ) = 1 2 ∥ S − F F ⊤ − D ∥ F 2
by block descent. Here, S is an p × p sample covariance matrix, F is an p × r factor loadings matrix, D is an p × p nonnegative diagonal matrix, and  ∥ · ∥ F is the Frobenius norm on p × p matrices. The rank r of F is chosen to be much smaller than the rank of S , which cannot exceed p. In the background lurks a random sample x 1 , … , x n of centered vectors in R p with mean 0 along each row. If we stack the row vectors x i ⊤ into a matrix X , then S = 1 n X ⊤ X = 1 n ∑ i = 1 n x i x i ⊤ . The blocks in iterated principal axis factorization are F and D . These are updated at iteration m by
D m + 1 = argmin D f ( F m , D ) F m + 1 = argmin F f ( F , D m + 1 ) .
These two updates are alternated until convergence. In contrast, maximum likelihood estimation optimizes the loglikelihood [2,3]
L ( F , D ) = − n 2 ln det Ω + tr ( Ω − 1 S ) Ω = F F ⊤ + D .
The loglikelihood can be maximized by either Newton’s method [4], a Gauss–Newton algorithm [5], or an EM algorithm [6,7], all of which perform reasonably well in low-dimensional problems. In practice, algorithms that merely reduce f ( F , D m + 1 ) rather than minimize it can be effective. Furthermore, any transformation F O by an orthogonal matrix O leads to the same product F O ( F O ) ⊤ = F F ⊤ . Post-processing of the estimated F easily renders its columns orthogonal.
As summarized in the reviews [2,8,9,10], both optimization criteria have something to recommend them. Iterated principal axis factorization makes no distributional assumptions, does not require S to be of full rank, is more robust to unequal factor loadings and small sample sizes, and is better able to recover weak factors. In contrast, maximum likelihood permits computation of multiple fit indices and of significance tests of the factor loadings. Of course, a Gaussian likelihood can be invoked nonparametrically, but this leaves significance testing questionable. In practice, the sample covariance matrix S is often replaced by the sample correlation matrix. Because this substitution loses some information, we prefer the sample covariance formulation of factor analysis. To its credit, the Gauss–Newton strategy applies in both settings.
In the current article we argue the case for iterated principal axis factorization purely on the grounds of computation efficiency in high-dimensional problems. Given the complexity of the loglikelihood function, this conclusion is plausible. However, details matter in implementing iterated principal axis factorization. For instance, in embracing block descent, the obvious choice for updating the diagonal entry d i i of D is
d m + 1 , i i = max { ( S − F m F m ⊤ ) i i , 0 } .
Implausible Heywood estimates where some d i < 0 are not allowed. The updates (1) can be carried out in parallel, respect the non-negativity constraints on the d i i , and do not require computation of the full matrix product F m F m ⊤ . Finally, compared to simultaneously updating D and F , block descent reduces the number of parameters active in any update.
The traditional block update of F = V Λ 1 / 2 depends on extracting the eigenvector matrix V and the diagonal eigenvalue matrix Λ corresponding to the r largest eigenvalues of S − D . Ordinarily, the r largest eigenvalues are positive. If this is not the case, then V and Λ can be pruned until it is the case. This construction is computationally intensive when a complete eigen-decomposition of S − D is invoked. On the other hand, if only the top r eigen-pairs are generated by an iterative method such as the Lanczos algorithm [11], then the inaccuracy of Λ and the imperfect orthogonality of V may seriously corrupt updates.
The current paper proposes three innovations that potentially improve either the speed or the robustness of iterated principal axis factorization. First, we derive an alternative Gauss–Newton method that leverages the MM principle of optimization [12,13]. Second, we recommend a simple perturbation correction for dramatically improving the accuracy of Λ and the orthogonality of V delivered by the Lanczos algorithm. Third, we suggest a robust version of iterated principal axis factorization that also leverages the MM principle and block descent. These innovations are implemented in Julia code that is three to four orders of magnitude faster than popular implementations of maximum likelihood factor analysis. These advances put high-dimensional factor analysis within reach without sacrificing inference quality.

2. Background

2.1. Notation

Here are the notational conventions used throughout this article. All vectors and matrices appear in boldface. All entries of the vector 0 equal 0; I indicates an identity matrix. The ⊤ superscript indicates a vector transpose. The Euclidean norm and ℓ 1 norm of a vector x are denoted by ∥ x ∥ and ∥ x ∥ 1 . For a matrix M the norm ∥ M ∥ 1 indicates ∥ vec ( M ) ∥ 1 . The Frobenius norm of a matrix M is denoted by ∥ M ∥ F . For a smooth real-valued function f ( x ) , we write its first differential (row vector of partial derivatives) as d f ( x ) . Finally, we denote the directional derivative of f ( x ) in the direction v by d v f ( x ) . When the function f ( x ) is differentiable, d v f ( x ) = d f ( x ) v .

2.2. MM Principle

Two of our algorithms invoke the majorization–minimization (MM) principle [12,13,14]. MM algorithms depend on a surrogate function that majorizes the objective f ( x ) around the current iterate x m in the sense of satisfying the tangency condition g ( x m ∣ x m ) = f ( x m ) and the domination condition f ( x ) ≤ g ( x ∣ x m ) for all x . The surrogate balances two goals, hugging the objective tightly and simplifying minimization. Minimizing the surrogate produces the next iterate x m + 1 and drives the objective downhill. Indeed, the descent property
f ( x m + 1 ) ≤ g ( x m + 1 ∣ x m ) ≤ g ( x m ∣ x m ) = f ( x m ) .
follows directly from the definitions. This property depends only on g ( x ∣ x m ) being reduced rather than being minimized. In maximization, the surrogate instead minorizes the objective and is maximized. The tangency condition remains the same, but now the domination condition f ( x ) ≤ g ( x ∣ x m ) is reversed. The acronym MM also applies to minorization-maximization.

2.3. Perturbation Correction of Eigen-Decompositions

Following the reference [15], suppose S is a symmetric matrix. Let V be a collection of r approximate unit length eigenvectors. We want the correction V ( I r + E ) to satisfy the orthogonality relations
( I r + E ⊤ ) V ⊤ V ( I r + E ) = I r ( I r + E ⊤ ) V ⊤ S V ( I r + E ) = Λ ,
where Λ is a r × r diagonal matrix of eigenvalues of S . Assuming E is small, the expansion ( I r + E ) − 1 = ∑ k = 0 ∞ ( − 1 ) k E k implies
V ⊤ V = ( I r + E ⊤ ) − 1 ( I r + E ) − 1 = I r − E − E ⊤ + O ( ∥ E ∥ 2 )
and
V ⊤ S V = ( I r + E ⊤ ) − 1 Λ ( I r + E ) − 1 = Λ − E ⊤ Λ − Λ E + O ( ∥ E ∥ 2 ) .
The diagonal of the constraint (2) implies e i i = 0 for all i. The diagonal of the constraint (3) provides the eigenvalues λ i = v i ⊤ S v i . The off-diagonals of the constraint (2) imply e i j + e j i = − v i ⊤ v j . The off-diagonals of the constraint (3) imply λ i e i j + λ j e j i = − v i ⊤ S v j . In summary, it follows that
λ i = v i ⊤ S v i e i i = 0 e i j = v i ⊤ S v j − λ j v i ⊤ v j λ j − λ i , i ≠ j ,
assuming the eigenvalues are distinct. If  λ i = λ j , then the choice
e i j = e j i = − v i ⊤ v j 2
satisfies the equation e i j + e j i = − v i ⊤ v j . This correction scheme enjoys a local quadratic rate of convergence when S has simple eigenvalues [15]. We refer readers to the original paper and follow-up papers [16,17,18] for precise error bounds.

2.4. Moreau Envelope and Proximal Map

The Moreau envelope
M μ f ( y ) = inf x f ( x ) + 1 2 μ ∥ y − x ∥ 2
of a function f ( x ) from R p to R ∪ { ∞ } is valuable in converting nonsmooth optimization problems into smooth optimization problems. If  f ( x ) is convex, then the infimum is attained, and its Moreau envelope M μ f ( y ) is convex and continuously differentiable [19]. The proximal operator
prox μ f ( y ) = argmin x f ( x ) + 1 2 μ ∥ y − x ∥ 2
encodes the solution to the Moreau envelope minimization. Fortunately, we have the obvious quadratic majorization
M μ f ( y ) ≤ f ( z m ) + 1 2 μ ∥ y − z m ∥ 2
at y m for z m = prox μ f ( y m ) . The inequality M μ f ( y ) ≤ f ( y ) is obvious, and the limit lim μ ↓ 0 M μ f ( y ) = f ( y ) holds under mild conditions. In particular, if  f ( y ) is Lipschitz with constant L, then
0 ≤ f ( y ) − M μ f ( y )   ≤   L 2 μ 2 .
The example most relevant to our exposition is the Moreau envelope of the nonsmooth absolute value function | x | . The Moreau envelope of | x | is Huber’s function
M μ | · | ( y ) = 1 2 μ y 2 , | y | ≤ μ | y | − μ 2 , | y | > μ
with proximal map
prox μ | · | ( y ) = 1 − μ max { | y | , μ } y ,
which soft thresholds the scalar y. By design M μ | · | ( y ) grows linearly as | y | tends to ∞.

3. Algorithm Derivations

3.1. The Classical Gauss–Newton Algorithm

The Gauss–Newton was derived by Jennrich [5] and later rederived by Liu et al. [20]. For the reader’s convenience, we now present a condensed version of Liu et al.’s derivation. To minimize f ( d , F ) with respect to F in iterated principal axis factorization, it is helpful to linearize F F ⊤ around the current iterate F m and minimize
g ( Δ ) = 1 2 ∥ S − F m F m ⊤ − F m Δ ⊤ − Δ F m ⊤ − D m + 1 ∥ F 2
with respect to the increment Δ = F − F m . If Z m = S − F m F m ⊤ − D m + 1 , then at a local minimum the stationary condition
0 = d V g ( Δ ) = − tr [ ( Z m − F m Δ ⊤ − Δ F m ⊤ ) ⊤ ( F m V ⊤ + V F m ⊤ ) ]
for all directions V entails
0 = 2 ( Z m − F m Δ ⊤ − Δ F m ⊤ ) F m .
If we postmultiply this stationary condition by ( F m ⊤ F m ) − 1 , then it becomes
F m Δ ⊤ F m ( F m ⊤ F m ) − 1 + Δ = Z m F m ( F m ⊤ F m ) − 1 .
Premultiplying the result by ( F m ⊤ F m ) − 1 F m ⊤ now gives the symmetric version
Δ ⊤ F m ( F m ⊤ F m ) − 1 + ( F m ⊤ F m ) − 1 F m ⊤ Δ = ( F m ⊤ F m ) − 1 F m ⊤ Z m F m ( F m ⊤ F m ) − 1 .
The solution Δ of the system (8) can be decomposed into a component from the range of F m plus one from its orthogonal complement. In other words, Δ = U + F m C with U ⊤ F m = 0 . Substitution in Equation (8) gives
C ⊤ + C = ( F m ⊤ F m ) − 1 F m ⊤ Z m F m ( F m ⊤ F m ) − 1 ,
and assuming C is symmetric, it follows that
C = 1 2 ( F m ⊤ F m ) − 1 F m ⊤ Z m F m ( F m ⊤ F m ) − 1 .
Finally, substitution of Δ = U + F m C in Equation (7) yields
F m C + U + F m C = Z m F m ( F m ⊤ F m ) − 1 U + F m C = Z m F m ( F m ⊤ F m ) − 1 − F m C F m + 1 = F m + I − 1 2 F m ( F m ⊤ F m ) − 1 F m ⊤ Z m F m ( F m ⊤ F m ) − 1 .
The following Julia code implements the Liu et al. [20] Gauss–Newton algorithm. Comments, prefixed by #, are liberally sprinkled throughout the code.
This code incorporates the scale-adjusted convergence criterion
∥ d m + 1 − d m ∥ < 10 − 8 ∥ d m ∥
and is applied throughout our numerical examples. Just prior to output, the code also orthogonalizes F by extracting its singular value decomposition. Given a small number of desired factors r, orthogonalization is cheap. The cost O ( p 2 r ) of forming the matrix product S Y dominates the overall computational cost of the algorithm. Fortunately, matrix multiplication is very fast on modern computers.
using LinearAlgebra # Julia’s linear algebra~package
function FactorAnalysisGN(S::Matrix{T}, r::Int) where T <: Real
  p = size(S, 1) # size of sample covariance matrix
  (d, old_d, conv) = (zeros(T, p), zeros(T, p), 1.0e-8)
  F = randn(T, p, r) # random initialization of loadings
  (FtF, Y, Z) = (zeros(T, r, r), zeros(T, r, r), zeros(T, p, r))
  for iter = 1:500
    for i = 1:p # update specific variances
      d[i] = max(S[i, i] - norm(F[i, :])^2, zero(T))
    end
    mul!(FtF, transpose(F), F) # prepare to update loadings
    Y = F / FtF
    mul!(Z, S, Y) # Z = S * Y
    Z .= Z .- Diagonal(d) * Y
    F .= Z .- F * ((transpose(Y) * Z - I) ./ 2) # loadings update
    if norm(d - old_d) < conv * norm(old_d) && iter > 1 break end
    old_d .= d
  end
  SVD = svd(F) # orthogonalize the columns of F before output
  F = SVD.U * Diagonal(SVD.S)
  return (F, d)
end

3.2. An MM Version of Gauss–Newton

It is possible to derive a different Gauss–Newton algorithm based on the MM principle. The identity ∥ A ∥ F = ∥ A ⊤ ∥ F and Jensen’s inequality provide the majorization
g ( Δ ) = 1 2 1 2 ( Z m − 2 F m Δ ⊤ ) + 1 2 ( Z m − 2 Δ F m ⊤ ) F 2 ≤ 1 4 Z m − 2 F m Δ ⊤ F 2 + 1 4 Z m − 2 Δ F m ⊤ F 2 = 1 2 Z m − 2 Δ F m ⊤ F 2 = 2 U m − Δ F m ⊤ F 2 = h ( Δ ∣ 0 )
of g ( Δ ) , where U m = 1 2 Z m = 1 2 ( S − F m F m ⊤ − D m + 1 ) is symmetric.  This majorization is carefully designed to reduce the loss to a more symmetric sum of squares. The directional derivative
d V h ( Δ ∣ 0 ) = − 4 tr [ ( U m − Δ F m ⊤ ) ⊤ V F m ⊤ ] = − 4 tr [ F m ⊤ ( U m − F m Δ ⊤ ) V ]
vanishes for all V if and only if F m ⊤ ( U m − F m Δ ⊤ ) = 0 . This normal equation for the surrogate h ( Δ ∣ 0 ) entails the solution
Δ ⊤ = ( F m ⊤ F m ) − 1 F m ⊤ U m Δ = U m F m ( F m ⊤ F m ) − 1 F m + 1 = F m + Δ = F m + U m F m ( F m ⊤ F m ) − 1 = F m + 1 2 [ S F m − F m ( F m ⊤ F m ) − D m + 1 F m ] ( F m ⊤ F m ) − 1 .
The second form of the F m + 1 update is preferred because it avoids creation of the p × p product matrix F m F m ⊤ . The following Julia code implements the MM algorithm.
using LinearAlgebra # Julia’s linear algebra~package
function FactorAnalysisMM(S::Matrix{T}, r::Int) where T <: Real
  (p, iters) = (size(S, 1), 0) # size of sample covariance matrix
  (d, old_d, conv) = (zeros(T, p), zeros(T, p), 1.0e-8)
  F = randn(p, r) # random initialization of loadings
  FtF = zeros(T, r, r) # stores F transpose * F
  for iter = 1:1000
    iters = iters + 1
    for i = 1:p # update specific variances
      d[i] = max(S[i, i] - norm(F[i, :])^2, zero(T))
    end
    mul!(FtF, transpose(F), F) # prepare to update loadings
    F .= F .+ (S * F - F * FtF - Diagonal(d) * F) / (2FtF)
    if norm(d - old_d) < conv * norm(old_d) && iter > 1 break end
    old_d .= d
  end
  SVD = svd(F) # before output orthogonalize the columns of F
  F = SVD.U * Diagonal(SVD.S)
  return (F, d, iters)
end
The O ( p 2 r ) arithmetic operations required to form the matrix product S F dominates the computational cost of the MM algorithm. Although both the Gauss–Newton and the MM updates are guaranteed to reduce g ( Δ ) , they are not guaranteed to reduce f ( D , F ) . Step-halving mitigates this problem but it is omitted from both Julia functions because the updates invariably reduce f ( D , F ) after a few rounds of block descent.

3.3. Eigen Correction

As already mentioned, the iterated principal axis factorization alternates the update (1) and the update F = V Λ 1 / 2 derived from the eigenvector matrix V and the diagonal eigenvalue matrix Λ corresponding to the r largest eigenvalues of S − D m + 1 . To this recipe we add the eigen correction of Ogita and Aishima [15]. Again we list actual Julia code rather than a less informative algorithm sketch. The main function appears third. Julia’s implementation of Arpack provides approximate eigenvectors.
using LinearAlgebra, StatsBase, Arpack
function LoadingsUpdate(S::Matrix{T}, r::Int) where T <: Real
  (lambda, V) = eigs(S, r, which=:LR) # Arpack call
  V = real(V) # convert to real
  (lambda, V) = EigenRefinement(S, V)
  D = Diagonal(sqrt.(max.(lambda[1:r], zero(T))))
  return V[:, 1:r] * D
end
function EigenRefinement(S::Matrix{T}, V::Matrix{T}) where T <: Real
  (p, r) =  size(V)
  foreach(normalize!, eachcol(V)) # normalize eigenvectors
  (lambda, E) = (zeros(T, r), zeros(T, r, r))
  VtSV = transpose(V) * ( S * V)
  VtV = transpose(V) * V
  lambda = diag(VtSV) # eigenvalues
  for i = 1:r # construct correction matrix
    for j = 1:(i - 1)
      E[i, j] = VtSV[i, j] - lambda[j] * VtV[i, j]
      E[i, j] = E[i, j] /(lambda[j] - lambda[i])
      E[j, i] = VtSV[j, i] - lambda[i] * VtV[j, i]
      E[j, i] = E[j, i] / (lambda[i] - lambda[j])
    end
  end
  V = V * (I + E) # improved eigenvectors
  foreach(normalize!, eachcol(V)) # normalize eigenvectors
  return (lambda, V)
end
function FactorAnalysisPartial(S::Matrix{T}, r::Int) where T <: Real
  p = size(S, 1)
  (d, old_d, conv) = (zeros(T, p), zeros(T, p), 1.0e-8)
  F = randn(p, r) # random factor loadings
  for iter = 1:100
    for i = 1:p # update specific variances
      d[i] = max(S[i, i] - norm(F[i, :])^2, zero(T))
    end
    for i = 1:p # adjust diagonal sample variances
      S[i, i] = S[i, i] - d[i]
    end
    F = LoadingsUpdate(S, r) # update loadings
    for i = 1:p # restore sample variances
      S[i, i] = S[i, i] + d[i]
    end
    if norm(d - old_d) < conv * norm(old_d) && iter > 1 break end
    old_d .= d
  end
  return (F, d)
end

3.4. Robust Factor Analysis

An appealing version of robust factor analysis minimizes the criterion
f μ ( F , D ) = ∑ i ∑ j M μ | · | [ s i j − ( F F ⊤ ) i j − d i j ] ≈ ∑ i ∑ j | s i j − ( F F ⊤ ) i j − d i j | = ∥ S − F F ⊤ − D ∥ 1 .
The minimum of z ↦ M μ | · | ( z − d ) subject to d ≥ 0 occurs at d = z when z ≥ 0 and at d = 0 when z < 0 . This determines the update of the diagonal entries d i i of D . In updating F , f μ ( F , D m + 1 ) is majorized by
1 2 μ ∥ S − F F ⊤ − D m + 1 − prox μ | · | ( S − F m F m ⊤ − D m + 1 ) ∥ F 2 + c m ,
where c m is an irrelevant constant. This is the same optimization criterion as before with S − D m + 1 replaced by S − D m + 1 − prox μ | · | ( S − F m F m ⊤ − D m + 1 ) . The following Julia code implements the Gauss–Newton update of F , which is orthogonalized prior to exiting the function FactorAnalysisLAD.
function ProxAbsolute(y::T, t::T) where T <: Real
  return sign(y) * max(0, abs(y) - t)
end
function FactorAnalysisLAD(S::Matrix{T}, r::Int, mu::T)
  where T <: Real
  p = size(S, 1)
  (d, old_d, conv) = (zeros(T, p), zeros(T, p), 1.0e-8)
  F = randn(p, r) # factor loadings
  (FtF, Y, Z, R) = (zeros(T, r, r), zeros(T, r, r), zeros(T, p, r))
  R = similar(S)
  for iter = 1:100
    for i = 1:p # update specific variances
      d[i] = max(S[i, i] - norm(F[i, :])^2, zero(T))
    end
    D = Diagonal(d)
    mul!(R, F, transpose(F))
    for j = 1:p
      for i = 1:p
        pr = ProxAbsolute(S[i, j] - R[i, j] - D[i, j], mu)
        R[i, j] = S[i, j] - D[i, j] - pr
      end
    end
    mul!(FtF, transpose(F), F) # prepare to update loadings
    Y = F / FtF
    mul!(Z, S, Y)
    Z .= Z .- Diagonal(d) * Y
    F .= Z .- F * ((transpose(Y) * Z - I) ./ 2) # loadings update
    if norm(d - old_d) < conv * norm(old_d) && iter > 1 break end
    old_d .= d
  end
  SVD = svd(F) # orthogonalize the columns of F
  F = SVD.U * Diagonal(SVD.S)
  return (F, d)
end

4. Computational Trials

To compare the performance of the algorithms, we simulated data for r = 5 factors and various combinations of the number of cases n and the dimension p of the ambient space R p . In each simulated dataset, standard normal deviates populate the p × r factor loading matrix F , and uniform deviates on [ 0 , 1 ] populate the specific variance vector d . Each observation x follows a Gaussian distribution with mean 0 and covariance F F ⊤ + D , where D is the diagonal matrix with diagonal d . After subtracting sample means, the sample covariance is S = 1 n X ⊤ X . Computational times are averaged over five independent trials for each tuple ( n , p ) .
Table 1 illustrates the consequences of an inaccurate spectral decomposition in iterated principal axis factorization. The values of ∥ S − F ^ F ^ ⊤ − D ^ ∥ F are tabulated for a few combinations of the number of cases n and number of features p under the converged values of F and D for the Gauss–Newton algorithm and the partial spectral decomposition algorithm without correction. Clearly, the spectral decompositions delivered by Arpack are untrustworthy in this application. Fortunately, a good remedy is available.
Table 1. Factor analysis accuracy comparisons.
Table 2 summarizes the computational efficiency of the various algorithms with n = 4000 cases and smoothing constant μ = 1 under the robust method. Spectral correction is applied with the partial spectral decomposition method. The second and third columns of the table supply the average execution time in seconds and the average number of iterations until convergence under the Gauss–Newton algorithm. The remaining columns record the ratios of the average execution times of the other algorithms to the average execution times of Gauss–Newton. The column headings GN, MM, Partial, Full, Robust, EM, and CM indicate Gauss–Newton, MM Gauss–Newton, partial spectral decomposition, full spectral decomposition, approximate least absolute deviation, EM algorithm, and CM algorithm, respectively. The EM and CM algorithms [6,7] are the computational engines for the maximum likelihood factor analysis option of the Julia package MultivariateStats. Blank entries in the table indicate ( p , r ) combinations too painful to analyze on a laptop computer. Comparison to the MultivariateStats code allows algorithm efficiency differences to emerge unaffected by computer language differences.
Table 2. Factor analysis timing comparisons.
Gauss–Newton is the clear winner in these speed comparisons. Under the full rank combination ( p , r ) = ( 250 , 250 ) it struggles and does not satisfy the strict convergence criterion. The MM Gauss–Newton fares better in this scenario. Gauss–Newton’s advantage stems from its avoidance of spectral decompositions and unnecessary allocations of p × p matrices. The MM version of Gauss–Newton is a close second in speed. The partial spectral decomposition method outperforms the full spectral decomposition method. Both seriously lag Gauss–Newton as the number of parameters increases. The robust method outperforms both spectral decomposition methods. To their credit, all four methods consistently converge to the same solution from random initializations of F . Contrary to the claims of the Julia documentation, the EM algorithm is faster than the CM algorithm on our simulated data.
We now turn to the genotype data featured in the software repository SNPArrays (https://github.com/OpenMendel/SnpArrays.jl (accessed on 12 July 2026)). The small European p × n genotype matrix X deposited there records genotypes on n = 379 people typed on p = 54,051 SNPS (single nucleotide polymorphisms). Each genotype counts the number of reference alleles at an SNP and is coded as 0, 1, or 2. The genetic relationship matrix G derived from X has entries
g j k = 1 p ∑ i = 1 p ( x i j − 2 f i ) ( x i k − 2 f i ) 2 f i ( 1 − f i )
and empirically summarizes how closely two people j and k are related. The quantity f i is the frequency of the reference allele in the population under study.
Factor analysis enters the picture via the approximation G ≈ F F ⊤ + D . This approximation compresses G and serves to reduce the computational load in estimating variance components such as additive genetic variance. On this problem with r = 5 , the EM algorithm takes 0.93 s and yields the loss ∥ G − F F ⊤ − D ∥ F 2 = 9.8163 . The CM algorithm fails with a cryptic error message. On a typical run the MM algorithm takes 0.0745 s, converges in 246 iterations, and achieves a loss of 1.9630 . In contrast, the Gauss–Newton algorithm takes 0.2975 s, fails to converge in 1000 iterations, and achieves a loss of either 1.9805 or 1.9808 . In fact, around iteration 75 the Gauss–Newton algorithm repeatedly cycles between two different points with these two losses. Started from the MM estimates, Gauss–Newton does not budge. Except for cycling, the behaviors of MM and Gauss–Newton are quite consistent across many random initializations of F . The absence of cycling by the MM algorithm speaks in its favor.
A second dataset from the same software repository records genotypes on n = 1940 mice typed on p = 10,150 SNPs. On this problem with r = 5 , the EM algorithm takes 130.09 s and yields a loss of 95.3345 . The MM algorithm takes 0.7586 s, converges in 207 iterations, and achieves a loss of 57.1027 . The Gauss–Newton algorithm takes 0.2704 s, converge in 94 iterations, and achieves the same loss. No cycling occurs across 10 runs with different random initializations of F . Readers wishing to replicate our findings can avail themselves of the program GenotypeMatrix.jl in our previously mentioned software site.

5. Discussion

Jennrich [5] derives a Gauss–Newton algorithm for factor analysis and identifies it as a version of Fisher scoring. Without presenting empirical evidence, he states
We feel this algorithm is important for several reasons. Because the Fisher scoring algorithm plays a fundamental role in statistical analysis it is of natural interest to know what form it can take when applied to exploratory factor analysis. The resulting algorithm turns out to be simple, easy to implement, faster per iteration than most exploratory algorithms (it requires no eigenvectors), and a respectable algorithm in its own right.
Our numerical experiments validate each of these claims. The computational complexity O ( p 2 r ) of Gauss–Newton per iteration stems from a single S F matrix multiplication, which is accomplished by a fast BLAS level 3 operation. Formation of the sample covariance matrix S also benefits from fast matrix multiplication.
Our MM version of the Gauss–Newton method is tailored to the sum of squares f ( F , D ) = 1 2 ∥ S − F F ⊤ − D ∥ F 2 . Linearization of f ( F , D ) in the increment Δ to F and a subsequent majorization lead to the exact update (9). Owing to the MM principle, this update is guaranteed to reduce the linearization. Unfortunately, the additional iterations until convergence counteract the simplicity of the MM updates. The original Gauss–Newton algorithm still comes out ahead, with the caution that it occasionally suffers from parameter cycling close to convergence.
Block descent gives a particularly simple update of D that respects the non-negativity constraints on the diagonal entries of D . In Jennrich’s simultaneous versions of Gauss–Newton [5], non-negativity is handled by quadratic programming. Although block descent often takes more iterations to converge than competing algorithms that update all parameters simultaneously, our version of Gauss–Newton factor analysis suffers little penalty in this regard. It is hard to overstate the computational attractiveness of Gauss–Newton factor analysis. We have found that it can be over a thousand-fold faster than maximum likelihood factor analysis. Even if one prefers maximum likelihood factor analysis, the Gauss–Newton estimates can serve as initial values in a maximum likelihood search over parameter space.
Other potential competitors to Gauss–Newton include MINRES (minimum residuals) [21,22] and Newton’s method [23]. MINRES operates on correlation matrices and depends on Gauss–Seidel updating of one row of F at a time. Block updates of this form slow dramatically as the number of blocks increase. Newton’s method, as advocated by Derflinger [23], converges in very few iterations but requires a full p × p eigen-decomposition at each iteration. This requirement is nearly prohibitive for p large.
Pison et al. [24] suggest a version of factor analysis that leverages a robust estimate of the sample covariance matrix S . Although it is beyond the scope of this paper to compare this approach to our robust method of factor analysis, it is worth noting that Pison et al.’s procedure potentially benefits from the Gauss–Newton algorithm.
The perturbation correction of Ogita and Aishima [15] has applications beyond the confines of factor analysis. Correction of approximate principal components immediately comes to mind. Randomized algorithms for PCA give approximate principal components in a fraction of the time taken by full PCA extraction [25]. Single precision PCA partially achieves the same goal. Both methods can be improved by perturbation correction. Another potential application is iteratively reweighted least squares, as practiced in parameter estimation in generalized linear models. Ogita and Aishima [26] recently extended perturbation correction to singular value decompositions. These advances in numerical linear algebra are under-appreciated.

Funding

This research was supported in part by USPHS grant GM141798.

Data Availability Statement

The genetics datasets are freely available at https://github.com/OpenMendel/SnpArrays.jl, accessed on 12 July 2026. All Julia code is freely available at https://github.com/KennethLange/ExploratoryFactorAnalysis, accessed on 12 July 2026.

Acknowledgments

I thank Jan de Leeuw for his many helpful comments and suggested references.

Conflicts of Interest

The author declares no conflicts of interest.

References

  1. Thomson, G.H. Hotelling’s method modified to give Spearman’s g. J. Educ. Psychol. 1934, 25, 366. [Google Scholar] [CrossRef] [Scilit]
  2. De Winter, J.C.; Dodou, D. Factor recovery by principal axis factoring and maximum likelihood factor analysis as a function of factor pattern and sample size. J. Appl. Stat. 2012, 39, 695–710. [Google Scholar]
  3. Jöreskog, K.G. Some contributions to maximum likelihood factor analysis. Psychometrika 1967, 32, 443–482. [Google Scholar] [CrossRef] [Scilit]
  4. Jennrich, R.I.; Robinson, S.M. A Newton-Raphson algorithm for maximum likelihood factor analysis. Psychometrika 1969, 34, 111–123. [Google Scholar] [CrossRef] [Scilit]
  5. Jennrich, R.I. A Gauss-Newton algorithm for exploratory factor analysis. Psychometrika 1986, 51, 277–284. [Google Scholar] [CrossRef] [Scilit]
  6. Rubin, D.B.; Thayer, D.T. EM algorithms for ML factor analysis. Psychometrika 1982, 47, 69–76. [Google Scholar] [CrossRef] [Scilit]
  7. Zhao, J.H.; Yu, P.L.; Jiang, Q. ML estimation for factor analysis: EM or non-EM? Stat. Comput. 2008, 18, 109–123. [Google Scholar]
  8. Bentler, P.M.; De Leeuw, J. Factor analysis via components analysis. Psychometrika 2011, 76, 461–470. [Google Scholar] [CrossRef] [Scilit]
  9. Grieder, S.; Steiner, M.D. Algorithmic jingle jungle: A comparison of implementations of principal axis factoring and promax rotation in R and SPSS. Behav. Res. Methods 2022, 54, 54–74. [Google Scholar] [PubMed]
  10. Wentzell, P.D.; Giglio, C.; Kompany-Zareh, M. Beyond principal components: A critical comparison of factor analysis methods for subspace modelling in chemistry. Anal. Methods 2021, 13, 4188–4219. [Google Scholar] [CrossRef] [Scilit] [PubMed]
  11. Golub, G.H.; Van Loan, C.F. Matrix Computations; JHU Press: Baltimore, MD, USA, 2013. [Google Scholar]
  12. Lange, K. MM Optimization Algorithms; Society for Industrial and Applied Mathematics: Philadelphia, PA, USA, 2016. [Google Scholar]
  13. Lange, K. Algorithms from the Book, 2nd ed.; SIAM: Philadelphia, PA, USA, 2025. [Google Scholar]
  14. Hunter, D.R.; Lange, K. A tutorial on MM algorithms. Am. Stat. 2004, 58, 30–37. [Google Scholar] [CrossRef] [Scilit]
  15. Ogita, T.; Aishima, K. Iterative refinement for symmetric eigenvalue decomposition. Jpn. J. Ind. Appl. Math. 2018, 35, 1007–1035. [Google Scholar] [CrossRef] [Scilit]
  16. Ogita, T.; Aishima, K. Iterative refinement for symmetric eigenvalue decomposition II: Clustered eigenvalues. Jpn. J. Ind. Appl. Math. 2019, 36, 435–459. [Google Scholar] [CrossRef] [Scilit]
  17. Shiroma, K.; Yamamoto, Y. Fixed-point analysis of Ogita-Aishima’s symmetric eigendecomposition refinement algorithm for multiple eigenvalues. JSIAM Lett. 2020, 12, 5–8. [Google Scholar] [CrossRef] [Scilit]
  18. Terao, T.; Imamura, T.; Ozaki, K. Iterative refinement for an eigenpair subset of a real symmetric matrix. JSIAM Lett. 2024, 16, 89–92. [Google Scholar] [CrossRef] [Scilit]
  19. Nesterov, Y. Smooth minimization of non-smooth functions. Math. Program. 2005, 103, 127–152. [Google Scholar]
  20. Liu, X.; Wen, Z.; Zhang, Y. An efficient Gauss–Newton algorithm for symmetric low-rank product matrix approximations. SIAM J. Optim. 2015, 25, 1571–1608. [Google Scholar] [CrossRef] [Scilit]
  21. Harman, H.H.; Fukuda, Y. Resolution of the Heywood case in the MINRES solution. Psychometrika 1966, 31, 563–571. [Google Scholar] [CrossRef] [Scilit]
  22. Harmann, H.; Jones, W. Factor analysis by minimising residuals. Psvchometrika 1966, 31, 351–368. [Google Scholar]
  23. Derflinger, G. A general computing algorithm for factor analysis. Biom. J. 1979, 21, 25–38. [Google Scholar] [CrossRef] [Scilit]
  24. Pison, G.; Rousseeuw, P.J.; Filzmoser, P.; Croux, C. Robust factor analysis. J. Multivar. Anal. 2003, 84, 145–172. [Google Scholar] [CrossRef] [Scilit]
  25. Tropp, J.A.; Webber, R.J. Randomized algorithms for low-rank matrix approximation: Design, analysis, and applications. arXiv 2023, arXiv:2306.12418. [Google Scholar]
  26. Ogita, T.; Aishima, K. Iterative refinement for singular value decomposition based on matrix multiplication. J. Comput. Appl. Math. 2020, 369, 112512. [Google Scholar] [CrossRef] [Scilit]
Disclaimer/Publisher’s Note: The statements, opinions and data contained in all publications are solely those of the individual author(s) and contributor(s) and not of MDPI and/or the editor(s). MDPI and/or the editor(s) disclaim responsibility for any injury to people or property resulting from any ideas, methods, instructions or products referred to in the content.

Article Metrics

Citations

Article Access Statistics

Multiple requests from the same IP address are counted as one view.