2012-05-08 122 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,繼續執行此操作,直到文件結尾每次都刪除使用的塊(這樣就可以爲下一個塊留出足夠的內存空間一)。