【问题标题】:R in Parallel - Partools Package - Error with `calm()` functionR 并行 - Partools 包 - `calm()` 函数出错
【发布时间】:2018-08-03 14:19:07
【问题描述】:

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

【问题讨论】:

    标签: r parallel-processing rparallel


    【解决方案1】:

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

    解决方案

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-09
      • 2019-05-07
      • 2016-03-06
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      相关资源
      最近更新 更多