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
的作者,这可能是一个缩放问题——因此,即使在任何一个块中都没有丢失分类变量的水平,错误仍然可能发生,因为数字给定级别的观察值绝对和相对较低。
解决方案
减少块的数量:假设有一个错误会消失的点,你可以减少块的数量
块;但是,这也意味着您正在减少数量
您将使用的核心数,这意味着 (a) 每个块可能是这样
大到你 运行 进入内存问题或 (b) 并行
现在处理 运行 太慢,或者 (c) 两者都有。
改变levels/variable结构:你可以保留想要的chunks/cores数量,然后简单地改变层次以便
每个级别都有一定数量的观察值。 agelvl
,你
可以增加间隔(10 年,而不是 5),或者,如果
可能,将年龄从分类变量更改为连续变量
一。人们应该记住,这样的变化可能会改变
模型的解释力或导致模型不正确
指定。
我正在使用 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
的作者,这可能是一个缩放问题——因此,即使在任何一个块中都没有丢失分类变量的水平,错误仍然可能发生,因为数字给定级别的观察值绝对和相对较低。
解决方案
减少块的数量:假设有一个错误会消失的点,你可以减少块的数量 块;但是,这也意味着您正在减少数量 您将使用的核心数,这意味着 (a) 每个块可能是这样 大到你 运行 进入内存问题或 (b) 并行 现在处理 运行 太慢,或者 (c) 两者都有。
改变levels/variable结构:你可以保留想要的chunks/cores数量,然后简单地改变层次以便 每个级别都有一定数量的观察值。
agelvl
,你 可以增加间隔(10 年,而不是 5),或者,如果 可能,将年龄从分类变量更改为连续变量 一。人们应该记住,这样的变化可能会改变 模型的解释力或导致模型不正确 指定。