Более быстрые функции, чем lm() в R

Я пытаюсь запустить базовую модель регрессии в 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() на большом наборе данных в настоящее время?

Почему ответ на существующий вопрос вам не подойдет? Это похоже на дубликат, поскольку здесь действительно нет новой информации, которая изменила бы ответы, которые вы уже нашли. Вам просто нужно протестировать свои данные и определить, что работает для вас. Четкого определения понятия «лучший» не существует. Используйте то, что работает для вас.

MrFlick 30.03.2022 21:24

Можете ли вы объяснить больше, что вы делаете? Я создал поддельные данные, такие как ваши, для n = 100k и запустил вашу строку lm(y..., и это заняло ~ 1 секунду, а n = 10M заняло около 25 секунд. Можете ли вы воспроизвести проблему с поддельными сгенерированными данными?

Jon Spring 30.03.2022 21:32

100 КБ на самом деле не так уж и много, я ожидаю, что lm прекрасно справится с этим, если только вашему процессору не исполнилось 20 лет.

user438383 30.03.2022 21:33

Спасибо всем за ваши ответы. Похоже, ошибка связана с моим набором данных, а не с моим компьютером (это 8-летний i7 3,5 ГГц с 24 ГБ ОЗУ) или функцией R. У меня никогда не было проблем с регрессиями с меньшими наборами данных. Я экспортировал столбцы, необходимые для регрессии, в файл .csv, а затем импортировал их снова, теперь регрессия также выполняется менее чем за 2 секунды. Если я запускаю регрессию для тех же самых столбцов в моем основном фрейме данных, lm() не работает достаточно странно (он зависает).

M1ke 30.03.2022 21:50

Сколько уникальных факторов у вас есть для каждой переменной? Если существует много разных факторов, вы решаете не одну линейную регрессию, а потенциальные десятки тысяч регрессий.

Dave2e 31.03.2022 00:14

@Dave2e Да, вы правы, одна из переменных была случайно указана как символ вместо фактора. Извините за дилетантскую ошибку.

M1ke 01.04.2022 12:06
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По-видимому, не должно быть проблемой запустить регрессию на наборе данных примерно из 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 на факторную переменную регрессия действительно выполняется в течение нескольких секунд.

Другие вопросы по теме