2015-10-14 86 views
0

我有2個大矩陣(通常尺寸爲5000 * 40和20000 * 40)。我想創建一個相關矩陣,我想計算從第一個矩陣到第二個矩陣中每一行的每一行的相關性。我有以下最少的代碼,它需要很長的時間。任何建議,以加快或parallize。由於計算R中的大量關聯

-Jaison

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) 
+1

[R中快速相關使用C和並行]的可能的複製(http://stackoverflow.com/questions/18964837/fast-correlation-in-r-using-c-and-parallelization) –

+0

有無瀏覽SO幫助文件?它看起來像這篇文章的答案是[你的問題](http://stackoverflow.com/questions/18964837/fast-correlation-in-r-using-c-and-parallelization)。 –

回答

0

感謝理查德,我沒有看到你refered對這樣的職位,但通過它在沒有考慮太多,因爲它似乎不屬於我的問題。我有2個矩陣,我執行相關性。再想一想,這對我模糊的大腦產生了影響,我可以簡單地擴展你指出的適合我的問題的解決方案。將這兩個矩陣綁定在一起,然後按照您提到的解決方案進行操作。最後,我提取出相關矩陣的相關角。這比我使用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 
+0

爲了將來的參考,請在你自己的問題中引用其他問題,並讓我們知道你的不同之處。這樣人們會看到你已經做了一些功課,並努力解決你的問題。 –

+0

感謝Richard的提示。第一次發佈。我將在下次嘗試做這件事。 –

+0

我仍然有處理新手的問題。例如,如果a_mat中的第一個元素是NA,則當前輸出將整個第一列作爲NA。相反,我想通過剩餘數據計算相關性。任何解決這個問題? –