R in Parallel - Partools 包 - `calm()` 函数出错

R in Parallel - Partools Package - Error with `calm()` function

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

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

解决方案

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

  2. 改变levels/variable结构:你可以保留想要的chunks/cores数量,然后简单地改变层次以便 每个级别都有一定数量的观察值。 agelvl,你 可以增加间隔(10 年,而不是 5),或者,如果 可能,将年龄从分类变量更改为连续变量 一。人们应该记住,这样的变化可能会改变 模型的解释力或导致模型不正确 指定。