Я пытаюсь запустить базовую модель регрессии в R. Раньше я всегда без проблем использовал функцию lm()
. Однако мой фрейм данных теперь слишком велик для этой функции и моего компьютера. После 30-минутного запуска функции lm()
в моем наборе данных без какого-либо прогресса я остановил функцию, и RStudio завершился сбоем. Компьютер, который я использую, имеет 24 ГБ оперативной памяти.
Моя регрессионная модель:
lm(y~var1+var2+var3+var4, data = df)
Данные, на которых я пытаюсь запустить функцию lm():
n=100000
, с 4 независимыми переменными (одна numeric
, три factor
) и нормально распределены.
Я обнаружил, что использование функции glm4()
(из пакета MatrixModels) работает намного быстрее и не приводит к сбою R в моем случае. Однако эта функция не создает сводную таблицу при ее вызове:
library(MatrixModels)
fit <- glm4(y~var1+var2+var3+var4, data = df, sparse = TRUE, family = gaussian)
summary(fit)
Length Class Mode
1 glpModel S4
Работают только коэффициенты вызова с использованием head(coef(fit))
, однако я бы предпочел полную сводную таблицу.
head(coef(fit))
Я тоже видел эту тему:
Есть ли более быстрая функция lm, в котором обсуждаются функции lm.fit()
и .lm.fit()
, хотя синтаксис и ввод (матрица) в этих функциях отличаются от других функций. Функция speedglm
из пакета speedglm
в моем случае возвращает ошибку. Большинство тем об альтернативах функции lm()
и glm()
также устарели.
Как лучше всего запустить lm()
на большом наборе данных в настоящее время?
Можете ли вы объяснить больше, что вы делаете? Я создал поддельные данные, такие как ваши, для n = 100k и запустил вашу строку lm(y...
, и это заняло ~ 1 секунду, а n = 10M заняло около 25 секунд. Можете ли вы воспроизвести проблему с поддельными сгенерированными данными?
100 КБ на самом деле не так уж и много, я ожидаю, что lm
прекрасно справится с этим, если только вашему процессору не исполнилось 20 лет.
Спасибо всем за ваши ответы. Похоже, ошибка связана с моим набором данных, а не с моим компьютером (это 8-летний i7 3,5 ГГц с 24 ГБ ОЗУ) или функцией R. У меня никогда не было проблем с регрессиями с меньшими наборами данных. Я экспортировал столбцы, необходимые для регрессии, в файл .csv, а затем импортировал их снова, теперь регрессия также выполняется менее чем за 2 секунды. Если я запускаю регрессию для тех же самых столбцов в моем основном фрейме данных, lm() не работает достаточно странно (он зависает).
Сколько уникальных факторов у вас есть для каждой переменной? Если существует много разных факторов, вы решаете не одну линейную регрессию, а потенциальные десятки тысяч регрессий.
@Dave2e Да, вы правы, одна из переменных была случайно указана как символ вместо фактора. Извините за дилетантскую ошибку.
По-видимому, не должно быть проблемой запустить регрессию на наборе данных примерно из 100 000 наблюдений.
Получив полезные комментарии к основному сообщению, я обнаружил, что одна из независимых переменных, используемых на входе регрессии, была закодирована как символ с помощью следующей команды, чтобы найти тип данных каждого столбца в фрейме данных (df):
str(df)
$ var1 : chr "x1" "x2" "x1" "x1"
$ var2 : Factor w/ 2 levels "factor1" "factor2": 1 1 1 0
$ var3 : Factor w/ 2 levels "factorx" "factory": 0 1 1 0
$ var4 : num 1 8 3 2
Изменение var1 на факторную переменную:
df$var1 <- as.factor(df$var1)
После замены var1 на факторную переменную регрессия действительно выполняется в течение нескольких секунд.
Почему ответ на существующий вопрос вам не подойдет? Это похоже на дубликат, поскольку здесь действительно нет новой информации, которая изменила бы ответы, которые вы уже нашли. Вам просто нужно протестировать свои данные и определить, что работает для вас. Четкого определения понятия «лучший» не существует. Используйте то, что работает для вас.