R中一个数据集的向量大小分配错误,但对于相同大小的不同数据集却没有

Posted

技术标签:

【中文标题】R中一个数据集的向量大小分配错误,但对于相同大小的不同数据集却没有【英文标题】:Vector size allocation error in R for one dataset but not for different dataset of identical size 【发布时间】:2021-11-20 09:29:11 【问题描述】:

我有一个包含两个因子变量(“Elicitor1_ID”和“CallerID”)和 33 个连续变量的数据集。我想在 R 包方中运行两个条件推理随机森林模型:一个模型将“Elicitor1_ID”预测为 33 个连续变量的函数,另一个模型将“CallerID”预测为相同 33 个预测器的函数变量。在运行每个模型之前,我删除了感兴趣的响应变量中所有带有 NA 的行。由于 Elicitor1_ID 中的 NA 比 CallerID 多,这导致 Elicitor1_ID 模型的数据集有 510 行 (elic),而 CallerID 模型的数据集有 981 行 (call)。在任何预测变量中都没有 NA。

Elicitor1_ID 模型的以下代码可以正常工作:

require(party)
rfelic <- cforest(formula = get("Elicitor1_ID") ~ ., data=elic,
               control=cforest_control(ntree=100, 
                                       mincriterion = qnorm(0.99), maxdepth=5,
                                       fraction=.4, replace=F))

但 CallerID 模型的以下代码返回错误消息:

rfcall <- cforest(formula = get("CallerID") ~ ., data=call,
           control=cforest_control(ntree=100, 
                                   mincriterion = qnorm(0.99), maxdepth=5,
                                   fraction=.4, replace=F))

Error: cannot allocate vector of size 7.5 Gb

我认为这可能是因为“调用”数据集(981 行)大于“elic”数据集的数据集(510 行),所以我尝试从“调用”数据集中随机选择 510 行并运行以此为模型。我得到了完全相同的错误:

Error: cannot allocate vector of size 7.5 Gb

然后我认为问题可能在于响应变量“CallerID”有 178 个级别,而响应变量“Elicitor1_ID”只有 129 个级别。因此,我在 CallerID 的 178 个级别中随机选择了 129 个,并创建了 510 行 call 子样本的进一步子集,其中仅包含这 129 个级别。

require(dplyr)
call1 <- sample_n(call, size=510, replace=F) #randomly sample 510 rows of call
keepIDs <- sample(unique(caller$CallerID), size=129) #randomly select 129 unique caller IDs
call2 <- call[which(call$CallerID %in% keepIDs),]
rfcall2 <- cforest(formula = get("CallerID") ~ ., data=call2,
                  control=cforest_control(ntree=100, 
                                          mincriterion = qnorm(0.99), maxdepth=5,
                                          fraction=.4, replace=F))

但是我又收到了同样的错误信息。

我不明白为什么在我对 CallerID 数据集进行二次抽样以使其与 Elicitor1_ID 数据集大小完全相同或更小之后,R 似乎对 CallerID 模型而不是 Elicitor1_ID 模型存在内存问题。我希望我可以包含一个可重现的示例,但我不知道该怎么做,因为我不知道原始数据的哪个方面导致了这个问题。对于可能导致此奇怪问题的任何建议或想法,我将不胜感激。提前致谢!

【问题讨论】:

【参考方案1】:

几乎可以肯定,问题在于所涉及的一些变量的级别数。可能它不是直接的响应变量,而是(名义/无序)分裂变量之一,其中搜索所有可能的二元分裂变得过于复杂。这种情况只发生在一个响应而不是另一个响应的原因可能是在这两种情况下选择了不同的变量进行拆分。

无论如何,我不会寄希望于仅从 510 个观察值中就可以很好地分类 178 个响应级别。因此,首先重新考虑通用建模方法可能会很有用。

【讨论】:

以上是关于R中一个数据集的向量大小分配错误,但对于相同大小的不同数据集却没有的主要内容,如果未能解决你的问题,请参考以下文章

R内存管理/无法分配大小为n Mb的向量

read.csv.fdff 错误:无法分配大小为 6607642.0 Gb 的向量

为啥 C++ 标准向量在分配或调整大小时会出现段错误? [关闭]

不平衡数据集的采样率

调整对象矢量大小时出错

Rcpp R 向量大小限制(不允许负长度向量)