Модель работает с glm, но не с bigglm

#r #glm #logistic-regression

#r #glm #логистическая регрессия

Вопрос:

Я пытался выполнить логистическую регрессию для 320 000 строк данных (6 переменных). Пошаговый выбор модели на выборке данных (10000) дает довольно сложную модель с 5 условиями взаимодействия : Y~X1 X2*X3 X2*X4 X2*X5 X3*X6 X4*X5 . glm() Функция может соответствовать этой модели с 10000 строками данных, но не со всем набором данных (320 000).

Использование bigglm для чтения данных по частям с сервера SQL привело к ошибке, и я не смог понять результаты из traceback() :

 fit <- bigglm(Y~X1  X2*X3  X2*X4  X2*X5  X3*X6  X4*X5, 
       data=sqlQuery(myconn,train_dat),family=binomial(link="logit"), 
       chunksize=1000, maxit=10)

Error in coef.bigqr(object$qr) : 
NA/NaN/Inf in foreign function call (arg 3)

> traceback()
11: .Fortran("regcf", as.integer(p), as.integer(p * p/2), bigQR$D, 
    bigQR$rbar, bigQR$thetab, bigQR$tol, beta = numeric(p), nreq = as.integer(nvar), 
    ier = integer(1), DUP = FALSE)
10: coef.bigqr(object$qr)
9: coef(object$qr)
8: coef.biglm(iwlm)
7: coef(iwlm)
6: bigglm.function(formula = formula, data = datafun, ...)
5: bigglm(formula = formula, data = datafun, ...)
4: bigglm(formula = formula, data = datafun, ...)
  

bigglm удалось установить меньшую модель с меньшим количеством условий взаимодействия. но bigglm не смог подогнать ту же модель к небольшому набору данных (10000 строк).

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

Ответ №1:

Я сталкивался с этой проблемой много раз, и это всегда было вызвано тем фактом, что фрагменты, обрабатываемые bigglm, не содержали всех уровней в категориальной (факторной) переменной.

bigglm разбивает данные на блоки, а размер блока по умолчанию равен 5000. Если у вас есть, скажем, 5 уровней в вашей категориальной переменной, например (a, b, c, d, e) и в вашем первом фрагменте (из 1: 5000) содержится только (a, b, c, d), но нет «e», вы получите эту ошибку.

Что вы можете сделать, так это увеличить размер аргумента «размер фрагмента» и / или разумно изменить порядок вашего фрейма данных, чтобы каждый фрагмент содержал ВСЕ уровни.

надеюсь, это поможет (хотя бы кому-то)

Комментарии:

1. Есть какие-нибудь подсказки о простом способе сделать умное переупорядочение?

Ответ №2:

Итак, мы смогли найти причину этой проблемы:

для одной категории в одном из условий взаимодействия нет наблюдения. функция «glm» смогла запуститься и предоставить «NA» в качестве расчетного коэффициента, но «bigglm» это не нравится. «bigglm» смог запустить модель, если я отброшу этот термин взаимодействия.

Я проведу дополнительные исследования о том, как справиться с такой ситуацией.

Комментарии:

1. вероятно, вы могли бы просто попробовать data=na.omit(qlQuery(myconn,train_dat))

2. Спасибо, Бен. Я пробовал, это не работает. Поскольку na.omit устраняет любые NAs в моих данных. но проблема не в моих данных. Проблема в том, что «bigglm» не может оценить коэффициент для одной категории. Например, X1 имеет три уровня (1,2,3), X2 имеет два уровня (1,2). но нет никаких наблюдений с атрибутами X1-2 и X2-2. таким образом, оценка для этого атрибута будет NA. это нормально, но почему-то «bigglm» вообще не будет выполняться.

3. это называется недостатком ранга — я не знаю, как с этим справиться, bigglm но, по крайней мере, вы знаете, по какому ключевому слову искать.

4. небольшой поиск не вызывает никаких очевидных обсуждений. Это может быть сложно — возможно, даже стоит связаться biglm с сопровождающими.

5. Спасибо, Бен! Я опубликую здесь снова, если в итоге свяжусь с сопровождающими.

Ответ №3:

Я встречал эту ошибку раньше, думал, что она из randomForest вместо biglm. Причиной может быть то, что функция не может обрабатывать символьные переменные, поэтому вам нужно преобразовать символы в коэффициенты. Надеюсь, это может вам помочь.

Комментарии:

1. вероятно, это должен быть комментарий, а не ответ.

2. Спасибо, Йоки. У меня есть все переменные number или factor, без символа. но ваш ответ помог нам найти причину этой проблемы (см. Ниже). Еще раз спасибо.