Wyjaśnia to wnikliwą wskazówkę zawartą w komentarzu @ttnphns.
Przyłączenie prawie skorelowanych zmiennych zwiększa udział ich wspólnego podstawowego czynnika w PCA. Widzimy to geometrycznie. Rozważ te dane w płaszczyźnie XY, pokazane jako chmura punktów:
Istnieje niewielka korelacja, w przybliżeniu jednakowa kowariancja, a dane są wyśrodkowane: PCA (bez względu na sposób przeprowadzania) zgłosi dwa w przybliżeniu równe składniki.
Dodajmy teraz trzecią zmienną równą plus niewielki błąd losowy. Macierz korelacji z pokazuje to przy małych współczynnikach off-diagonalnych, z wyjątkiem między drugim a trzecim rzędem i kolumną ( i ):Y ( X , Y , Z ) Y ZZY(X,Y,Z)YZ
⎛⎝⎜1.−0.0344018−0.046076−0.03440181.0.941829−0.0460760.9418291.⎞⎠⎟
Geometrycznie przesunęliśmy wszystkie oryginalne punkty prawie pionowo, podnosząc poprzednie zdjęcie z płaszczyzny strony. Ta pseudo-chmura 3D próbuje zilustrować podnoszenie za pomocą bocznego widoku perspektywicznego (na podstawie innego zestawu danych, aczkolwiek wygenerowanego w taki sam sposób jak poprzednio):
Punkty początkowo leżą na niebieskiej płaszczyźnie i są podnoszone do czerwonych kropek. Oryginalna oś wskazuje w prawo. Wynikowe przechylenie rozciąga również punkty wzdłuż kierunków YZ, podwajając w ten sposób ich udział w wariancji. W związku z tym PCA tych nowych danych nadal identyfikowałby dwa główne główne elementy, ale teraz jeden z nich będzie miał podwójną wariancję w stosunku do drugiego.Y
To geometryczne oczekiwanie potwierdza niektóre symulacje R
. W tym celu powtórzyłem procedurę „podnoszenia”, tworząc kopie drugiej zmiennej prawie drugi, trzeci, czwarty i piąty, nazywając je od do . Oto macierz wykresu rozrzutu pokazująca, jak te ostatnie cztery zmienne są dobrze skorelowane:X 5X2X5
PCA odbywa się za pomocą korelacji (chociaż tak naprawdę nie ma to znaczenia dla tych danych), przy użyciu dwóch pierwszych zmiennych, a następnie trzech, ... i wreszcie pięciu. Pokazuję wyniki za pomocą wykresów udziału głównych składników w całkowitej wariancji.
Początkowo, przy dwóch prawie nieskorelowanych zmiennych, wkłady są prawie równe (lewy górny róg). Po dodaniu jednej zmiennej skorelowanej z drugą - dokładnie tak jak na ilustracji geometrycznej - nadal istnieją tylko dwa główne komponenty, jeden teraz dwa razy większy od drugiego. (Trzeci komponent odzwierciedla brak idealnej korelacji; mierzy „grubość” chmury podobnej do naleśnika w wykresie rozrzutu 3D.) Po dodaniu innej skorelowanej zmiennej ( ), pierwszy komponent stanowi teraz około trzech czwartych całości ; po dodaniu piątej pierwszy składnik stanowi prawie cztery piąte całości. We wszystkich czterech przypadkach składniki po drugim byłyby prawdopodobnie uznane za nieistotne przez większość procedur diagnostycznych PCA; w ostatnim przypadku to „X4jeden główny element warty rozważenia.
Widzimy teraz, że warto odrzucić zmienne uważane za pomiar tego samego podstawowego (ale „ukrytego”) aspektu zbioru zmiennych , ponieważ uwzględnienie prawie nadmiarowych zmiennych może spowodować, że PCA nadmiernie zaakcentuje swój wkład. W takiej procedurze nie ma nic matematycznie poprawnego (lub złego); jest to wezwanie do oceny oparte na celach analitycznych i znajomości danych. Ale powinno być całkowicie jasne, że odłożenie zmiennych, o których wiadomo, że są silnie skorelowane z innymi, może mieć znaczący wpływ na wyniki PCA.
Oto R
kod.
n.cases <- 240 # Number of points.
n.vars <- 4 # Number of mutually correlated variables.
set.seed(26) # Make these results reproducible.
eps <- rnorm(n.vars, 0, 1/4) # Make "1/4" smaller to *increase* the correlations.
x <- matrix(rnorm(n.cases * (n.vars+2)), nrow=n.cases)
beta <- rbind(c(1,rep(0, n.vars)), c(0,rep(1, n.vars)), cbind(rep(0,n.vars), diag(eps)))
y <- x%*%beta # The variables.
cor(y) # Verify their correlations are as intended.
plot(data.frame(y)) # Show the scatterplot matrix.
# Perform PCA on the first 2, 3, 4, ..., n.vars+1 variables.
p <- lapply(2:dim(beta)[2], function(k) prcomp(y[, 1:k], scale=TRUE))
# Print summaries and display plots.
tmp <- lapply(p, summary)
par(mfrow=c(2,2))
tmp <- lapply(p, plot)