Ini menguraikan petunjuk mendalam yang disediakan dalam komentar oleh @ttnphns.
Mendekatkan variabel yang hampir berkorelasi meningkatkan kontribusi faktor yang mendasari umum mereka untuk PCA. Kita bisa melihatnya secara geometris. Pertimbangkan data ini di bidang XY, ditampilkan sebagai awan titik:
Ada sedikit korelasi, kira-kira sama kovarians, dan data terpusat: PCA (tidak peduli bagaimana dilakukan) akan melaporkan dua komponen yang kira-kira sama.
Sekarang mari kita melempar variabel ketiga sama dengan ditambah sejumlah kecil kesalahan acak. Matriks korelasi menunjukkan ini dengan koefisien off-diagonal kecil kecuali antara baris dan kolom kedua dan ketiga ( dan ):Y ( X , Y , Z ) Y ZZY( X, Y, Z)YZ
⎛⎝⎜1.- 0,0344018- 0,046076- 0,03440181.0.941829- 0,0460760.9418291.⎞⎠⎟
Secara geometris, kami telah memindahkan semua titik asli hampir secara vertikal, mengangkat gambar sebelumnya langsung dari bidang halaman. Cloud titik pseudo 3D ini berupaya mengilustrasikan pengangkatan dengan tampilan perspektif samping (berdasarkan kumpulan data yang berbeda, meskipun dihasilkan dengan cara yang sama seperti sebelumnya):
Titik awalnya terletak di bidang biru dan diangkat ke titik merah. Sumbu asli menunjuk ke kanan. Kemiringan yang dihasilkan juga merentangkan poin di sepanjang arah YZ, sehingga menggandakan kontribusinya pada varian. Akibatnya, PCA dari data baru ini masih akan mengidentifikasi dua komponen utama utama, tetapi sekarang salah satu dari mereka akan memiliki dua kali varian yang lain.Y
Ekspektasi geometris ini didukung oleh beberapa simulasi di R
. Untuk ini saya ulangi prosedur "mengangkat" dengan membuat salinan hampir-collinear dari variabel kedua waktu kedua, ketiga, keempat, dan kelima, menamai mereka hingga . Berikut adalah matriks sebar yang menunjukkan bagaimana keempat variabel terakhir berkorelasi dengan baik:X 5X2X5
PCA dilakukan dengan menggunakan korelasi (meskipun tidak terlalu penting untuk data ini), menggunakan dua variabel pertama, lalu tiga, ..., dan akhirnya lima. Saya menunjukkan hasilnya menggunakan plot kontribusi komponen utama terhadap total varians.
Awalnya, dengan dua variabel yang hampir tidak berkorelasi, kontribusi hampir sama (sudut kiri atas). Setelah menambahkan satu variabel yang berkorelasi dengan yang kedua - persis seperti pada ilustrasi geometris - masih ada hanya dua komponen utama, satu sekarang dua kali ukuran yang lain. (Komponen ketiga mencerminkan kurangnya korelasi sempurna; ini mengukur "ketebalan" awan seperti pancake di 3D scatterplot.) Setelah menambahkan variabel berkorelasi lain ( ), komponen pertama sekarang sekitar tiga perempat dari total ; setelah ditambahkan seperlima, komponen pertama hampir empat perlima dari total. Dalam keempat kasus komponen setelah yang kedua kemungkinan akan dianggap tidak penting oleh sebagian besar prosedur diagnostik PCA; dalam kasus terakhir itu 'X4satu komponen utama yang patut dipertimbangkan.
Kita dapat melihat sekarang bahwa mungkin ada manfaat dalam membuang variabel yang dianggap mengukur aspek yang mendasari (tapi "laten") yang sama dari kumpulan variabel , karena termasuk variabel yang hampir berlebihan dapat menyebabkan PCA terlalu menekankan kontribusi mereka. Secara matematis tidak ada yang benar (atau salah) tentang prosedur semacam itu; itu panggilan penilaian berdasarkan pada tujuan analitis dan pengetahuan data. Tetapi harus sangat jelas bahwa mengesampingkan variabel yang diketahui sangat berkorelasi dengan orang lain dapat memiliki efek besar pada hasil PCA.
Ini R
kodenya.
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)