2012-05-08 79 views
8

我有一个大型的数据集,我在R中使用一些big.___()软件包。这是〜10场演唱会(100mmR X 15C),看起来像这样:R biglm与分类变量

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 

不任何人有任何建议来解决这个问题?

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

+0

您可以自己创建傻瓜并在其上运行'biglm'吗? –

+0

@ gsk3:这是我在意识到他们需要出现在每个块之前所做的。我成功地运行biglm,然后在尝试预测新值时收到错误消息,但它们并不全部出现在回归参数中。 – screechOwl

回答

9

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

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,继续执行此操作,直到文件结尾每次都删除使用的块(这样就可以为下一个块留出足够的内存空间一)。