R - doParallel не работает с тестами Стьюдента и Фишера
Поэтому я использую пакет R doParallel для распараллеливания некоторых этапов моего сценария, когда мне приходится обрабатывать большой список элементов, чтобы быстрее его вычислить. С тех пор все функции, которые я использовал до сих пор, прекрасно работали с foreach (): мне просто нужно было указать количество ядер с помощью registerDoParallel(), и это было все!
Недавно я пытался использовать разные статистические тесты в R, используя var.test () и t.test (), и я не понимаю, почему, но я понял, что в foreach () это не работает... Так что, чтобы быть более Понятно, что я в основном делаю итерации по строкам из 2 матриц одинаковых размеров: каждая строка в каждой матрице содержит 5 числовых значений, и я делаю, например:
var.test(matrixA[1,],matrixB[1,])$p.value
извлечь для строки № 1 соответствующее значение p. из теста Фишера, выполненное на 10 числовых значениях (2 группы по 5 значений в каждой строке строки 1 матрицы). Проблема в том, что в моих матрицах миллионы строк, поэтому мне нужно перебирать количество строк, и я делаю это с помощью функции foreach ():
p.values.res<-foreach(i=seq(dim(matrixA)[1])) %dopar%
var.test(matrixA[i,],matrixB[i,])$p.value
(Здесь я устанавливаю registerDoParallel(cores = 6) перед foreach ()). Я пробовал разные тесты: тест Фишера и тест студента (t.test ()), и, к сожалению, ни один из них не работал на моих 6 ядрах, только одно.
Я также попытался с "cl": registerDoParallel(cl = 4) Это тоже не работает.
Я пытался перезапустить R, выйти и снова открыть сеанс, перезагрузить компьютер: не работает.
Кто-нибудь знает, почему это не работает, и как это исправить?
Моя конфигурация: Linux Mint 18.2 Cinnamon 64-bit (3.4.6); Процессор Intel Core I7-6700; Версия R 3.4.3 (2017-11-30); RStudio Версия 1.1.383 2009-2017.
вот 2 коротких примера матриц
матрицы А:
0.7111111 0.7719298 0.7027027 0.6875000 0.6857143
0.8292683 0.6904762 0.8222222 0.8333333 0.6250000
0.8846154 0.5714286 0.8928571 0.8846154 0.9259259
0.9000000 0.5000000 0.9500000 0.8666667 0.8260870
0.8235294 0.3684211 0.9411765 0.8333333 0.8000000
0.5714286 0.2142857 0.6666667 0.5000000 0.5555556
MatrixB:
0.5227273 0.7142857 0.7808219 0.6346154 0.7362637
0.9166667 0.7173913 0.8611111 0.7391304 0.7538462
0.8666667 0.6052632 0.8260870 0.7333333 0.9024390
0.9285714 0.5806452 0.8750000 0.6956522 0.8787879
0.8333333 0.5517241 0.8333333 0.6818182 0.8750000
0.7500000 0.2941176 0.6666667 0.4444444 0.7500000
Заранее всем спасибо за помощь. С Уважением,
2 ответа
К сожалению, я не нашел решения моей проблемы с doParallel, но я понял, что мне не нужно было использовать его в первую очередь.
Из пакета R "genefilter" я нахожу альтернативное решение, использующее функцию rowttests(), которая действительно быстра для проведения t-тестов на большой матрице. Единственный комментарий, который я имею к этой функции, заключается в том, что она предполагает, что дисперсии равны при вычислении p-значений (и вы не можете это изменить). К счастью, я в этом деле.
Так что мне просто нужно было cbind() моя матрица 2, указать принадлежащие группы в качестве факторов для столбцов. И это все!
bind_matrix<-cbind(matrixA,matrixB)
fact<-factor(c("A","A","A","A","A","B","B","B","B","B"))
p.vals<-rowttests(bind_matrix,fact)$p.values
Это занимает несколько секунд, и я попробовал это для матрицы 10 миллионов строк.
Решение это тот же тест Фишера, есть функция rowFtests().
Так что теперь я могу попросить о быстродействующем решении для тестов Вилкоксона. Если кто-то знает функцию, которая работает аналогично этим, прокомментируйте, пожалуйста.
Я не могу воспроизвести вашу проблему. Это прекрасно работает для меня:
matrixA <- matrix(runif(36), 6)
matrixB <- matrix(runif(36), 6)
cl <- parallel::makeCluster(4)
doParallel::registerDoParallel(cl)
library(foreach)
p.values.res<-foreach(i=seq(dim(matrixA)[1])) %dopar%
var.test(matrixA[i,],matrixB[i,])$p.value
parallel::stopCluster(cl)