„Obroty” to podejście opracowane w analizie czynnikowej; tam obroty (takie jak np. varimax) są stosowane do ładunków , a nie do wektorów własnych macierzy kowariancji. Ładunki są wektorami własnymi skalowanymi przez pierwiastki kwadratowe odpowiednich wartości własnych. Po rotacji varimax wektory ładujące nie są już ortogonalne (nawet jeśli obrót nazywany jest „ortogonalnym”), więc nie można po prostu obliczyć rzutów ortogonalnych danych na obrócone kierunki ładowania.
Odpowiedź FTusella zakłada, że rotacja varimax jest stosowana do wektorów własnych (nie do obciążeń). To byłoby dość niekonwencjonalne. Szczegółowe informacje znajdują się na moim szczegółowym koncie PCA + varimax: Czy po PCA następuje obrót (np. Varimax) nadal PCA? W skrócie, jeśli spojrzymy na SVD macierzy danych , to obrócenie ładunków oznacza wstawienie dla niektórych macierzy rotacji w następujący sposób: R R ⊤ R X = ( U R ) ( R ⊤ S V ⊤ ) .X=USV⊤RR⊤RX=(UR)(R⊤SV⊤).
Jeśli obrót zostanie zastosowany do obciążeń (jak to zwykle bywa), istnieją co najmniej trzy proste sposoby obliczania komputerów z rotacją varimax w R:
Są one łatwo dostępne za pośrednictwem funkcji psych::principal
(co pokazuje, że jest to rzeczywiście standardowe podejście). Pamiętaj, że zwraca standardowe wyniki , tzn. Wszystkie komputery mają wariancję jednostkową.
Można ręcznie użyć varimax
funkcji do obracania obciążeń, a następnie użyć nowych obróconych obciążeń, aby uzyskać wyniki; należy pomnożyć dane z transponowanym pseudo-odwrotnością obróconych ładunków (patrz wzory w tej odpowiedzi przez @ttnphns ). To da również znormalizowane wyniki.
Można użyć varimax
funkcji, aby obrócić ładunki, a następnie użyć $rotmat
macierzy obrotu, aby obrócić znormalizowane wyniki uzyskane za pomocą prcomp
.
Wszystkie trzy metody dają ten sam wynik:
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
Daje to trzy identyczne wyniki:
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
Uwaga:varimax
funkcja w R wykorzystuje normalize = TRUE, eps = 1e-5
parametry domyślnie ( patrz dokumentacja ). Można chcieć zmienić te parametry (zmniejszyć eps
tolerancję i zadbać o normalizację Kaiser) podczas porównywania wyników z innym oprogramowaniem, takim jak SPSS. Dziękuję @GottfriedHelms za zwrócenie mojej uwagi na to. [Uwaga: te parametry działają po przekazaniu do varimax
funkcji, ale nie działają po przekazaniu do psych::principal
funkcji. Wygląda to na błąd, który zostanie naprawiony.]
principal
,prcomp
aprincomp
, ale wynikające z obciążeń / wnioski badań są bardzo różne od siebie. Z tego, co rozumiem, prcomp i princomp nie zwracają znormalizowanych wyników ani ładowań. Moje pytanie brzmi: jakie jest najlepsze podejście? Czy naprawdę chcę znormalizować wyniki? Jest mój kod niepca_iris <- prcomp(irisX, center=T, scale=T)
następujevarimax(pca_iris$rotation)$loadings
prawidłowe jak ty jak powyżej?principal
procedurze, który zawsze oblicza się z normalizacją Kaisera i eps = 1e-5. Jak dotąd nie ma informacji, dlaczego na r-fiddle.org wersja działa poprawnie. Powinniśmy więc czekać na aktualizacje - i powinienem usunąć wszystkie przestarzałe komentarze. ameba - dobrze byłoby odpowiednio zaktualizować uwagę w odpowiedzi. Dziękuję za całą współpracę!Musisz użyć matrycy
$loadings
, a nie$rotmat
:Macierz
$rotmat
jest macierzą ortogonalną, która wytwarza nowe ładunki z nieobrotowych.EDYTUJ od 12 lutego 2015 r .:
Jak słusznie wskazał poniżej @amoeba (patrz również jego / jej poprzedni post oraz inny post z @ttnphns ), ta odpowiedź jest nieprawidłowa. Rozważmy macierzy danych . Rozkład wartości w liczbie pojedynczej to gdzie ma za kolumny (znormalizowane) wektory własne . Teraz obrót jest zmianą współrzędnych i sprowadza się do zapisania powyższej równości jako: przy czym jest macierzą ortogonalną wybraną do uzyskania bliski rzadkości (maksymalny kontrast między wpisami, luźno mówiąc). Teraz, jeśli to wszystkon×m X
Innymi słowy, zaproponowane przeze mnie rozwiązanie jest poprawne tylko w tym konkretnym przypadku, w którym byłoby bezużyteczne i bezsensowne.
Serdeczne podziękowania dla @amoeba za wyjaśnienie mi tej sprawy; Od lat żyję z tym nieporozumieniem.
Jeden punkt, w którym uwaga powyżej odbiega od użytkownika @ ameba postu jest to, że ona / on wydaje skojarzyć z w . Myślę, że w PCA bardziej powszechne jest posiadanie kolumn normy 1 i pochłanianie w wartościach głównego składnika. W rzeczywistości zwykle są one przedstawiane jako kombinacje liniowe oryginalnych (wyśrodkowanych, być może skalowanych) zmiennych podlegających . Tak czy inaczej jest do zaakceptowania, jak sądzę, i wszystko pomiędzy (jak w analizie biplot).S V L V S vTiX (i=1,…,m) ∥vi∥=1
DALSZA EDYCJA 12 lutego 2015 r
Jak zauważył @amoeba, mimo że jest prostokątny, zaproponowane mnie rozwiązanie może być nadal akceptowalne: dałoby macierz jednostkową i . Wszystko wydaje się więc zależeć od definicji wyników, które preferuje się. V ∗ k ( V ∗ k ) T X ( V ∗ k ) T ≈ U ∗ kV∗k V∗k(V∗k)T X(V∗k)T≈U∗k
źródło
psych::principal
. [Poza tym zredagowałem twoją odpowiedź, aby wstawić skalowanie, jak omówiono w komentarzach powyżej.]Szukałem rozwiązania, które działa na PCA wykonywane przy użyciu ade4 .
Poniżej znajdziesz funkcję:
Utworzono 14.01.2020 przez pakiet reprezentx (v0.3.0)
Mam nadzieję, że to pomoże!
źródło