Построение model.matrix в R не помещается в память (перепробовал все пакеты отображения памяти)

Я пытаюсь оценить lm() установку в 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)

person Ryan Price    schedule 09.12.2014    source источник
comment
Попробуйте использовать разреженную матрицу из пакета Matrix.   -  person Neal Fultz    schedule 09.12.2014
comment
Сколько у вас переменных? Сколько наблюдений?   -  person MrFlick    schedule 09.12.2014
comment
@NealFultz, это помогло, спасибо. Теперь матрица занимает место в памяти. Однако (и это может быть рудиментарно), я планировал сначала найти способ построить model.matrix, а затем просто подключить его к функции lm. Раньше я выдавал ошибки; есть ли способ сделать это или указать создание model.matrix в вызове lm, чтобы сделать его разреженным? @MrFlick, в исходном наборе данных около 750 000 наблюдений, в агрегированном (тот, который я использую) около 113 000 и 6 переменных, 5 из которых являются факторами, а 2 из которых имеют более 100 уровней.   -  person Ryan Price    schedule 09.12.2014
comment
Как правило, покупка большего количества оперативной памяти поможет. Если у вас возникли проблемы на этом этапе, они, вероятно, появятся и позже при более сложных операциях.   -  person Tim    schedule 09.12.2014
comment
Это термин взаимодействия 100 факторов на 100 факторов, который взрывает все вокруг.   -  person IRTFM    schedule 09.12.2014


Ответы (1)


Это основано на примере из методов решения в пакете 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
person Neal Fultz    schedule 09.12.2014