在R中构造model.matrix无法适应内存(尝试了所有内存映射包)

时间:2014-12-09 17:52:21

标签: r lm model.matrix filehash

我正在尝试估算大型销售数据集中的lm()装备。数据本身并不大,以至于R无法处理它;内存大约250MB。问题是当lm()被调用以包含所有变量和交叉项时,model.matrix()的构造会抛出错误,指出机器已经耗尽内存并且无法分配大小的向量(在这种情况下,约47GB)。可以理解,我没有那么多RAM。问题是,我尝试了ffbigmemoryfilehash包,所有这些都适用于在现有文件之外使用现有文件(我特别喜欢数据库的数据库功能) filehash)。但是,对于我的生活,我不能完全创造model.matrix。我认为问题在于,尽管将输出文件映射到我创建的数据库,R仍试图将其设置在RAM中,并且无法进行。有没有办法避免使用这些包,或者我做错了什么? [另外,使用biglm和其他功能来做事情,甚至不允许我一次一个块。再一次,似乎R试图在整理之前先将model.matrix作为整体{1}}

非常感谢任何帮助!

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)

1 个答案:

答案 0 :(得分:0)

这是基于Matrix包中的solve-methods的例子:

> ?`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