8

我使用一些big.___()包在 R 中使用了一个大型数据集。大约 10 gigs (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

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

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

4

1 回答 1

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,继续此操作直到文件末尾每次删除已使用的块(因此您有足够的内存空间用于下一个)。

于 2012-05-08T17:52:32.950 回答