# Q: Exploratory factor analysis in R

I am trying to do an exploratory factor analysis (EFA) in R with oblique (promax) rotation.

From Wikipedia,

In oblique rotation, one gets both a pattern matrix and a structure matrix. The structure matrix is simply the factor loading matrix as in orthogonal rotation, representing the variance in a measured variable explained by a factor on both a unique and common contributions basis. The pattern matrix, in contrast, contains coefficients which just represent unique contributions. The more factors, the lower the pattern coefficients as a rule since there will be more common contributions to variance explained. For oblique rotation, the researcher looks at both the structure and pattern coefficients when attributing a label to a factor. Principles of oblique rotation can be derived from both cross entropy and its dual entropy.

In R, factanal() function gives me one loading matrix, while SPSS gives me two matrices namely, (i) pattern matrix and (ii) structure matrix. But interestingly, the entries of the loading matrix in R differ from the pattern matrix and the structure matrix in SPSS.

So, here are my questions:

1. What is the loading matrix given by factanal()? Is it the pattern matrix or the structure matrix or the factor loading matrix (the $l_{ik}$'s in $x_i - \mu_i = l_{i1}F_1 + ... + l_{ik}F_k + e_i$, where $x_i$, $F_k$'s and $e_i$ are the observed measurement, latent factors and the error respectively)?

2. If the loading matrix given by factanal() is either the pattern or structure matrix, why are the entries are so different from that given by SPSS?

3. If the loading matrix given by factanal() is not the pattern nor structure matrix, how can I get/calculate them in R?

Thanks.

Below are the outputs in R and SPSS of the same data set:

R

factanal:

Call:
factanal(x = X, factors = 2, rotation = "promax")

Uniquenesses:
B2    B3    B5    B6    B7    B9   B10
0.326 0.559 0.487 0.800 0.715 0.733 0.631

Factor1 Factor2
B2   0.835
B3   0.425   0.375
B5   0.754  -0.126
B6   0.137   0.377
B7           0.521
B9           0.539
B10 -0.197   0.653

Factor1 Factor2
Proportion Var   0.216   0.184
Cumulative Var   0.216   0.400

Factor Correlations:
Factor1 Factor2
Factor1   1.000  -0.375
Factor2  -0.375   1.000

Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 9.34 on 8 degrees of freedom.
The p-value is 0.314


factanal & promax

> promax(factanal(X, factors=2, rotation="none")$loadings, m=4) #m: The power used the target for promax$loadings

Factor1 Factor2
B2   0.835
B3   0.425   0.375
B5   0.754  -0.126
B6   0.137   0.377
B7           0.521
B9           0.539
B10 -0.197   0.653

Factor1 Factor2
Proportion Var   0.216   0.184
Cumulative Var   0.216   0.400

$rotmat [,1] [,2] [1,] 0.8926099 0.2266316 [2,] -0.6060523 1.0548412  fa in psych: > fa(cov(X), nfactors=2, rotate="promax", fm="ml")$loading

ML1    ML2
B2   0.835
B3   0.425  0.375
B5   0.754 -0.126
B6   0.137  0.377
B7          0.521
B9          0.539
B10 -0.197  0.653

ML1   ML2
Proportion Var 0.216 0.184
Cumulative Var 0.216 0.400


SPSS

syntax:

FACTOR
/VARIABLES B2 B3 B5 B6 B7 B9 B10
/MISSING LISTWISE
/ANALYSIS B2 B3 B5 B6 B7 B9 B10
/PRINT INITIAL CORRELATION EXTRACTION ROTATION FSCORE
/CRITERIA FACTORS(2) ITERATE(50)
/EXTRACTION ML
/CRITERIA ITERATE(50)
/ROTATION PROMAX(4).


output:

Pattern Matrixa
Factor
1   2
B2  .830    -.029
B3  .437    .376
B5  .746    -.114
B6  .150    .374
B7  .049    .515
B9  -.052   .531
B10 -.173   .643
Extraction Method: Maximum Likelihood.
Rotation Method: Promax with Kaiser Normalization.
a Rotation converged in 3 iterations.

Structure Matrix
Factor
1   2
B2  .820    .246
B3  .561    .521
B5  .708    .133
B6  .274    .424
B7  .220    .531
B9  .125    .514
B10 .041    .585
Extraction Method: Maximum Likelihood.
Rotation Method: Promax with Kaiser Normalization.


• the R loadings matrix looks pretty close to the spss pattern matrix to me. the programs will use different algorithms hence you get slightly different answers. also have a look at fa in the psych package for more different results – user20650 Nov 27 '14 at 16:57
• Unfortunately, I'm not R expert to help. Can you give data, for people to try to reproduce your results? Also, note that promax needs a parameter (4 in SPSS in your syntax) - what's with R about it? Try to compare the results between SPSS and R without any rotation or with orthogonal rotation - will they be different? – ttnphns Nov 27 '14 at 18:55
• But hey, don't both your factanal and fa do the analysis based on covariance matrix? Your SPSS syntax did it based on correlation matrix (and, unfortunately, SPSS can do maximum likelihood FA with correlations only). – ttnphns Dec 2 '14 at 8:02