簡體   English   中英

如何進行多重相關?

[英]How can I make a multiple correlation?

我的數據由59個變量(列)和500個觀察值(每個參與者)組成。 我必須使一個項目(列)與其余項目(所有其他列)相關。

我在其他專欄的第一欄進行了介紹,但我想在for循環中重復該操作。

我試過了 :

sapply(mydata[-1],function(y)cor.test(mydata$First_Item,y)$p.value)

但是,如果我要在第一列的第二列和其他3:59處執行此操作,則它將不起作用。

我想要這樣的事情:

for (i in 1:59){
    sapply(mydata[,i],function(y)cor.test(mydata[,i],y)$p.value)
}

非常感謝!

編輯:

B1_TP_CO_9999_01 = c(1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1) 
B1_TP_CO_9999_02 = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
B1_TP_CO_9999_03 = c(2, 0, 0, 2, 2, 2, 2, 2, 0, 1, 0, 2, 2, 2, 0) 
B1_TP_CO_9999_04 = c(0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0) 
B1_TP_CO_9999_05 = c(0, 2, 2, 2, 0, 0, 2, 2, 0, 0.5, 0, 0, 2, 1, 0)

?cor函數將很好且快速地創建相關矩陣。 但是,如果您想要一個自定義函數(例如,使p值變得容易),請嘗試執行雙循環。 不是最快的,但是很簡單。

mydata <- matrix(runif(200),20,10)
p <- ncol(mydata)

cor_pval <- function(x, y) cor.test(x, y)$p.value
m <- matrix(0, p, p)

for (i in 1:ncol(mydata)) {
  for (j in 1:ncol(mydata)) {
    m[i,j] = cor_pval(mydata[,i], mydata[,j])
  }
}

這是蠻力的。 如果您不需要此功能,則不需要它,但是它使更改度量標准變得容易。 另外,也可以不從第二個循環中的每一列開始,而可以從i+1開始j ,以便不重復計算。 但是,這應該可以得到結果,並且可以在找出循環時從那里進行調整。

同樣在這里,它與您正在使用的apply函數相同。 如果要將結果重新構建到矩陣中,則需要將for循環中向量i=j的位置插入0。

m2 <- matrix(0, p, p)
for (i in 1:p) {
 m2[i, ] = append(apply(mydata[,-i], 2, cor_pval, y = mydata[,i]), 0, after = i - 1)
}

all.equal(m, m2)
[1] TRUE

我們可以使用expand.grid()避免嵌套循環。

n <- ncol(mydata)
ex <- t(expand.grid(1:n, 1:n))                         # transpose with `t()`

myCor <- function(x) cor.test(x[, 1], x[, 2])$p.value  # test fun

現在,我們運行一個sapply()並將結果打包到具有正確暗號的矩陣中。

MX <- matrix(sapply(seq(ncol(ex)), function(i) myCor(mydata[ex[, i]])), 
             ncol=n, dimnames=rep(list(names(mydata)), 2))

產量:

MX <- round(MX, 3)
> MX
                 B1_TP_CO_9999_01 B1_TP_CO_9999_02 B1_TP_CO_9999_03 B1_TP_CO_9999_04 B1_TP_CO_9999_05
B1_TP_CO_9999_01            0.000               NA            0.043            1.000            0.757
B1_TP_CO_9999_02               NA               NA               NA               NA               NA
B1_TP_CO_9999_03            0.043               NA            0.000            0.857            0.703
B1_TP_CO_9999_04            1.000               NA            0.857            0.000            0.164
B1_TP_CO_9999_05            0.757               NA            0.703            0.164            0.000

測試顯示,此方法有效:

> cor.test(mydata[, 1], mydata[, 3])$p.value
[1] 0.04325627
> cor.test(mydata[, 4], mydata[, 3])$p.value
[1] 0.8574056
> cor.test(mydata[, 4], mydata[, 5])$p.value
[1] 0.164388

如果我們想擺脫上面的三角形,我們最終可以做

MX[upper.tri(MX, diag=TRUE)] <- ""

導致:

> as.data.frame(MX)[-n]
                 B1_TP_CO_9999_01 B1_TP_CO_9999_02 B1_TP_CO_9999_03 B1_TP_CO_9999_04
B1_TP_CO_9999_01                                                                    
B1_TP_CO_9999_02             <NA>                                                   
B1_TP_CO_9999_03            0.043             <NA>                                  
B1_TP_CO_9999_04                1             <NA>            0.857                 
B1_TP_CO_9999_05            0.757             <NA>            0.703            0.164

注意:警告來自您的數據,您也可以使用mydata <- iris[-5]測試代碼。

數據

mydata <- structure(list(B1_TP_CO_9999_01 = c(1, 0, 0, 0, 0, 1, 1, 1, 0, 
1, 0, 1, 1, 1, 1), B1_TP_CO_9999_02 = c(1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1), B1_TP_CO_9999_03 = c(2, 0, 0, 2, 2, 
2, 2, 2, 0, 1, 0, 2, 2, 2, 0), B1_TP_CO_9999_04 = c(0, 1, 1, 
0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0), B1_TP_CO_9999_05 = c(0, 
2, 2, 2, 0, 0, 2, 2, 0, 0.5, 0, 0, 2, 1, 0)), class = "data.frame", row.names = c(NA, 
-15L))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM