First of all, I second ttnphns recommendation to look at the solution before rotation. Factor analysis as it is implemented in SPSS is a complex procedure with several steps, comparing the result of each of these steps should help you to pinpoint the problem.
Specifically you can run
FACTOR
/VARIABLES <variables>
/MISSING PAIRWISE
/ANALYSIS <variables>
/PRINT CORRELATION
/CRITERIA FACTORS(6) ITERATE(25)
/EXTRACTION ULS
/CRITERIA ITERATE(25)
/ROTATION NOROTATE.
to see the correlation matrix SPSS is using to carry out the factor analysis. Then, in R, prepare the correlation matrix yourself by running
r <- cor(data)
Any discrepancy in the way missing values are handled should be apparent at this stage. Once you have checked that the correlation matrix is the same, you can feed it to the fa function and run your analysis again:
fa.results <- fa(r, nfactors=6, rotate="promax",
scores=TRUE, fm="pa", oblique.scores=FALSE, max.iter=25)
If you still get different results in SPSS and R, the problem is not missing values-related.
Next, you can compare the results of the factor analysis/extraction method itself.
FACTOR
/VARIABLES <variables>
/MISSING PAIRWISE
/ANALYSIS <variables>
/PRINT EXTRACTION
/FORMAT BLANK(.35)
/CRITERIA FACTORS(6) ITERATE(25)
/EXTRACTION ULS
/CRITERIA ITERATE(25)
/ROTATION NOROTATE.
and
fa.results <- fa(r, nfactors=6, rotate="none",
scores=TRUE, fm="pa", oblique.scores=FALSE, max.iter=25)
Again, compare the factor matrices/communalities/sum of squared loadings. Here you can expect some tiny differences but certainly not of the magnitude you describe. All this would give you a clearer idea of what's going on.
Now, to answer your three questions directly:
- In my experience, it's possible to obtain very similar results, sometimes after spending some time figuring out the different terminologies and fiddling with the parameters. I have had several occasions to run factor analyses in both SPSS and R (typically working in R and then reproducing the analysis in SPSS to share it with colleagues) and always obtained essentially the same results. I would therefore generally not expect large differences, which leads me to suspect the problem might be specific to your data set. I did however quickly try the commands you provided on a data set I had lying around (it's a Likert scale) and the differences were in fact bigger than I am used to but not as big as those you describe. (I might update my answer if I get more time to play with this.)
- Most of the time, people interpret the sum of squared loadings after rotation as the “proportion of variance explained” by each factor but this is not meaningful following an oblique rotation (which is why it is not reported at all in psych and SPSS only reports the eigenvalues in this case – there is even a little footnote about it in the output). The initial eigenvalues are computed before any factor extraction. Obviously, they don't tell you anything about the proportion of variance explained by your factors and are not really “sum of squared loadings” either (they are often used to decide on the number of factors to retain). SPSS “Extraction Sums of Squared Loadings” should however match the “SS loadings” provided by psych.
- This is a wild guess at this stage but have you checked if the factor extraction procedure converged in 25 iterations? If the rotation fails to converge, SPSS does not output any pattern/structure matrix and you can't miss it but if the extraction fails to converge, the last factor matrix is displayed nonetheless and SPSS blissfully continues with the rotation. You would however see a note “a. Attempted to extract 6 factors. More than 25 iterations required. (Convergence=XXX). Extraction was terminated.” If the convergence value is small (something like .005, the default stopping condition being “less than .0001”), it would still not account for the discrepancies you report but if it is really large there is something pathological about your data.
Best Answer
Yes, there may be a reason to withdraw from rotation in factor analysis. That reason is actually similar to why we usually do not rotate principal components in PCA (i.e. when we use it primarily for dimensionality reduction and not to model latent traits).
After extraction, factors (or components) are orthogonal$^1$ and are usually output in descending order of their variances (column sum-of-squares of the loadings). The 1st factor thus dominates. Junior factors statistically explain what the 1st one leaves unexplained. Often that factor loads quite highly on all the variables, and that means that it is responsible for the background correlatedness among the variables. Such 1st factor is sometimes called general factor or g-factor. It is considered responsible for the fact that positive correlations prevail in psychometrics.
If you are interested in exploring that factor rather than disregard it and let it dissolve behind the simple structure, don't rotate the extracted factors. You may even partial out the effect of general factor from the correlations and proceed to factor-analyze the residual correlations.
$^1$ The difference between extraction factor/component solution, on one hand, and that solution after its rotation (orthogonal or oblique), on the other hand, is that - the extracted loading matrix $\bf A$ has orthogonal (or nearly orthogonal, for some methods of extraction) columns: $\bf A'A$ is diagonal; in other words, the loadings reside in the "principle axis structure". After rotation - even a rotation preserving orthogonality of factors/components, such as varimax - the orthogonality of loadings is lost: "principle axis structure" is abandoned for "simple structure". Principal axis structure allows to sort out among the factors/components as "more principal" or "less principal" (and the 1st column of $\bf A$ being the most general component of all), while in simple structure equal importance of all the rotated factors/components is assumed - logically speaking, you cannot select them after the rotation: accept all of them (Pt 2 here). See picture here displaying loadings before rotation and after varimax rotation.