我使用一些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/