我怎样才能让多个相关?

问题描述 投票:0回答:2

我的数据是由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)
r
2个回答
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以便不重复计算。但是,这应该让你的结果,你可以从那里调为你找出循环。

另外这里它与应用功能,你在干什么。如果你要建立的结果早在矩阵,您需要在0到时隙从i=j环矢量for的位置。

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

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()和结果包装与右dimnames的矩阵。

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))
© www.soinside.com 2019 - 2024. All rights reserved.