Подтвердить что ты не робот

Крупномасштабная регрессия в R с разреженной матрицей признаков

Я хотел бы сделать крупномасштабную регрессию (линейную/логистическую) в R со многими (например, 100k) функциями, где каждый пример относительно разрежен в пространстве возможностей --- например, ~ 1k ненулевые функции за пример.

Кажется, что SparseM пакет slm должен сделать это, но у меня есть сложность преобразования из формата sparseMatrix в slm -дружественный формат.

У меня есть числовой вектор меток y и sparseMatrix функций X\in {0,1}. Когда я пытаюсь

model <- slm(y ~ X)

Я получаю следующую ошибку:

Error in model.frame.default(formula = y ~ X) : 
invalid type (S4) for variable 'X'

предположительно, потому что slm хочет объект SparseM вместо sparseMatrix.

Есть ли простой способ либо a) заполнить объект SparseM напрямую, либо b) преобразовать объект sparseMatrix в объект SparseM? Или, может быть, есть лучший/более простой способ сделать это?

(я полагаю, что я мог бы явно кодировать решения для линейной регрессии с помощью X и y, но было бы неплохо работать с slm.)

4b9b3361

Ответ 1

Не знаю о SparseM, но пакет MatrixModels имеет невыполненную lm.fit.sparse функцию, которую вы можете использовать. См. ?MatrixModels:::lm.fit.sparse. Вот пример:

Создайте данные:

y <- rnorm(30)
x <- factor(sample(letters, 30, replace=TRUE))
X <- as(x, "sparseMatrix")
class(X)
# [1] "dgCMatrix"
# attr(,"package")
# [1] "Matrix"
dim(X)
# [1] 18 30

Запустите регрессию:

MatrixModels:::lm.fit.sparse(t(X), y)
#  [1] -0.17499968 -0.89293312 -0.43585172  0.17233007 -0.11899582  0.56610302
#  [7]  1.19654666 -1.66783581 -0.28511569 -0.11859264 -0.04037503  0.04826549
# [13] -0.06039113 -0.46127034 -1.22106064 -0.48729092 -0.28524498  1.81681527

Для сравнения:

lm(y~x-1)

# Call:
# lm(formula = y ~ x - 1)
# 
# Coefficients:
#       xa        xb        xd        xe        xf        xg        xh        xj  
# -0.17500  -0.89293  -0.43585   0.17233  -0.11900   0.56610   1.19655  -1.66784  
#       xm        xq        xr        xt        xu        xv        xw        xx  
# -0.28512  -0.11859  -0.04038   0.04827  -0.06039  -0.46127  -1.22106  -0.48729  
#       xy        xz  
# -0.28524   1.81682  

Ответ 2

Запоздалый ответ: glmnet также будет поддерживать разреженные матрицы и обе запрашиваемые модели регрессии. Это может использовать разреженные матрицы, созданные пакетом Matrix. Я советую смотреть в регуляризованные модели через этот пакет. Поскольку редкие данные часто включают в себя очень редкую поддержку некоторых переменных, L1-регуляризация полезна для их выключения из модели. Это часто безопаснее, чем получение некоторых очень ложных оценок параметров для переменных с очень низкой поддержкой.

Ответ 3

glmnet - хороший выбор. Поддерживает L1, L2-регуляризацию для линейной, логистической и мультиномиальной регрессии, среди других опций.

Единственная деталь: у нее нет интерфейса формулы, поэтому вам нужно создать свою модельную матрицу. Но здесь есть преимущество.

Вот псевдо-пример:

library(glmnet)
library(doMC)
registerDoMC(cores=4)

y_train <- class
x_train <- sparse.model.matrix(~ . -1, data=x_train)

# For example for logistic regression using L1 norm (lasso) 
cv.fit <- cv.glmnet(x=x_train, y=y_train, family='binomial', alpha=1, 
                    type.logistic="modified.Newton", type.measure = "auc",
                    nfolds=5, parallel=TRUE)

plot(cv.fit)