Questo spiega il suggerimento perspicace fornito in un commento di @ttnphns.
L'unione di variabili quasi correlate aumenta il contributo del loro comune fattore sottostante al PCA. Possiamo vederlo geometricamente. Considera questi dati nel piano XY, mostrato come una nuvola di punti:
C'è poca correlazione, covarianza approssimativamente uguale e i dati sono centrati: PCA (non importa quanto condotto) segnalerebbe due componenti approssimativamente uguali.
Passiamo ora a una terza variabile uguale a più una piccola quantità di errore casuale. La matrice di correlazione di mostra questo con i coefficienti off-diagonali piccoli tranne tra la seconda e la terza riga e colonne ( e ):ZY(X,Y,Z)YZ
⎛⎝⎜1.−0.0344018−0.046076−0.03440181.0.941829−0.0460760.9418291.⎞⎠⎟
Dal punto di vista geometrico, abbiamo spostato tutti i punti originali quasi verticalmente, sollevando l'immagine precedente dal piano della pagina. Questa pseudo nuvola di punti 3D tenta di illustrare il sollevamento con una vista prospettica laterale (basata su un set di dati diverso, sebbene generato allo stesso modo di prima):
I punti originariamente si trovano sul piano blu e sono sollevati ai punti rossi. L' asse originale punta a destra. L'inclinazione risultante allunga anche i punti lungo le direzioni YZ, raddoppiando così il loro contributo alla varianza. Di conseguenza, un PCA di questi nuovi dati identificherebbe ancora due principali componenti principali, ma ora uno di essi avrà il doppio della varianza dell'altro.Y
Questa aspettativa geometrica è confermata da alcune simulazioni R
. Per questo ho ripetuto la procedura di "sollevamento" creando copie quasi collineari della seconda variabile una seconda, terza, quarta e quinta volta, nominandole da a . Ecco una matrice scatterplot che mostra come queste ultime quattro variabili siano ben correlate:X2X5
Il PCA viene eseguito utilizzando le correlazioni (anche se non ha importanza per questi dati), utilizzando le prime due variabili, quindi tre, ... e infine cinque. Mostro i risultati usando i grafici dei contributi dei componenti principali alla varianza totale.
Inizialmente, con due variabili quasi non correlate, i contributi sono quasi uguali (angolo in alto a sinistra). Dopo aver aggiunto una variabile correlata alla seconda, esattamente come nell'illustrazione geometrica, ci sono ancora solo due componenti principali, uno ora il doppio dell'altra. (Un terzo componente riflette la mancanza di una correlazione perfetta; misura lo "spessore" della nuvola simile a un pancake nel grafico a dispersione 3D.) Dopo aver aggiunto un'altra variabile correlata ( ), il primo componente è ora circa i tre quarti del totale ; dopo l'aggiunta di un quinto, il primo componente è quasi i quattro quinti del totale. In tutti e quattro i casi i componenti dopo il secondo verrebbero probabilmente considerati irrilevanti dalla maggior parte delle procedure diagnostiche PCA; nell'ultimo caso è 'X4un componente principale che vale la pena considerare.
Ora possiamo vedere che potrebbe esserci il merito di scartare le variabili che si ritiene stiano misurando lo stesso aspetto sottostante (ma "latente") di una raccolta di variabili , perché l'inclusione delle variabili quasi ridondanti può far sì che il PCA enfatizzi eccessivamente il loro contributo. Non c'è nulla di matematicamente giusto (o sbagliato) in una tale procedura; è un giudizio basato sugli obiettivi analitici e sulla conoscenza dei dati. Ma dovrebbe essere abbondantemente chiaro che mettere da parte le variabili note per essere fortemente correlate con gli altri può avere un effetto sostanziale sui risultati della PCA.
Ecco il R
codice
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)