"Rotationen" ist ein Ansatz, der in der Faktorenanalyse entwickelt wurde. dort werden Drehungen (wie z. B. Varimax) auf Ladungen angewendet , nicht auf Eigenvektoren der Kovarianzmatrix. Belastungen sind Eigenvektoren, die durch die Quadratwurzeln der jeweiligen Eigenwerte skaliert werden. Nach der Varimax-Drehung sind die Ladevektoren nicht mehr orthogonal (obwohl die Drehung "orthogonal" genannt wird), so dass man nicht einfach orthogonale Projektionen der Daten auf die gedrehten Laderichtungen berechnen kann.
Bei der Antwort von @ FTusell wird davon ausgegangen, dass die Varimax-Rotation auf die Eigenvektoren angewendet wird (nicht auf Lasten). Das wäre ziemlich unkonventionell. Weitere Informationen finden Sie in meinem ausführlichen Bericht zu PCA + varimax: Wird nach PCA noch eine Rotation (z. B. varimax) durchgeführt? Betrachten wir kurz die SVD der Datenmatrix , so bedeutet das Drehen der Ladungen das Einfügen von R R ⊤ für eine Rotationsmatrix R wie folgt: X = ( U R ) ( R ⊤ S V ⊤ ) .X=USV⊤RR⊤RX=(UR)(R⊤SV⊤).
Wenn Ladungen gedreht werden (wie es normalerweise der Fall ist), gibt es mindestens drei einfache Methoden, um varimax-gedrehte PCs in R zu berechnen:
Sie sind über die Funktion leicht verfügbar psych::principal
(was zeigt, dass dies tatsächlich der Standardansatz ist). Beachten Sie, dass es standardisierte Werte zurückgibt , dh alle PCs haben eine Einheitsvarianz.
Man kann die varimax
Funktion manuell verwenden , um die Ladungen zu drehen, und dann die neuen gedrehten Ladungen verwenden, um die Bewertungen zu erhalten; man muss die Daten mit der transponierten Pseudoinverse der gedrehten Ladungen multiplizieren (siehe Formeln in dieser Antwort von @ttnphns ). Dies wird auch standardisierte Ergebnisse liefern.
Man kann die varimax
Funktion verwenden, um die Ladungen zu drehen, und dann die $rotmat
Rotationsmatrix verwenden, um die mit erhaltenen standardisierten Punktzahlen zu drehen prcomp
.
Alle drei Methoden führen zu demselben Ergebnis:
irisX <- iris[,1:4] # Iris data
ncomp <- 2
pca_iris_rotated <- psych::principal(irisX, rotate="varimax", nfactors=ncomp, scores=TRUE)
print(pca_iris_rotated$scores[1:5,]) # Scores returned by principal()
pca_iris <- prcomp(irisX, center=T, scale=T)
rawLoadings <- pca_iris$rotation[,1:ncomp] %*% diag(pca_iris$sdev, ncomp, ncomp)
rotatedLoadings <- varimax(rawLoadings)$loadings
invLoadings <- t(pracma::pinv(rotatedLoadings))
scores <- scale(irisX) %*% invLoadings
print(scores[1:5,]) # Scores computed via rotated loadings
scores <- scale(pca_iris$x[,1:2]) %*% varimax(rawLoadings)$rotmat
print(scores[1:5,]) # Scores computed via rotating the scores
Dies ergibt drei identische Ausgaben:
1 -1.083475 0.9067262
2 -1.377536 -0.2648876
3 -1.419832 0.1165198
4 -1.471607 -0.1474634
5 -1.095296 1.0949536
Hinweis: Die varimax
Funktion in R verwendet normalize = TRUE, eps = 1e-5
standardmäßig Parameter ( siehe Dokumentation ). Möglicherweise möchten Sie diese Parameter ändern (verringern Sie die eps
Toleranz und achten Sie auf die Kaiser-Normalisierung), wenn Sie die Ergebnisse mit anderen Programmen wie SPSS vergleichen. Ich danke @GottfriedHelms, dass er mich darauf aufmerksam gemacht hat. [Hinweis: Diese Parameter funktionieren, wenn sie an die varimax
Funktion übergeben werden, aber nicht, wenn sie an die psych::principal
Funktion übergeben werden. Dies scheint ein Fehler zu sein, der behoben wird.]