"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 varimax
funzione 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 varimax
funzione per ruotare i carichi e quindi usare la $rotmat
matrice 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 varimax
funzione in R utilizza i normalize = TRUE, eps = 1e-5
parametri per impostazione predefinita ( vedere la documentazione ). Uno potrebbe voler cambiare questi parametri (ridurre la eps
tolleranza 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 varimax
funzione, ma non funzionano quando vengono passati alla psych::principal
funzione. Questo sembra essere un bug che verrà corretto.]