"Rotazioni" è un approccio sviluppato nell'analisi fattoriale; le rotazioni (come ad esempio varimax) vengono applicate ai carichi , non agli autovettori della matrice di covarianza. I caricamenti sono autovettori ridimensionati dalle radici quadrate dei rispettivi autovalori. Dopo la rotazione varimax, i vettori di caricamento non sono più ortogonali (anche se la rotazione è chiamata "ortogonale"), quindi non si può semplicemente calcolare le proiezioni ortogonali dei dati sulle direzioni di caricamento ruotate.
La risposta di FTusell presuppone che la rotazione di varimax sia applicata agli autovettori (non ai carichi). Questo sarebbe piuttosto non convenzionale. Per i dettagli, consultare il mio account dettagliato di PCA + varimax: PCA è seguito da una rotazione (come varimax) è ancora PCA? In breve, se osserviamo l'SVD della matrice di dati , quindi ruotare i caricamenti significa inserire R R ⊤ per una matrice di rotazione R come segue: X = ( U R ) ( R ⊤ S V ⊤ ) .X=USV⊤RR⊤RX=(UR)(R⊤SV⊤).
Se la rotazione viene applicata ai caricamenti (come di solito), ci sono almeno tre semplici modi per calcolare i PC con rotazione varimax in R:
Sono prontamente disponibili tramite la funzione psych::principal(dimostrando che questo è davvero l'approccio standard). Si noti che restituisce punteggi standardizzati , vale a dire che tutti i PC hanno una varianza di unità.
È possibile utilizzare manualmente la varimaxfunzione per ruotare i carichi, quindi utilizzare i nuovi carichi ruotati per ottenere i punteggi; è necessario moltiplicare i dati con lo pseudo-inverso trasposto dei carichi ruotati (vedere le formule in questa risposta di @ttnphns ). Ciò produrrà anche punteggi standardizzati.
Si può usare la varimaxfunzione per ruotare i carichi e quindi usare la $rotmatmatrice di rotazione per ruotare i punteggi standardizzati ottenuti con prcomp.
Tutti e tre i metodi producono lo stesso risultato:
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
Ciò produce tre uscite identiche:
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
Nota: la varimaxfunzione in R utilizza i normalize = TRUE, eps = 1e-5parametri per impostazione predefinita ( vedere la documentazione ). Uno potrebbe voler cambiare questi parametri (ridurre la epstolleranza e prendersi cura della normalizzazione di Kaiser) quando si confrontano i risultati con altri software come SPSS. Ringrazio @GottfriedHelms per avermi portato alla mia attenzione. [Nota: questi parametri funzionano quando vengono passati alla varimaxfunzione, ma non funzionano quando vengono passati alla psych::principalfunzione. Questo sembra essere un bug che verrà corretto.]