Tôi sẽ thêm một câu trả lời trực quan hơn cho câu hỏi của bạn, thông qua việc sử dụng so sánh mô hình null. Quy trình xáo trộn ngẫu nhiên dữ liệu trong mỗi cột để bảo toàn phương sai tổng thể trong khi hiệp phương sai giữa các biến (cột) bị mất. Điều này được thực hiện nhiều lần và phân phối kết quả của các giá trị số ít trong ma trận ngẫu nhiên được so sánh với các giá trị ban đầu.
Tôi sử dụng prcomp
thay vì svd
phân tách ma trận, nhưng kết quả tương tự nhau:
set.seed(1)
m <- matrix(runif(10000,min=0,max=25), nrow=100,ncol=100)
S <- svd(scale(m, center = TRUE, scale=FALSE))
P <- prcomp(m, center = TRUE, scale=FALSE)
plot(S$d, P$sdev) # linearly related
So sánh mô hình null được thực hiện trên ma trận trung tâm bên dưới:
library(sinkr) # https://github.com/marchtaylor/sinkr
# centred data
Pnull <- prcompNull(m, center = TRUE, scale=FALSE, nperm = 100)
Pnull$n.sig
boxplot(Pnull$Lambda[,1:20], ylim=range(Pnull$Lambda[,1:20], Pnull$Lambda.orig[1:20]), outline=FALSE, col=8, border="grey50", log="y", main=paste("m (center=FALSE); n sig. =", Pnull$n.sig))
lines(apply(Pnull$Lambda, 2, FUN=quantile, probs=0.95))
points(Pnull$Lambda.orig[1:20], pch=16)
Sau đây là một boxplot của ma trận hoán vị với lượng tử 95% của mỗi giá trị số ít được hiển thị dưới dạng đường thẳng. Các giá trị ban đầu của PCA m
là các dấu chấm. tất cả đều nằm dưới đường 95% - Do đó, biên độ của chúng không thể phân biệt được với nhiễu ngẫu nhiên.
Quy trình tương tự có thể được thực hiện trên phiên bản không tập trung m
với cùng kết quả - Không có giá trị số ít đáng kể:
# centred data
Pnull <- prcompNull(m, center = FALSE, scale=FALSE, nperm = 100)
Pnull$n.sig
boxplot(Pnull$Lambda[,1:20], ylim=range(Pnull$Lambda[,1:20], Pnull$Lambda.orig[1:20]), outline=FALSE, col=8, border="grey50", log="y", main=paste("m (center=TRUE); n sig. =", Pnull$n.sig))
lines(apply(Pnull$Lambda, 2, FUN=quantile, probs=0.95))
points(Pnull$Lambda.orig[1:20], pch=16)
Để so sánh, chúng ta hãy xem một tập dữ liệu với một tập dữ liệu không ngẫu nhiên: iris
# iris dataset example
m <- iris[,1:4]
Pnull <- prcompNull(m, center = TRUE, scale=FALSE, nperm = 100)
Pnull$n.sig
boxplot(Pnull$Lambda, ylim=range(Pnull$Lambda, Pnull$Lambda.orig), outline=FALSE, col=8, border="grey50", log="y", main=paste("m (center=FALSE); n sig. =", Pnull$n.sig))
lines(apply(Pnull$Lambda, 2, FUN=quantile, probs=0.95))
points(Pnull$Lambda.orig[1:20], pch=16)
Ở đây, giá trị số 1 là rất đáng kể và giải thích hơn 92% tổng phương sai:
P <- prcomp(m, center = TRUE)
P$sdev^2 / sum(P$sdev^2)
# [1] 0.924618723 0.053066483 0.017102610 0.005212184