Varimax Rotation in Excel VBA
by Nick V. Flor • March 7, 2016 • @ProfessorF
Here’s my implementation of the Varimax Rotation algorithm — written in Excel VBA — based on IBM’s SPSS algorithm, which in turn is based on Harman (1976). The main difference is that I use a counter to control iteration. Note: I use custom functions, but the algorithm follows IBM’s math, so the functions should be self-explanatory.
Function fVarimax(F, loops) Dim H, Hinv, i, j, k, Lambda, LL, mRows, nCols, Omega Dim u, v, A, B, C, D, X, Y, P, rot
Hinv = calcHinv(F) H = calcH(F) Lambda = fmMult(Hinv, F)
getNumRowsCols Lambda, mRows, nCols For Z = 1 To loops For i = 0 To (nCols - 2) For j = (i + 1) To (nCols - 1) u = calcU(Lambda, i, j) v = calcV(Lambda, i, j) A = 0 B = 0 C = 0 D = 0 For k = 0 To (mRows - 1) A = A + u(k, 0) B = B + v(k, 0) C = C + (u(k, 0) ^ 2 - v(k, 0) ^ 2) D = D + (2 * u(k, 0) * v(k, 0)) Next X = D - (2 * A * B) / mRows Y = C - (A ^ 2 - B ^ 2) / mRows P = 0.25 * Atn(X / Y) rot = createRot(P) LL = rotateFactors(Lambda, i, j, rot) Lambda = replaceFactors(Lambda, LL, i, j) Next Next Next Omega = fmMult(H, Lambda) fVarimax = Omega End Function