# [R] bug in promax?

Christof Schuster cschuste at nd.edu
Wed May 14 00:39:31 CEST 2003

```I was wondering whether the following inconsistency of the promax
rotation function with the results of a promax rotation using SAS
should be considered a bug in the promax function of R. Any comments
will be highly appreciated.

The following is a loading matrix obtained from a varimax rotation in SAS:
x <- t(array(c(0.78107,         0.35573,
0.85995,         0.07887,
0.79376,         0.22499,
0.26307,         0.85087,
0.29449,         0.72966,
0.06064,         0.68135), c(2,6)))

Clearly, the varimax function of R confirms this because

varimax(x)\$rotmat
[,1]         [,2]
[1,]  1.000000e+00 2.021128e-07
[2,] -2.021128e-07 1.000000e+00

yields the identity matrix.

SAS will return the following matrix after a promax rotation (for which
m=3 by default):

0.75760         0.18383
0.91956        -0.14061
0.80720         0.03711
0.05546         0.86360
0.12295         0.72239
-0.11977         0.73116

However, using the promax function of R yields

[,1]        [,2]
[1,]  0.74582399  0.20809487
[2,]  0.90713821 -0.11197901
[3,]  0.79547453  0.06260245
[4,]  0.05020993  0.86729962
[5,]  0.11747045  0.72788738
[6,] -0.12182636  0.72904497

Although the values are quite close to the SAS solution, there is
nevertheless a small mismatch. The following slightly edited function
of promax

mypromax <- function (x, m = 3)
{
if (ncol(x) < 2)
return(x)
dn <- dimnames(x)
xx <- varimax(x)
x1 <- diag(1/sqrt(diag(x %*% t(x)))) %*% x
Q <- x1 * abs(x1)^(m - 1)
U <- lm.fit(x, Q)\$coefficients
d <- diag(solve(t(U) %*% U))
U <- U %*% diag(sqrt(d))
dimnames(U) <- NULL
z <- x %*% U
U <- xx\$rotmat %*% U
dimnames(z) <- dn
}

yields

[,1]     [,2]
[1,]  0.75760  0.18383
[2,]  0.91956 -0.14061
[3,]  0.80721  0.03711
[4,]  0.05546  0.86360
[5,]  0.12295  0.72238
[6,] -0.11977  0.73116

promax rotation from SAS. The only differences of the above mypromax
rotation are first normalized (see the line in which x1 is calculated)
before they are used to calculate the target matrix Q in the next
line.

Hendrickson & White (1964), BJSP, 17, 65-70 who originally suggested
PROMAX wrote about the target matrix, p. 66: "Each element of this
matrix [the target matrix Q] is, ..., the kth power of the
corresponding element in the row-column normalized orthogonal matrix."

Although I am not sure what Hendrickson and White meant with "row-column"
normalization it appears to me that the original promax function is
target matrix is calculated. The normalization I have used (and that
appears to be used by SAS) ensures that diag(x1 x1')=I, where x1 denotes

Christof Schuster

Christof Schuster
University of Notre Dame
Department of Psychology
103 Haggar Hall
Notre Dame, IN 46556

Tel: (574) 631-5473    email: cschuste at nd.edu
Fax: (574) 631-8883    www.nd.edu/~cschuste

```