Создание model.matrix в R не помещается в памяти (перепробовал все пакеты отображения памяти)
Я пытаюсь оценить lm()
Fitment в R для большого набора данных продаж. Сами данные не настолько велики, что R не может их обработать; около 250 МБ в памяти. Проблема в том, когда lm()
вызывается для включения всех переменных и кросс-терминов, конструкция model.matrix()
выдает ошибку, говорящую о том, что машине не хватает памяти, и она не может выделить вектор размера (в данном случае около 47 ГБ). Понятно, у меня не так много оперативной памяти. Проблема в том, что я пробовал ff
, bigmemory
, а также filehash
пакеты, все из которых отлично работают для работы вне памяти с существующими файлами (мне особенно нравятся функции базы данных filehash
). Но я не могу, ради моей жизни, получить model.matrix
быть созданным на всех. Я думаю, проблема в том, что, несмотря на отображение выходного файла в базу данных, которую я создал, R все равно пытается установить его в ОЗУ и не может. Есть ли способ избежать этого с помощью этих пакетов, или я делаю что-то не так?
[Также, используя 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)
1 ответ
Это основано на примере метода solve-method в пакете Matrix:
> ?`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