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
ヌルモデルの比較は、以下の中央のマトリックスで実行されます。
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%の分位数が実線で示されています。の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