如何进行多重相关?

时间:2019-02-10 13:37:36

标签: r

我的数据由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)

2 个答案:

答案 0 :(得分: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])
  }
}

这是蛮力的。如果您不需要此功能,则不需要它,但是它使更改度量标准变得容易。同样,也可以从j开始i+1,而不用重复第二循环中的每一列,以免重复计算。但是,这应该可以得到结果,并且您可以在找出循环时从那里进行调整。

在这里,它也像您正在使用的那样具有apply函数。如果要将结果重新构建到矩阵中,则需要将i=j循环中向量for的位置插入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

答案 1 :(得分:0)

我们可以使用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))