我正在使用R中的LQMM软件包进行非常耗时的分析。我将模型设置为在星期四开始运行,现在是星期一,并且仍在运行。我对模型本身有信心(作为标准MLM测试),并且对我的LQMM代码有信心(使用同一数据集运行了其他几个非常相似的LQMM,并且它们都花了一天的时间运行)。但是,我真的很想弄清楚如何使用我可以访问的机器的并行处理功能(请注意,所有都是基于Microsoft Windows)。
我已经阅读了有关使用并行的几个教程,但是我还没有找到一个显示如何与其他R软件包一起使用并行软件包的内容。...我是在考虑这一点,还是不可能?
这是我使用R软件包LQMM运行的代码:
install.packages("lqmm")
library(lqmm)
g1.lqmm<-lqmm(y~x+IEP+pm+sd+IEPZ+IEP*x+IEP*pm+IEP*sd+IEP*IEPZ+x*pm+x*sd+x*IEPZ,random=~1+x+IEP+pm+sd+IEPZ, group=peers, tau=c(.1,.2,.3,.4,.5,.6,.7,.8,.9),na.action=na.omit,data=g1data)
数据集对58个变量有122433个观测值。所有变量均为z评分或虚拟编码。
需要在所有节点上评估因库。为此,parallel
软件包内预见了clusterEvalQ
功能。您可能还需要将一些数据导出到子节点的全局环境中:为此,您可以使用clusterExport
函数。还可以查看此页面以获取有关可能对您有用的其他相关功能的更多信息。
通常,要使用多个内核加快应用程序的速度,您将必须在可以在不同核心上并行处理的多个子插件中划分问题。为了在R中实现这一目标,您首先需要创建一个群集并为其分配特定数量的内核。接下来,您必须注册群集,将所需的变量导出到节点,然后评估每个子节点上的必要库。您设置群集并启动节点的确切方法将取决于您将使用的Sublibraries和功能的类型。例如,当您选择使用doParallel
软件包时,您的clustersetup可能看起来像这样(以及其他大多数并行subliblaries/functions):
library(doParallel)
nrCores <- detectCores()
cl <- makeCluster(nrCores)
registerDoParallel(cl);
clusterExport(cl,c("g1data"),envir=environment());
clusterEvalQ(cl,library("lqmm"))
现在准备了集群。现在,您可以将全局任务的子部分分配给群集中的每个节点。在下面的一般示例中,群集中的每个节点将处理全局任务的i
子部分。在示例中,我们将使用doParallel
软件包提供的foreach %dopar%
功能:
多帕利的软件包提供了平行的后端 使用R 2.14.0的并行软件包和 后来。
subresults将自动添加到resultList
中。最后,当所有子过程完成时,我们将合并结果:
resultList <- foreach(i = 1:nrCores) %dopar%
{
#process part i of your data.
}
stopCluster(cl)
#merge data..
由于您的问题不是专门针对如何拆分数据的,因此我会让您自己弄清楚此部分的详细信息。但是,您可以在我对本文的回答中使用doParallel
软件包找到一个更详细的示例。
听起来您想使用并行计算更快地执行lqmm
函数的单个呼叫。为此,您要么必须:
- 将
lqmm
的一个调用分为多个函数调用; - 在
lqmm
中并行化一个循环。
通过指定较小的迭代值,可以将某些功能分为多个较小的部分。示例包括在ntree
参数上并行化randomForest
,或在nstart
参数上并行化kmeans
。另一种常见的情况是将输入数据分为较小的零件,并并联在零件上操作,然后结合结果。当输入数据是数据框或矩阵时,通常会这样做。
但是,为了使一个函数并行,您必须对其进行修改。实际上可能会更容易,因为您可能不必弄清楚如何分解问题并结合部分结果。您可能只需要将lapply
调用转换为并行lapply
,或将for loop转换为foreach循环。但是,理解代码通常很耗时。介绍代码也是一个好主意,以便您的并行化确实加快了函数调用。
我建议您下载lqmm
软件包的源分布并开始阅读代码。尝试了解其结构,并了解哪些循环可以并行执行。如果幸运的话,您可能会找到一种将一个呼叫分为多个电话的方法,但是否则您必须重建机器上的软件包的修改版本。