#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, без символа. но ваш ответ помог нам найти причину этой проблемы (см. Ниже). Еще раз спасибо.