"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.]
principal
,prcomp
undprincomp
, aber die daraus resultierenden Belastungen / Studie Schlussfolgerungen sind sehr verschieden voneinander. Nach meinem Verständnis geben prcomp und princomp keine standardisierten Scores oder Ladungen zurück. Meine Frage ist: Was ist der beste Ansatz? Will ich wirklich standardisierte Ergebnisse? Ist das nicht mein Code ,pca_iris <- prcomp(irisX, center=T, scale=T)
gefolgt vonvarimax(pca_iris$rotation)$loadings
so richtig wie Sie oben?principal
Prozedur zu sein, die immer mit Kaiser-Normalisierung und eps = 1e-5 rechnet. Bisher gibt es keine Informationen, warum auf r-fiddle.org die Version korrekt funktioniert. Wir sollten also auf Updates warten - und alle jetzt veralteten Kommentare löschen. Amöbe - es wäre gut, die Bemerkung in Ihrer Antwort entsprechend zu aktualisieren. Vielen Dank für die Zusammenarbeit!Sie müssen die Matrix verwenden
$loadings
, nicht$rotmat
:Die Matrix
$rotmat
ist die orthogonale Matrix, die aus den nicht gedrehten Ladungen die neuen Ladungen erzeugt.BEARBEITEN ab dem 12. Februar 2015:
Mit anderen Worten, die von mir vorgeschlagene Lösung ist nur dann richtig, wenn sie unbrauchbar und unsinnig wäre.
Ein herzliches Dankeschön geht an @amoeba, dass sie mir diese Angelegenheit klar gemacht haben. Ich lebe seit Jahren mit diesem Missverständnis.
WEITERE ÄNDERUNGEN 12. Februar 2015
quelle
psych::principal
. [Abgesehen davon habe ich Ihre Antwort bearbeitet, um die Skalierung einzufügen, wie in den obigen Kommentaren erläutert.]Ich war auf der Suche nach einer Lösung, die für PCA mit ade4 funktioniert .
Hier finden Sie die Funktion:
Erstellt am 2020-01-14 von der Paket reprex (v0.3.0)
Ich hoffe das hilft!
quelle