我正在尝试lm()
为大型销售数据集估计 R 中的装备。数据本身并没有大到 R 无法处理;大约 250MB 的内存。问题是当lm()
被调用以包含所有变量和交叉项时,构造会model.matrix()
引发错误,指出机器内存不足并且无法分配大小为任何大小的向量(在本例中约为 47GB)。可以理解,我没有那么多内存。问题是,我已经尝试了ff
、bigmemory
和filehash
包,所有这些都可以在内存之外使用现有文件正常工作(我特别喜欢 的数据库功能filehash
)。但我不能,为了我的一生,得到model.matrix
被创造出来。我认为问题在于,尽管将输出文件映射到我创建的数据库,R 还是尝试在 RAM 中设置它,但不能。有没有办法使用这些包来避免这种情况,或者我做错了什么?[此外,使用biglm
和其他功能来分块地做事甚至不允许我一次一个地分块。再一次,似乎 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)