null 모델 비교를 사용하여 질문에 시각적 인 답변을 추가하겠습니다. 이 절차는 변수 (열) 간의 공분산이 손실되는 동안 전체 분산을 유지하기 위해 각 열의 데이터를 무작위로 섞습니다. 이것은 여러 번 수행되고 무작위 행렬의 특이 값 분포는 원래 값과 비교됩니다.
매트릭스 분해 prcomp
대신 사용 svd
하지만 결과는 비슷합니다.
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
null 모델 비교는 아래의 중심 행렬에서 수행됩니다.
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)
다음은 각 특이 값의 95 % Quantile이 실선으로 표시된 순열 행렬의 상자 그림입니다. PCA의 원래 값은 m
점입니다. 모두 95 % 라인 아래에 위치하므로 진폭은 랜덤 노이즈와 구분할 수 없습니다.
m
동일한 결과 를 가진 중심없는 버전에서 동일한 절차를 수행 할 수 있습니다. 중요한 특이 값은 없습니다.
# 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)
비교를 위해 무작위가 아닌 데이터 세트가있는 데이터 세트를 살펴 보겠습니다. 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)
여기에서 첫 번째 특이 값은 중요하며 총 분산의 92 % 이상을 설명합니다.
P <- prcomp(m, center = TRUE)
P$sdev^2 / sum(P$sdev^2)
# [1] 0.924618723 0.053066483 0.017102610 0.005212184