我正在使用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个内核会出现此问题?
答案 0 :(得分:0)
根据partools
的作者,这可能是一个缩放问题-因此,即使在任何一个块中都没有缺失任何类别变量的类别,由于观察次数众多,错误仍然可能发生在给定的水平上绝对和相对较低。
解决方案
减少块数:假设错误将在某个点消失,则可以减少块数。 大块但是,这也意味着您正在减少数量 您将使用的内核数,这意味着(a)每个块都可以这样 大到使您遇到内存问题或(b)并行 进程现在运行太慢,或者(c)同时运行。
更改级别/变量结构:您可以保持所需数量的块/核心不变,只需更改级别即可
每个级别都有大量的观察结果。对于agelvl
,您
可能会增加间隔(10年而不是5年),或者,如果
可能,将年龄从类别变量更改为连续变量
一。应该记住,这种变化可能会改变
模型的解释力或导致模型错误
指定。