0

我正在使用该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 核时会出现这个问题?

4

1 回答 1

0

根据作者的说法partools,这可能是一个缩放问题——因此,即使任何一个块中没有任何级别的分类变量丢失,错误仍然可能发生,因为给定级别中的观察数量既是绝对的又是绝对的。相对较低。

解决方案

  1. 减少chunk的数量:假设有一个点错误会消失,你可以减少chunk的数量;但是,这也意味着您正在减少将使用的内核数量,这意味着(a)每个块可能太大以至于您遇到内存问题或(b)并行进程现在运行速度太慢,或(c ) 两个都。

  2. 更改级别/变量结构:您可以保留所需数量的块/核心,并简单地更改级别,以便每个级别都有关键数量的观察。对于agelvl,您可以增加间隔(10 年,而不是 5 年),或者,如果可能,将年龄从分类变量更改为连续变量。应该记住,此类更改可能会改变模型的解释能力或导致模型被错误地指定。

于 2018-08-06T19:53:28.590 回答