R 根据p值截止值匹配相关矩阵中的信息

R 根据p值截止值匹配相关矩阵中的信息,r,matrix,correlation,R,Matrix,Correlation,我使用Hmisc库的rcorr函数计算相关性和p值。然后将PVA值提取到Pval矩阵,并将相关系数提取到corr矩阵 Rvalue<-structure(c(1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1

我使用Hmisc库的rcorr函数计算相关性和p值。然后将PVA值提取到Pval矩阵,并将相关系数提取到corr矩阵

Rvalue<-structure(c(1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 
0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 
1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 
1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1), .Dim = c(10L, 
10L), .Dimnames = list(c("41699", "41700", "41701", "41702", 
"41703", "41704", "41705", "41707", "41708", "41709"), c("41699", 
"41700", "41701", "41702", "41703", "41704", "41705", "41707", 
"41708", "41709")))

> Pvalue<-structure(c(NA, 0, 0, 0, 0.0258814351024321, 0, 0, 0, 0, 0, 0, 
NA, 6.70574706873595e-14, 0, 0, 2.1673942640632e-09, 1.08217552696743e-07, 
0.0105345133269157, 0, 0, 0, 6.70574706873595e-14, NA, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, NA, 2.22044604925031e-15, 0, 0, 0, 0, 
0, 0.0258814351024321, 0, 0, 2.22044604925031e-15, NA, 0, 0, 
0, 0.000322310440723728, 0.00298460759118657, 0, 2.1673942640632e-09, 
0, 0, 0, NA, 0, 0, 0, 0, 0, 1.08217552696743e-07, 0, 0, 0, 0, 
NA, 0, 0, 0, 0, 0.0105345133269157, 0, 0, 0, 0, 0, NA, 0, 0, 
0, 0, 0, 0, 0.000322310440723728, 0, 0, 0, NA, 0, 0, 0, 0, 0, 
0.00298460759118657, 0, 0, 0, 0, NA), .Dim = c(10L, 10L), .Dimnames = list(
c("41699", "41700", "41701", "41702", "41703", "41704", "41705", 
"41707", "41708", "41709"), c("41699", "41700", "41701", 
"41702", "41703", "41704", "41705", "41707", "41708", "41709"
)))
结果是可以的,但由于矩阵非常大,它需要很多时间。我怎样才能加快这个过程请注意,我需要节点名称。有相关的功能吗? 我还发现了两个类似的问题,但并不完全是我需要的(和)。提前谢谢。

你可以试试

indx <- which(Rvalue==1 & Pvalue < 0.05 & !is.na(Pvalue), arr.ind=TRUE)
d1 <- data.frame(rN=row.names(Rvalue)[indx[,1]], 
               cN=colnames(Rvalue)[indx[,2]], Pval=signif(Pvalue[indx],
                                                                digits=4))

head(d1,2)
#     rN    cN Pval
#1 41700 41699    0
#2 41701 41699    0
数据
set.seed(24)

R1因为矩阵有大量的列和行,所以最好避免同时进行“for循环”。您可以改为使用更方便的mappy函数

mapply(FUN = NULL , ...)
使用以下功能代替娱乐:

myf= function(x){ x "les then threshold"}
您可以使用
mapply(FUN=myf,“您的矩阵”)
两次来检查两个相关矩阵和pvalue矩阵的元素是否符合阈值。 将结果存储在两个布尔矩阵P1和P2中。然后乘以P1和P2(直接乘法)

myf1=函数(x){x0.7}

p中标记为“True”的元素是所需的节点。它会很好用的

下面是您的示例的结果:

P1 = mapply(FUN = myf1 , Pvalue)
P2 = mapply(FUN = myf2 , Rvalue)
P = P1 * P2
NA1111011011NA01001010101010101010101010101010101010101010NA10 11 11 11 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 10111101101101101101101101101101010110110101001
1不适用0 0 1 1 1 0 1不适用1 1 0 1 1 0 1不适用

谢谢。太棒了。一个18000*18000的矩阵只用了10秒。想不到的你的黑客行为促使我提出一个问题:我如何升级编码并摆脱for循环?有参考资料或经验吗?我对你的代码提出了一个问题。当我更改pvalue时,截断结果没有更改?@user3079143抱歉,我不明白你的问题。这不是在为
循环删除/摆脱
吗?@user3079143如果您检查代码,尤其是
indx
,它将为您提供满足条件的
行/列
。这些条件可能满足一定范围的
pvalues
。亲爱的akrun,您的代码是删除for循环的一种很好的方法。我问了一个一般性问题。你能推荐我如何将我上面的代码升级到像你写的那样吗。我应该学习更多的函数吗?我应该参考特殊参考资料吗?我不确定这
是如何工作的。请使用OP的数据集来显示。您可以考虑以下代码:Myf1=函数(x){x<0.05 } Myf2=函数(x){x> 0.7 } Mat1p p,但是,这不是您在帖子中特别示出的,在赛扬2.1 GHZ和1 GB RAM的pc上,如果矩阵大小为100000*100000,则P1和P2只需3秒钟。它应该在毫秒内在集群上运行。是的,这是一个很好的尝试。
set.seed(24)
R1 <- matrix(sample(c(0,1), 5*5, replace=TRUE), 5,5, 
            dimnames=list(LETTERS[1:5], LETTERS[1:5]))
R1[lower.tri(R1)] <- 0
R1 <- R1+t(R1)
diag(R1) <- 1


set.seed(49)
P1 <- matrix(sample(seq(0,0.07, by=0.001), 5*5, replace=TRUE), 5, 5,
       dimnames=list(LETTERS[1:5], LETTERS[1:5]))

P1[lower.tri(P1)] <- 0
P1 <- P1+t(P1)
diag(P1) <- NA
mapply(FUN = NULL , ...)
myf= function(x){ x "les then threshold"}
P1 = mapply(FUN = myf1 , matP)

P2 = mapply(FUN = myf2 , matR)

P = P1 * P2
P1 = mapply(FUN = myf1 , Pvalue)
P2 = mapply(FUN = myf2 , Rvalue)
P = P1 * P2