我使用一些big.___()包在R中使用了很大的数据集。它约为10个演出(100mmR x 15C),看起来像这样:

Price         Var1         Var2
12.45          1             1
33.67          1             2
25.99          3             3
14.89          2             2
23.99          1             1
...            ...          ...

我正在尝试根据Var1和Var2预测价格。

我想到的问题是Var1和Var2是类别变量/因子变量。
Var1和Var2每个都有3个级别(1,2和3),但是数据集中只有6种组合
(1,1;  1,2;  1,3;  2,2;  2,3;  3,3)

要在biglm()中使用因子变量,它们必须存在于biglm使用的每个数据块中(我的理解是biglm将数据集分解为“x”个数据块,并在分析每个数据块后更新回归参数以避开交易数据集大于RAM)。

我试图对数据进行子集化,但是我的计算机无法处理它或我的代码错误:
bm11 <- big.matrix(150000000, 3)
bm11 <- subset(x, x[,2] == 1 & x[,3] == 1)

上面给了我很多这样的东西:
Error: cannot allocate vector of size 1.1 Gb

有人对解决此问题有任何建议吗?

我在Windows 7机器上使用R 64位,带有4个RAM。

最佳答案

您不需要每个块中存在的所有数据或所有值,只需要考虑所有级别。这意味着您可以拥有这样的块:

curchunk <- data.frame( Price=c(12.45, 33.67), Var1=factor( c(1,1), levels=1:3),
  Var2 = factor( 1:2, levels=1:3 ) )

它会工作。即使Var1中只有1个值,Var2中只有2个值,这三个级别都存在,所以它将做正确的事情。

此外,biglm不会为您将数据分成多个块,但希望您将其分配给可管理的块。仔细研究示例,以更好地了解这一点。 biglm的一种常见方法是从文件或数据库中读取,读取前“n”行(其中“n”是一个合理的子集),然后将它们传递给biglm(可能在确保所有因素都指定了所有级别之后) ),然后从内存中删除该数据块,并读取下一个'n'行,并将其传递给update,继续进行此操作,直到文件末尾每次都删除已使用的块(因此您有足够的存储空间供下一个一)。

关于带分类变量的R biglm,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10502882/

10-12 19:09