Dies erklärt sich aus dem aufschlussreichen Hinweis in einem Kommentar von @ttnphns.
Das Aneinanderfügen von nahezu korrelierten Variablen erhöht den Beitrag ihres gemeinsamen zugrunde liegenden Faktors zur PCA. Wir können dies geometrisch sehen. Betrachten Sie diese Daten in der XY-Ebene als Punktwolke:
Es gibt eine geringe Korrelation, ungefähr die gleiche Kovarianz, und die Daten sind zentriert: PCA (egal wie durchgeführt) würde zwei ungefähr gleiche Komponenten melden.
Lassen Sie uns nun eine dritte Variable einwerfen, die gleich und einer kleinen Menge zufälliger Fehler ist. Die Korrelationsmatrix von zeigt dies mit den kleinen Off-Diagonal-Koeffizienten außer zwischen der zweiten und dritten Zeile und Spalte ( und ):ZY.( X, Y, Z)Y.Z
⎛⎝⎜1.−0.0344018−0.046076−0.03440181.0.941829−0.0460760.9418291.⎞⎠⎟
Geometrisch haben wir alle ursprünglichen Punkte nahezu vertikal verschoben und das vorherige Bild direkt aus der Ebene der Seite gehoben. Diese Pseudo-3D-Punktwolke versucht, das Heben mit einer seitlichen perspektivischen Ansicht zu veranschaulichen (basierend auf einem anderen Datensatz, der jedoch auf die gleiche Weise wie zuvor generiert wurde):
Die Punkte liegen ursprünglich in der blauen Ebene und werden zu den roten Punkten angehoben. Die ursprüngliche Achse zeigt nach rechts. Die resultierende Neigung dehnt auch die Punkte entlang der YZ-Richtungen aus und verdoppelt dadurch ihren Beitrag zur Varianz. Folglich würde eine PCA dieser neuen Daten immer noch zwei Hauptkomponenten identifizieren, aber jetzt wird eine von ihnen die doppelte Varianz der anderen aufweisen.Y
Diese geometrische Erwartung wird in einigen Simulationen bestätigt R
. Zu diesem Zweck wiederholte ich die Prozedur "Heben", indem ich ein zweites, drittes, viertes und fünftes Mal nahezu kollineare Kopien der zweiten Variablen erstellte und sie bis . Hier ist eine Streudiagramm-Matrix, die zeigt, wie gut diese letzten vier Variablen korreliert sind:X2X5
Die PCA wird mithilfe von Korrelationen erstellt (obwohl dies für diese Daten eigentlich keine Rolle spielt), wobei die ersten beiden Variablen, dann drei, ... und schließlich fünf verwendet werden. Ich zeige die Ergebnisse anhand von Diagrammen der Beiträge der Hauptkomponenten zur Gesamtvarianz.
Bei zwei fast unkorrelierten Variablen sind die Beiträge anfangs fast gleich (linke obere Ecke). Nach dem Hinzufügen einer mit der zweiten korrelierten Variablen - genau wie in der geometrischen Darstellung - gibt es nur noch zwei Hauptkomponenten, eine jetzt doppelt so groß wie die andere. (Eine dritte Komponente spiegelt das Fehlen einer perfekten Korrelation wider; sie misst die "Dicke" der pfannkuchenartigen Wolke im 3D-Streudiagramm.) Nach dem Hinzufügen einer weiteren korrelierten Variablen ( ) macht die erste Komponente nun etwa drei Viertel der Gesamtmenge aus ; Nachdem ein Fünftel hinzugefügt wurde, macht die erste Komponente fast vier Fünftel der Gesamtmenge aus. In allen vier Fällen werden Komponenten nach der zweiten wahrscheinlich von den meisten PCA-Diagnoseverfahren als unwichtig angesehen. im letzten Fall 'X4Eine wichtige Komponente, die es zu berücksichtigen gilt.
Wir können jetzt sehen, dass es möglicherweise sinnvoll ist, Variablen zu verwerfen, die den gleichen zugrunde liegenden (aber "latenten") Aspekt einer Variablensammlung messen , da die Einbeziehung der nahezu redundanten Variablen dazu führen kann, dass die PCA ihren Beitrag überbetont. Es gibt nichts mathematisch Richtiges (oder Falsches) an einem solchen Verfahren; Es ist ein Urteilsspruch, der auf den analytischen Zielen und der Kenntnis der Daten basiert. Es sollte jedoch klar sein, dass die Stillegung von Variablen, von denen bekannt ist, dass sie stark mit anderen korrelieren, einen erheblichen Einfluss auf die PCA-Ergebnisse haben kann.
Hier ist der R
Code.
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)