Ошибка памяти при использовании коэффициента для регрессии с фиксированным эффектом - PullRequest
1 голос
/ 23 февраля 2020

Я работаю с данными с 900 000 наблюдений. Существует категориальная переменная x с уникальным значением 966, которую необходимо использовать в качестве фиксированных эффектов. Я включаю фиксированные эффекты, используя factor(x) в регрессии. Это дает мне такую ​​ошибку

Ошибка: невозможно выделить вектор размером 6,9 Гб

Как исправить эту ошибку? или мне нужно сделать что-то другое в регрессии для фиксированных эффектов?

Тогда, как мне запустить регрессию следующим образом:

rlm(y~x+ factor(fe), data=pd)

1 Ответ

1 голос
/ 23 февраля 2020

Множество фиктивных переменных, построенных из фактора, имеет очень низкое информационное содержание. Например, рассматривая только столбцы вашей модельной матрицы, соответствующие вашему категориальному предиктору уровня 966, каждая строка содержит ровно один ноль 1 и 965.

Таким образом, вы обычно можете сохранить лот из памяти путем построения матрицы разреженных моделей с использованием Matrix::sparse.model.matrix() (или MatrixModels::model.Matrix(*, sparse=TRUE), как предлагается в документации sparse.model.matrix). Однако, чтобы использовать это, необходимо, чтобы какой-либо механизм регрессии, который вы используете, принимал матрицу модели + вектор ответа, а не требовал формулы (например, для выполнения линейной регрессии вам потребуется sparse.model.matrix + lm.fit, а не возможность использовать lm).

В отличие от оценки @ RuiBarradas 3,5 Гб для плотной модельной матрицы:

m <- Matrix::sparse.model.matrix(~x,
     data=data.frame(x=factor(sample(1:966,size=9e5,replace=TRUE))))
format(object.size(m),"Mb")
## [1] "75.6 Mb"

Если вы используете функцию rlm из MASS package, что-то вроде этого должно работать:

library(Matrix)
library(MASS)
mm <- sparse.model.matrix(~x + factor(fe), data=pd)
rlm(y=pd$y, x=mm, ...)

Обратите внимание, что я на самом деле не проверял это (вы не приводили воспроизводимый пример); это, по крайней мере, поможет вам пройти этап создания матрицы модели, но я не знаю, выполнит ли rlm() какие-либо внутренние вычисления, которые сломают и / или сделают матрицу модели не разреженной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...