R中的sparse.model.matrix丢失了行

20

我正在处理一个看起来对于glm函数来说过于庞大的常规data.frame,因此我决定使用稀疏模型矩阵的表示方法,以便将其放入glmnet函数中。但是sparse.model.matrix似乎会从原始矩阵中删除一些行。有什么想法为什么会发生这种情况以及如何避免这种情况吗?下面是代码:

> mm <- sparse.model.matrix(~clicks01+kl_tomek*bc1+hours+plec+1, 
data = daneOst)
> dim(mm)
[1] 1253223     292
> dim(daneOst)
[1] 1258836       6
3个回答

19

我成功地将na.action更改为na.pass,这将包括我的矩阵中的所有行:

options(na.action='na.pass')

请注意这是一个全局选项,所以您可能需要在之后将其设置回原始值,以避免影响代码的其他部分。

previous_na_action <- options('na.action')
options(na.action='na.pass')
# Do your stuff...

options(na.action=previous_na_action$na.action)

来自这个答案的解决方案。


请注意,我正在使用可以处理NA值的基于树的模型。您的情况可能会有所不同。 - Bar
我认为这是目前最好的解决方案,因此我将其接受为答案。 - Marcin

8

这是由于存在NA值导致的!

运行sum(complete.cases(mm))。我敢打赌它也会给出1253223。

因此,将数据框中的NA值替换为一个值(例如“IMPUTED_NA”或-99999),然后再试一次。


2

@WillemM 是正确的。存在 NAs 会触发稀疏矩阵。对于大数据集,最好的方法是使用 stringsAsFactors=FALSE 将文件读入数据框,然后选择任何你想要的插值方法。如果您选择使用基于树的学习方法,则更容易用数据集中不存在的内容替换这些 NAs。在大数据集上执行多重插补将非常耗时,并且可能会丢失 R 会话。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接