2014-12-09 4 views
2

큰 판매 데이터 세트의 lm() R 값을 추정하려고합니다. 데이터 자체가 너무 커서 R이 처리 할 수 ​​없습니다. 약 250MB의 메모리. 문제는 모든 변수와 교차 단어를 포함하도록 lm()을 호출 할 때 model.matrix()의 구성에서 시스템 메모리가 부족하여 크기가 벡터 인 경우 (약 47GB)를 할당 할 수 없다는 오류가 발생합니다. 이해할 수있는, 나는 그다지 RAM이 없다. 문제는, 내가 ff, bigmemoryfilehash 패키지를 시도했는데, 모두 기존 파일 (특히 데이터베이스 기능이 filehash)과 함께 메모리 외부에서 작업 할 때 적합합니다. 그러나 나는 내 삶을 위해서 model.matrix을 전혀 만들 수 없습니다. 나는 문제는, 내가 만든 데이터베이스에 출력 파일을 매핑 했음에도 불구하고, R은 RAM에 그것을 설정하려고 시도하고, 그렇게 할 수 없다고 생각한다. 이 패키지를 사용하지 않도록하는 방법이 있습니까, 아니면 제가 잘못하고있는 것입니까? [biglm 및 기타 기능을 사용하여 청크 와이즈를 수행하더라도 한 번에 하나씩 청크를 허용하지 않습니다. 다시, R은 그것을 청킹하기 전에 먼저 model.matrix을 만들려고 시도합니다.R에서 model.matrix를 생성하는 것이 메모리에 맞지 않습니다. (모든 메모리 매핑 패키지를 시도했습니다.)

어떤 도움을 주시면 감사하겠습니다!

library(filehash) 
library(ff) 
library(ffbase) 
library(bigmemory) 
library(biganalytics) 
library(dummies) 
library(biglm) 
library(dplyr) 
library(lubridate) 
library(data.table) 



SID <- readRDS('C:\\JDA\\SID.rds') 
SID <- as.data.frame(unclass(SID)) # to get characters as Factors 

dbCreate('reg.db') 
db <- dbInit('reg.db') 
dbInsert(db, 'SID', SID) 
rm(SID) 
gc() 

db$summary1 <- 
    db$SID %>% 
    group_by(District, Liable, TPN, mktYear, Month) %>% 
    summarize(NV.sum = sum(NV)) 

start.time <- Sys.time() 
# Here is where it throws the error: 
db$fit <- lm(NV.sum ~ .^2, data = db$summary1) 
Sys.time() - start.time 
rm(start.time) 
gc() 

summary(fit) 
anova(fit) 
+0

은'Matrix' 패키지로부터 희소 행렬을 사용하여 시도. –

+0

몇 개의 변수가 있습니까? 얼마나 많은 관측이 있었습니까? – MrFlick

+0

@NealFultz, 그 트릭을 했어, 고마워. 매트릭스는 이제 메모리 공간을 차지하고 있습니다. 그러나 (그리고 이것은 초보적인 것일 수도 있습니다.) 먼저,'model.matrix'를 생성 한 다음,'lm' 함수에 연결하는 방법을 찾았습니다. 나는 일찍 오류를 던지고 있었다. 그것을하기위한 방법이 있는가, 또는'lm' 호출에서'model.matrix' 생성을 지정하여 그것을 희귀 한 것으로 만드는 방법이 있습니까? @MrFlick, 원래 데이터 세트에는 약 750,000 회의 관측치가 있고 집계 된 데이터에는 약 113,000 개의 데이터가 있고 변수 6 개에는 요인이 있고 그 중 2 개에는 100 개가 넘는 변수가 있습니다. –

답변

0

이것은 매트릭스 패키지-해결 방법의 실시 예에 기초한다 :

> ?`solve-methods` 
> n1 <- 7; n2 <- 3 
> dd <- data.frame(a = gl(n1,n2), b = gl(n2,1,n1*n2))# balanced 2-way 
> X <- sparse.model.matrix(~ -1+ a + b, dd)# no intercept --> even sparser 
> Y <- rnorm(nrow(X)) 
> # Forming normal equations manually and solving for beta-hat 
> solve(crossprod(X), crossprod(X, Y)) 
9 x 1 Matrix of class "dgeMatrix" 
      [,1] 
[1,] 1.2384385 
[2,] 1.3313779 
[3,] 0.7497135 
[4,] 0.7840841 
[5,] 0.9586135 
[6,] 0.4667769 
[7,] 1.6648260 
[8,] -1.6669776 
[9,] -1.1142240