3
$\begingroup$

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 

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
SS loadings      1.510   1.289
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

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
SS loadings      1.510   1.289
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

Loadings:
    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
SS loadings    1.510 1.289
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.     

Data can be downloaded here.

$\endgroup$

migrated from stackoverflow.com Nov 27 '14 at 11:18

This question came from our site for professional and enthusiast programmers.

  • 1
    $\begingroup$ 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 $\endgroup$ – user20650 Nov 27 '14 at 16:57
  • $\begingroup$ 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? $\endgroup$ – ttnphns Nov 27 '14 at 18:55
  • $\begingroup$ @user20650, fa in psych gives me the same result, I have added the result. $\endgroup$ – kitman0804 Nov 28 '14 at 2:47
  • 1
    $\begingroup$ If, as you say, there's no difference between SPSS and R results under no rotation or varimax rotation, then, logically, the cause of the difference you had observed is due to some difference in the promax rotation. Programs may differ in how they perform it. $\endgroup$ – ttnphns Nov 28 '14 at 8:09
  • 2
    $\begingroup$ 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). $\endgroup$ – ttnphns Dec 2 '14 at 8:02

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.