2015-10-14 3 views
0

У меня есть 2 больших матрицы (обычно размером 5000 * 40 и 20000 * 40). Я пытаюсь создать корреляционную матрицу, где я хотел бы рассчитать соотношение каждой строки от первой матрицы к каждой другой строке во второй матрице. У меня есть минимальный код, он занимает очень много времени. Любые рекомендации по ускорению или параллелизации. БлагодаряВычисление большого числа корреляций в 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

Have просмотрел файлы справки SO? Похоже, этот ответ на ваш ответ [ваш вопрос] (http://stackoverflow.com/questions/18964837/fast-correlation-in-r-using-c-and-parallelization). –

ответ

0

Благодаря Ричард, я видел этот пост вы refered к на SO, но передал его в течение не слишком много думать об этом, потому что, похоже, не относится к моей проблеме. У меня есть 2 матрицы, через которые я выполняю корреляции. Немного больше об этом подумал, и это походило на мой тусклый мозг, что я могу просто расширить решение, которое вы указали в соответствии с моим вопросом. rbind две матрицы, затем следуйте решению, на которое вы ссылались. Наконец, я извлекаю соответствующий угол корреляционной матрицы. Это работает быстрее, чем мой исходный код, используя 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

Спасибо за отзыв Ричарда. Первый пост. Я попытаюсь сделать это в следующий раз. –

+0

У меня все еще проблема с НС. Если, например, первым элементом в a_mat является NA, то текущий вывод имеет весь первый столбец как NA. Вместо этого я хотел бы, чтобы корреляция рассчитывалась по остальным данным. Любая работа вокруг этого? –

Смежные вопросы