ฉันจะเพิ่มคำตอบให้กับคำถามของคุณผ่านการเปรียบเทียบแบบจำลองแบบ 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% ของค่าเอกพจน์แต่ละค่าที่แสดงเป็นเส้นทึบ ค่าดั้งเดิมของ 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)
ค่าเอกพจน์ที่ 1 มีความสำคัญและอธิบายความแปรปรวนได้มากกว่า 92%:
P <- prcomp(m, center = TRUE)
P$sdev^2 / sum(P$sdev^2)
# [1] 0.924618723 0.053066483 0.017102610 0.005212184