scaleDiagnosis voert zowel een PCA (principale componenten analyse) als een factoranalyse uit, beiden met Oblimin rotatie. Echter, hij laat standaard alleen de factorladingen uit de PCA zien. De factoranalyse wordt met Maximum Likelihood algoritmen uitgevoerd.
De functie fa voert juist een factoranalyse uit, by default ook met de Oblimin rotatie. Hier is de default om de "minimum residuals" aanpak te gebruiken in plaats van de maximum likelihood algoritmen (fm="minres" of fm="ml")
Dat die twee verschillende uitkomsten geven is dus logisch.
De reden dat scaleDiagnosis ongeveer dezelfde uitkomsten geeft als SPSS is omdat SPSS standaard geen factoranalyse doet, maar een componentenanalyse. De reden dat de uitkomsten nog iets verschillend zijn is omdat SPSS waarschijnlijk standaard de methode van de minimale residuen gebruikt in plaats van maximum likelihood.
Overigens is een belangrijke les dat je nooit cut-offs moet gebruiken om de resultaten van factoranalyse of componentenanalyse (of uberhaupt, welke analyse dan ook) te interpreteren. Er zijn veel verschillende methoden die je kunt gebruiken, die allemaal goed te verdedigen zijn, en allemaal net andere uitkomsten geven. Verder zijn je uitkomsten altijd verschillende van steekproef tot steekproef. Een eigenwaarde kan in de ene steekproef 1.4 zijn, en in de andere 0.7, bij steekproeven uit dezelfde populatie. Kijk dus altijd naar verschillende informatiebronnen tegelijk.
PS: ik heb nagekeken welke rotatiemethode scaleDiagnosis gebruikt door in R gewoon de naam van de functie in te geven:
> scaleDiagnosis
Dan laat R de broncode zien, waaronder:
if (ncol(res$cor) > 2) {
res$pca <- principal(r = res$cor, n.obs = res$n, rotate = "oblimin",
nfactors = res$factors)
res$fa <- fa(r = res$cor, n.obs = res$n, rotate = "oblimin",
fm = "ml", nfactors = res$factors)
}
Hij 'dwingt' dus Oblimin rotatie af. En hij slaat zowel een PCA als een FA op. Maar hij laat er maar eentje zien, dus daarna heb ik gekeken naar de broncode van de functie om de resultaten van class scaleDiagnosis te printen:
> print.scaleDiagnosis
function (x, ...)
{
print(x$scaleReliability, ...)
cat(paste0("\nEigen values: ", paste(round(x$eigen$values,
3), collapse = ", ")))
print(x$pca$loadings, ...)
cat("\n")
print(x$describe, ...)
print(x$scatterMatrix$output$scatterMatrix, ...)
invisible()
}
<environment: namespace:userfriendlyscience>
Hij laat dus alleen de PCA zien.