计算R中的大量关联

计算R中的大量关联,r,parallel-processing,apply,correlation,R,Parallel Processing,Apply,Correlation,我有两个大矩阵(通常尺寸为5000*40和20000*40)。我试图创建一个相关矩阵,我想计算第一个矩阵中每一行到第二个矩阵中每一行的相关性。我有以下最少的代码,因为它需要非常长的时间。任何加速或并行化的建议。谢谢 -杰森 nprots <- 50 #usually ca. 5000 ngenes <- 1000 #usually ca. 20000 a_mat <- matrix( runif(40*nprots, 120, 116000), ncol=40) b_mat

我有两个大矩阵(通常尺寸为5000*40和20000*40)。我试图创建一个相关矩阵,我想计算第一个矩阵中每一行到第二个矩阵中每一行的相关性。我有以下最少的代码,因为它需要非常长的时间。任何加速或并行化的建议。谢谢

-杰森

nprots <- 50 #usually ca. 5000
ngenes <- 1000 #usually ca. 20000

a_mat <- matrix( runif(40*nprots, 120, 116000), ncol=40)
b_mat <- matrix( runif(40*ngenes, 0.1, 1000), ncol=40)
system.time(apply( a_mat, 1, function(xx) 
apply(b_mat, 1, cor, y = xx, use = "pairwise.complete.obs")) -> cor_mat)

nprots谢谢Richard,我确实看到了你在上面提到的帖子,但是没有过多考虑就把它传了过去,因为它似乎与我的问题无关。我有两个矩阵,我在其中执行关联。再多想一想,我朦胧的头脑中突然想到,我可以简单地扩展你指出的解决方案,以适合我的问题。r找出这两个矩阵,然后按照您提到的解决方案进行操作。最后提取出相关矩阵的相关角点。这比我使用apply和cor的原始代码运行得更快。我仔细检查了答案,看起来一切正常。下面是我目前的解决方案

fast_cor <- function(a,b) {
  mat  <- rbind(a, b);
  mat  <- mat - rowMeans(mat);
  mat  <- mat / sqrt(rowSums(mat^2));
  cr   <- tcrossprod(mat)
  edge <- dim(a_mat)[1]
  cr   <- t(cr[1:edge, -c(1:edge)])
  return(cr)
}

nprots <- 50 #usually ca. 5000
ngenes <- 10000 #usually ca. 20000

a_mat <- matrix( runif(40*nprots, 120, 116000), ncol=40)
b_mat <- matrix( runif(40*ngenes, 0.1, 1000), ncol=40)
system.time(apply( a_mat, 1, function(xx) 
 apply(b_mat, 1, cor, y = xx, use = "pairwise.complete.obs")) -> c_1)
user  system elapsed 
20.48    0.00   20.48 
system.time(c_2 <- fast_cor(a_mat, b_mat))
user  system elapsed 
1.97    0.11    2.08 

fast\u cor可能重复的已查看SO帮助文件?看起来像这篇文章的答案。为了将来的参考,请在你自己的问题中引用另一个问题,并让我们知道你的不同之处。这样,人们会看到你做了一些家庭作业,并在你的问题上投入了精力。谢谢你的提示Richard。第一次邮寄。下次我将尝试这样做。我仍然有处理NAs的问题。例如,如果矩阵中的第一个元素为NA,则当前输出的整个第一列为NA。相反,我希望根据剩余的数据计算相关性。有什么办法吗?