2013-02-12 118 views
2

我正在使用自定义的随机森林函数,该函数需要一组基因组数据(约56k列)中的起始点和结束点。R中的并行处理

我想将列号拆分成子组,并允许每个子组分别进行处理以加快速度。我用下面的代码试图此(不成功):

library(foreach) 
library(doMC) 
foreach(startMrk=(markers$start), endMrk=(markers$end)) %dopar% 
    rfFunction(genoA,genoB,0.8,ntree=100,startMrk=startMrk,endMrk=endMrk) 

哪里startMrk是数值变量的数组:1 4 8 12 16和endMrk是另一个数组:3 7 11 15 19

在这个例子中,我想一个核运行样本1:3,另一个运行4:7等。我对R中的并行处理思路很陌生,所以我非常乐意研究任何可用的文档。有没有人有任何建议,我失去了并行处理或上述代码?

回答

1

这里的基本点是,你正在把你的列分成块,正确的。首先,最好在每次迭代时适当地分块数据集,并将块送入RF。此外,的foreach作品就像在某些方面,这样的代码可以

rfs=vector('list',4) 
foreach(i=1:4) %dopar% { 
    ind <- markers$start[i]:markers$end[i] 
    rfs[[i]] <- randomForest(genoA[,ind],genoB[,ind], 0.8, ntree=100) 
} 

我经常随机森林给了这一点,但你可以在一个简单的方式把这个包成您的自定义代码。

+0

这并不工作完全正确,但是当我用类似: 的r < - 的foreach(I = 1:5,.combine = “cbind”)%dopar%{随机森林(热那亚,genoB, 0.8,ntree = 100,startMrk = markers $ start [i],endMrk = markers $ end [i])}' 我得到了我想要的东西。最后一个问题:我正在使用的自定义函数返回一个列表。有没有办法有选择地组合列表中的元素? 感谢您的帮助! – trvrr 2013-02-12 18:01:29

+0

有点晚了,但要回答你的“最终问题”:而不是“有选择地组合列表中的元素”,为什么不提取你感兴趣的列表元素?而不是:'foreach(...)%dopar%{return(list(A = ...,B = ...))}';尝试:'foreach(...)%dopar%{res < - list(A = ...,B = ...);返回(残$ A)}'。或者,定义你自己的'.combine'功能,它可以做同样的事情。 (第一个选项会导致更少的数据移动;但是如果'res $ B'很重要!) – dynamo 2014-01-23 09:50:31