0

我正在尝试以并行格式运行以下代码(用于 EWAS 目的):

registerDoParallel(2)

combined <- foreach(i = 28:78, .combine=rbind)  %dopar%                 
{
mm<-rep(NA,412) 

FIDunique<-unique(pheno$FID)
for(j in FIDunique)
{
  nn<-which(pheno1$FID==j)
  mm[nn]<-mean(pheno1[nn,i])
}
tt4<-which(!is.na(mm))

if(length(tt4)>19 & length(table(pheno1[,i]))>1)
{
  meth<-pheno1[tt4,i]
  mm<-mm[tt4]

  if(length(levels(factor(pheno1$smoking)))<2) 
  {
    lme2<-tryCatch(lme(I(meth-mm)~delta_residSpine+I(DNA_year-AGE_year)+CD8T+CD4T+NK+Bcell+Mono+Gran,random=~1|FID, control=lmeControl(msMaxIter=50000,opt="optim"), data=pheno1[tt4,]),error = function(e) rep (NaN,1)) 
  }
  else 
  {
    lme2<-tryCatch(lme(I(meth-mm)~delta_residSpine+I(DNA_year-AGE_year)+factor(smoking)+CD8T+CD4T+NK+Bcell+Mono+Gran,random=~1|FID, control=lmeControl(msMaxIter=50000,opt="optim"), data=pheno1[tt4,]),error = function(e) rep (NaN,1))
  }

  if(!is.na(lme2)) out18[i-27,2:5]<-summary(lme2)$tTable[2,-3]

  rm(mm,nn,meth,lme2)
}

out18[i-27,6]<-length(tt4)
out18[i-27,]
}

我遇到的问题是,当我在第二行中使用 %do% 时,程序完美执行并且“组合”包含正确的输出。

但是,当我使用 %dopar% 时(如上面的代码所示),中间的四列组合消失了。我想这是因为这四列是基于 tryCatch 分配的?我已经坚持了几天,真的需要取得进展。

当我以 %do% 运行程序时,我收到警告也毫无价值

if (!is.na(lme2)) out18[i - 27, 2:5] <- summary(lme2)$tTable[2, 中的警告:条件的长度 > 1 并且仅使用第一个元素

对于每次迭代,但是在 %dopar% 下运行时我根本没有得到这个。

抱歉,如果我没有就变量是什么提供足够的信息,我试图尽可能少地披露出于道德原因正在处理的实际信息。

4

1 回答 1

0

我认为你是对的,tryCatch 隐藏了一个意外错误。例如,既然您正在使用该lme功能,您不应该将nlme包加载到您的工人身上吗?如:

r <- foreach(i = 28:78, .packages='nlme', .combine=rbind)  %dopar% {
  #snip
}

可能还有其他问题,例如必须显式导出的对象,因此我建议您更改代码以不隐藏意外错误,尤其是在测试/调试时。一种简单的方法是记录错误,然后返回适当的值:

tryCatch(foo(), error = function(e) {
  print(e)
  NaN
})

为了查看这些日志消息,您可以使用 makeClusteroutfile=""选项,以便消息将显示在您的终端中。有关更多信息,请参阅此答案

我还建议您将测试更改为:

if (!identical(lme2, NaN)) ...

这将避免当lme2is not a时的警告,NaN因为identical从不返回长度 > 1 的值。

于 2017-04-21T13:23:26.437 回答