Điều này thể hiện qua gợi ý sâu sắc được cung cấp trong một nhận xét của @ttnphns.
Các biến gần kề tương quan làm tăng sự đóng góp của yếu tố cơ bản chung của chúng vào PCA. Chúng ta có thể thấy điều này về mặt hình học. Hãy xem xét các dữ liệu này trong mặt phẳng XY, được hiển thị dưới dạng đám mây điểm:
Có rất ít mối tương quan, hiệp phương sai xấp xỉ bằng nhau và dữ liệu được căn giữa: PCA (dù được tiến hành như thế nào) sẽ báo cáo hai thành phần xấp xỉ bằng nhau.
Bây giờ chúng ta hãy ném vào một biến thứ ba bằng cộng với một lỗi nhỏ ngẫu nhiên. Ma trận tương quan của cho thấy điều này với các hệ số đường chéo nhỏ ngoại trừ giữa hàng thứ hai và thứ ba và cột ( và ):ZY(X,Y,Z)YZ
⎛⎝⎜1.−0.0344018−0.046076−0.03440181.0.941829−0.0460760.9418291.⎞⎠⎟
Về mặt hình học, chúng tôi đã thay thế tất cả các điểm ban đầu gần như theo chiều dọc, nâng hình ảnh trước đó ra khỏi mặt phẳng của trang. Đám mây điểm 3D giả này cố gắng minh họa việc nâng lên với chế độ xem phối cảnh bên (dựa trên một tập dữ liệu khác, mặc dù được tạo theo cùng một cách như trước):
Các điểm ban đầu nằm trong mặt phẳng màu xanh và được nâng lên các chấm đỏ. Trục ban đầu chỉ về bên phải. Độ nghiêng kết quả cũng kéo dài các điểm ra dọc theo các hướng của YZ, do đó nhân đôi đóng góp của chúng cho phương sai. Do đó, PCA của những dữ liệu mới này vẫn sẽ xác định hai thành phần chính, nhưng bây giờ một trong số chúng sẽ có gấp đôi phương sai của dữ liệu kia.Y
Kỳ vọng hình học này được sinh ra với một số mô phỏng trong R
. Để làm điều này, tôi đã lặp lại quy trình "nâng" bằng cách tạo các bản sao gần đúng của biến thứ hai lần thứ hai, thứ ba, thứ tư và thứ năm, đặt tên chúng là đến . Dưới đây là một ma trận phân tán cho thấy bốn biến cuối đó có mối tương quan tốt như thế nào:X2X5
PCA được thực hiện bằng cách sử dụng các tương quan (mặc dù nó không thực sự quan trọng đối với các dữ liệu này), sử dụng hai biến đầu tiên, sau đó là ba, ... và cuối cùng là năm. Tôi hiển thị kết quả bằng cách sử dụng các biểu đồ đóng góp của các thành phần chính cho tổng phương sai.
Ban đầu, với hai biến gần như không tương quan, các đóng góp gần như bằng nhau (góc trên bên trái). Sau khi thêm một biến tương quan với biến thứ hai - chính xác như trong hình minh họa hình học - vẫn chỉ có hai thành phần chính, một biến có kích thước gấp đôi biến kia. (Thành phần thứ ba phản ánh sự thiếu tương quan hoàn hảo; nó đo "độ dày" của đám mây giống như bánh kếp trong phân tán 3D.) Sau khi thêm một biến tương quan khác ( ), thành phần đầu tiên hiện chiếm khoảng 3/4 tổng số ; sau khi một phần năm được thêm vào, thành phần đầu tiên là gần bốn phần năm của tổng số. Trong tất cả bốn trường hợp, các thành phần sau lần thứ hai có thể được coi là không quan trọng bởi hầu hết các thủ tục chẩn đoán PCA; trong trường hợp cuối cùng nó 'X4một thành phần chính đáng xem xét.
Bây giờ chúng ta có thể thấy rằng có thể có công trong việc loại bỏ các biến được cho là đo lường cùng một khía cạnh cơ bản (nhưng "tiềm ẩn") của một tập hợp các biến , bởi vì bao gồm các biến gần như dư thừa có thể khiến PCA quá coi trọng sự đóng góp của chúng. Không có gì đúng về mặt toán học (hoặc sai) về một thủ tục như vậy; đó là một cuộc gọi phán xét dựa trên các mục tiêu phân tích và kiến thức về dữ liệu. Nhưng cần phải rõ ràng rằng việc đặt các biến được biết là có tương quan mạnh với các biến khác có thể có ảnh hưởng đáng kể đến kết quả PCA.
Đây là R
mã.
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)