并行中的R-Partools软件包-`calm()`函数出错

时间:2018-08-03 14:19:07

标签: r parallel-processing rparallel

我正在使用partools包并行运行线性回归。我使用calm()函数执行此操作,该函数是R的lm()程序包版本的包装。

我正在64GB节点上使用20个内核。

运行calm()函数时收到错误,并且已将问题隔离到一个变量:agelvl。由于partools必须将数据集分成多个块(块的数量等于要使用的核心数),因此,据我所知,变量存储为字符或整数。 agelvl由于其命名级别而被存储为字符,因此我在函数中在其周围使用了factor()

代码如下:

lpmvbac2<-calm(cls,'vbac ~ factor(agelvl),data=nat[nat$prec==1,]')$tht

这是错误:

  Error in cabase(cls, ovf, coef, vcov) :
      likely cause is constant variable in some chunk
    Calls: calm -> cabase
    In addition: Warning message:
    In f(init, x[[i]]) :
      number of columns of result is not a multiple of vector length (arg 2)

当我在本地计算机上运行上述代码时(尽管使用3个内核而不是20个内核),但无法重现该错误。这将表明问题发生在分块中,特别是一个或多个块中缺少给定级别的agelvl

但是,以下是未分块数据中agelvl的摘要:

under 15    15-19    20-24    25-29    30-34    35-39    40-44    45-49 
    7440   336242   698606   770127   620437   267777    48342     2176 

在我看来,分成20个块似乎不太可能,这20个块中的任何一个都将缺少这些级别中的任何一个。我什至分别检查了每个20个块,而且看不到任何级别的丢失:

   15-19    20-24    25-29    30-34    35-39    40-44    45-49 under 15
   16732    34284    37552    30392    13225     2410      105      382

   15-19    20-24    25-29    30-34    35-39    40-44    45-49 under 15
   16774    34906    38727    31012    13469     2445      113      386

   15-19    20-24    25-29    30-34    35-39    40-44    45-49 under 15
   17007    34762    38820    31159    13311     2326      104      344

   15-19    20-24    25-29    30-34    35-39    40-44    45-49 under 15
   16836    34839    38387    31251    13594     2429       91      405

   15-19    20-24    25-29    30-34    35-39    40-44    45-49 under 15
   16621    35150    38519    31103    13470     2505      109      355

   15-19    20-24    25-29    30-34    35-39    40-44    45-49 under 15
   16768    35020    38673    31034    13379     2467       97      395

   15-19    20-24    25-29    30-34    35-39    40-44    45-49 under 15
   16724    35036    38376    31211    13473     2538      120      354

   15-19    20-24    25-29    30-34    35-39    40-44    45-49 under 15
   16948    34831    38714    31013    13486     2373      107      361

   15-19    20-24    25-29    30-34    35-39    40-44    45-49 under 15
   16948    34807    38845    30801    13532     2432      107      360

   15-19    20-24    25-29    30-34    35-39    40-44    45-49 under 15
   16746    35042    38581    31184    13369     2381      130      400

   15-19    20-24    25-29    30-34    35-39    40-44    45-49 under 15
   16796    35045    38616    31200    13351     2335      111      378

   15-19    20-24    25-29    30-34    35-39    40-44    45-49 under 15
   16837    35298    38579    30858    13369     2424      106      361

   15-19    20-24    25-29    30-34    35-39    40-44    45-49 under 15
   16882    34955    38529    31136    13403     2459      104      365

   15-19    20-24    25-29    30-34    35-39    40-44    45-49 under 15
   16839    35096    38360    31210    13383     2462      106      376

   15-19    20-24    25-29    30-34    35-39    40-44    45-49 under 15
   17109    35106    38450    30991    13322     2377      112      366

   15-19    20-24    25-29    30-34    35-39    40-44    45-49 under 15
   16869    35118    38310    31083    13426     2530      122      374

   15-19    20-24    25-29    30-34    35-39    40-44    45-49 under 15
   16850    34885    38768    31210    13284     2371      101      363

   15-19    20-24    25-29    30-34    35-39    40-44    45-49 under 15
   16644    35086    38968    30840    13450     2378      103      364

   15-19    20-24    25-29    30-34    35-39    40-44    45-49 under 15
   16707    35086    38762    31010    13371     2387      121      388

   15-19    20-24    25-29    30-34    35-39    40-44    45-49 under 15
   16605    34254    37591    30739    13110     2313      107      363

有趣的是,当我将数据分成3个块并在群集上使用3个内核(而不是20个)时,就可以运行它,就像在本地计算机上一样。

那么,为什么使用20个内核而不是3个内核会出现此问题?

1 个答案:

答案 0 :(得分:0)

根据partools的作者,这可能是一个缩放问题-因此,即使在任何一个块中都没有缺失任何类别变量的类别,由于观察次数众多,错误仍然可能发生在给定的水平上绝对和相对较低。

解决方案

  1. 减少块数:假设错误将在某个点消失,则可以减少块数。 大块但是,这也意味着您正在减少数量 您将使用的内核数,这意味着(a)每个块都可以这样 大到使您遇到内存问题或(b)并行 进程现在运行太慢,或者(c)同时运行。

  2. 更改级别/变量结构:您可以保持所需数量的块/核心不变,只需更改级别即可     每个级别都有大量的观察结果。对于agelvl,您     可能会增加间隔(10年而不是5年),或者,如果     可能,将年龄从类别变量更改为连续变量     一。应该记住,这种变化可能会改变     模型的解释力或导致模型错误     指定。