Boş bir model karşılaştırması kullanarak sorunuza daha görsel bir cevap ekleyeceğim. Prosedür, değişkenler (kolonlar) arasındaki kovaryans kaybolurken genel varyansı korumak için her sütundaki verileri rastgele karıştırır. Bu birkaç kez yapılır ve rastgele değer matrisinde tekil değerlerin sonuçta ortaya çıkan dağılımı orijinal değerlerle karşılaştırılır.
Matris ayrışımı prcomp
yerine kullanıyorum svd
, ancak sonuçlar benzer:
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 model karşılaştırması aşağıdaki ortalanmış matriste yapılır:
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)
Aşağıda, düz çizgi olarak gösterilen her bir tekil değerin% 95'i ile nüfuz eden matrisin bir kutu grafiği verilmiştir. PCA'nın orijinal değerleri m
noktalardır. hepsi% 95 çizginin altındadır - Böylece genlikleri rastgele gürültüden ayırt edilemez.
Aynı prosedür m
aynı sonucun ortalanmamış versiyonunda yapılabilir - Önemli tekil değerler yok:
# 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)
Karşılaştırma için, rastgele olmayan bir veri kümesine sahip bir veri kümesine bakalım: 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)
Burada, 1. tekil değer önemlidir ve toplam varyansın% 92'sinden fazlasını açıklar:
P <- prcomp(m, center = TRUE)
P$sdev^2 / sum(P$sdev^2)
# [1] 0.924618723 0.053066483 0.017102610 0.005212184