Я пытаюсь запустить обобщенную линейную модель на очень большом наборе данных (несколько миллионов строк). Однако R, похоже, не справляется с анализом, так как я продолжаю получать ошибки выделения памяти (не могу выделить вектор размера ... и т. Д.).
Данные помещаются в ОЗУ, но кажутся слишком большими для оценки сложных моделей. В качестве решения я исследую использование пакета ff для замены механизма хранения в оперативной памяти r на хранение на диске.
Я успешно (я думаю) выгружал данные на свой жесткий диск, но когда я пытаюсь оценить glm (через пакет biglm), я получаю следующую ошибку:
Error: $ operator is invalid for atomic vectors
Я не уверен, почему я получаю эту конкретную ошибку при использовании функции bigglm. Когда я запускаю glm для полного набора данных, это не дает мне этой конкретной ошибки, хотя, возможно, r не хватает памяти, прежде чем он зайдет достаточно далеко, чтобы сработала ошибка «оператор недействителен».
Ниже приведен пример набора данных и кода. Обратите внимание, что стандартный glm отлично работает с этими примерами данных. Проблема возникает при использовании biglm.
Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы.
Заранее спасибо!
#Load required packages
library(readr)
library(ff)
library(ffbase)
library(LaF)
library(biglm)
#Create sample data
df <- data.frame("id" = as.character(1:20), "group" = rep(seq(1:5), 4),
"x1" = as.character(rep(c("a", "b", "c", "d"), 5)),
"x2" = rnorm(20, 50, 1), y = sample(0:1, 20, replace=T),
stringsAsFactors = FALSE)
#Write data to file
write_csv(df, "df.csv")
#Create connection to sample data using laf
con <- laf_open_csv(filename = "df.csv",
column_types = c("string", "string", "string",
"double", "string"),
column_names = c("id", "group", "x1", "x2", "y"),
skip = 1)
#Use LaF to import data into ffdf object
ff <- laf_to_ffdf(laf = con)
#Fit glm on data stored in RAM (note this model runs fine)
fit.glm <- glm(y ~ factor(x1) + x2 + factor(group), data=df,
family="binomial")
#Fit glm on data stored on hard-drive (note this model fails)
fit.big <- bigglm(y ~ factor(x1) + x2 + factor(group), data=ff,
family="binomial")