Как бороться с идеальным разделением в логистической регрессии?


163

Если у вас есть переменная, которая отлично разделяет нули и единицы в целевой переменной, R выдаст следующее предупреждающее сообщение «идеальное или квази идеальное разделение»:

Warning message:
glm.fit: fitted probabilities numerically 0 or 1 occurred 

Мы все еще получаем модель, но оценки коэффициента завышены.

Как вы справляетесь с этим на практике?


4
связанный вопрос
user603

1
связанный вопрос и демонстрация по регуляризации здесь
Haitao Du

Ответы:


100

Решение этой проблемы заключается в использовании формы наказания регрессии. Фактически, это первоначальная причина, по которой были разработаны некоторые из оштрафованных форм регрессии (хотя, как оказалось, они обладают другими интересными свойствами.

Установите и загрузите пакет glmnet в R, и вы в основном готовы к работе. Одним из менее удобных для пользователя аспектов glmnet является то, что вы можете кормить его только матрицами, а не формулами, к которым мы привыкли. Тем не менее, вы можете посмотреть на model.matrix и тому подобное, чтобы построить эту матрицу из data.frame и формулы ...

Теперь, когда вы ожидаете, что это идеальное разделение является не просто побочным продуктом вашей выборки, но может быть правдой в популяции, вы конкретно не хотите с этим справляться: используйте эту разделяющую переменную просто как единственный предиктор для вашего результата, а не используя модель любого вида.


20
Вы также можете использовать интерфейс формулы для glmnet через пакет caret.
Зак

«Теперь, когда вы ожидаете ...» Вопрос об этом. У меня есть исследование «случай / контроль», изучающее связь с микробиомом. У нас также есть лечение, которое встречается почти только среди пациентов. Тем не менее, мы считаем, что лечение может также повлиять на микробиом. Это пример вашего предостережения? Гипотетически, если бы мы попытались, мы могли бы найти еще больше случаев, когда не использовали лечение, но у нас есть то, что есть.
abalter

142

У вас есть несколько вариантов:

  1. Удалить некоторые из смещения.

    (а) штрафуя вероятность согласно предложению @ Ника. Пакет logistf в R или FIRTHопция в SAS PROC LOGISTICреализуют метод, предложенный в Firth (1993), «Уменьшение смещения оценок максимального правдоподобия», Biometrika , 80 , 1 .; который удаляет смещение первого порядка из оценок максимального правдоподобия. ( Здесь @Gavin рекомендует brglmпакет, с которым я не знаком, но я полагаю, что он реализует аналогичный подход для неканонических функций связи, например, Probit.)

    (б) Используя средне несмещенные оценки в точной условной логистической регрессии. Пакет elrm или logistiX в R, или EXACTутверждение в SAS PROC LOGISTIC.

  2. Исключите случаи, когда происходит предсказание категории или значения, вызывающего разделение. Они вполне могут быть за пределами вашей сферы; или достойны дальнейшего целенаправленного расследования. (Пакет R safeBinaryRegression удобен для их поиска.)

  3. Повторите модель. Как правило, это то, что вы сделали бы заранее, если бы думали об этом, потому что это слишком сложно для вашего размера выборки.

    (а) Удалить предиктор из модели. Dicey, по причинам, указанным @Simon: «Вы удаляете предиктор, который лучше всего объясняет ответ».

    (б) путем свертывания категорий предикторов / объединения значений предикторов. Только если это имеет смысл.

    (c) Повторное выражение предиктора как двух (или более) скрещенных факторов без взаимодействия. Только если это имеет смысл.

  4. Используйте байесовский анализ , как на @ Мануил по предложению . Хотя кажется маловероятным, что вам захочется просто из-за разделения, стоит задуматься о его других достоинствах. Документ, который он рекомендует, - это Gelman et al (2008), « Слабоинформативное предварительное распределение по умолчанию для логистических и других регрессионных моделей», Ann. Appl. Стат. , 2 , 4 : рассматриваемое значение по умолчанию - независимый коэффициент Коши для каждого коэффициента со средним нулем и шкалой ; должен использоваться после стандартизации всех непрерывных предикторов, чтобы иметь среднее значение нуля и стандартное отклонение . Если вы можете выяснить сильно информативные приоры, тем лучше. 15212

  5. Ничего не делать. (Но рассчитайте доверительные интервалы на основе вероятностей профиля, поскольку оценки стандартной ошибки Вальда будут сильно ошибочными.) Часто пропускаемый вариант. Если цель модели - просто описать то, что вы узнали о взаимосвязях между предикторами и реакцией, нет ничего постыдного в цитировании доверительного интервала для отношения шансов, скажем, 2,3 и выше. (Действительно, может показаться странным приводить доверительные интервалы, основанные на непредвзятых оценках, которые исключают отношения шансов, наилучшим образом поддерживаемые данными.) Проблемы возникают, когда вы пытаетесь предсказать, используя точечные оценки, и предиктор, по которому происходит разделение, затмевает другие.

  6. Используйте скрытую модель логистической регрессии, как описано в Rousseeuw & Christmann (2003), «Устойчивость к разделению и выбросам в логистической регрессии», Вычислительная статистика и анализ данных , 43 , 3, и реализовано в пакете R. hlr . (@ user603 предлагает это. ) Я не читал газету, но они говорят в аннотации «предлагается чуть более общая модель, при которой наблюдаемый отклик сильно связан, но не равен ненаблюдаемому истинному отклику», который предлагает мне было бы не очень хорошей идеей использовать метод, если это не звучит правдоподобно.

  7. «Измените несколько случайно выбранных наблюдений с 1 на 0 или с 0 на 1 среди переменных, демонстрирующих полное разделение»: комментарий RobertF . Это предположение, по-видимому, возникает из-за того, что разделение рассматривается как проблема как таковая, а не как признак нехватки информации в данных, что может привести к тому, что вы предпочтете другие методы для оценки максимального правдоподобия или ограничите выводы теми, которые вы можете сделать с помощью разумная точность - подходы, которые имеют свои достоинства и являются не просто «исправлением» для разделения. (Помимо того , что это является бесспорным ad hoc , большинству неприятно, что аналитики, задающие один и тот же вопрос об одних и тех же данных, делая одни и те же предположения, должны давать разные ответы из-за результата броска монеты или чего-либо еще.)


1
@ Scortchi Есть еще один (еретический) вариант. Как насчет изменения нескольких случайно выбранных наблюдений от 1 до 0 или от 0 до 1 среди переменных, демонстрирующих полное разделение?
RobertF

@ РобертФ: Спасибо! Я не думал об этом - если у вас есть какие-либо ссылки на его производительность, я был бы благодарен. Вы сталкивались с людьми, использующими это на практике?
Scortchi

@ Scortchi - Нет, есть ссылки на исследователей, добавляющих искусственные данные, чтобы исключить полное разделение, но я не нашел ни одной статьи о выборочной модификации данных. Я понятия не имею, насколько эффективным будет этот метод.
RobertF

1
@tatami: Не все (многие?) программы предупреждают о разделении как таковом, что может быть непросто обнаружить, когда оно находится на линейной комбинации нескольких переменных, но о сбое сходимости и / или подобранных значениях, близких к нулю или единице - я бы всегда проверяйте это.
Scortchi

2
@ Scortchi: очень хорошее резюме в вашем ответе. Лично я предпочитаю байесовский подход, но стоит упомянуть прекрасный анализ общего явления с частой точки зрения в projecteuclid.org/euclid.ejs/1239716414 . Автор предлагает некоторые односторонние доверительные интервалы, которые можно использовать даже при наличии полного разделения в логистической регрессии.
Cyan

55

Это расширение ответов Scortchi и Manoel, но так как вы, кажется, используете RI, я подумал, что я предоставлю некоторый код. :)

Я считаю, что самым простым и простым решением вашей проблемы является использование байесовского анализа с неинформативными предварительными допущениями, предложенными Gelman et al (2008). Как упоминает Scortchi, Гельман рекомендует ставить Коши с медианой 0,0 и шкалой 2,5 для каждого коэффициента (нормализовано, чтобы иметь среднее значение 0,0 и SD 0,5). Это упорядочит коэффициенты и слегка потянет их к нулю. В этом случае это именно то, что вы хотите. Из-за очень широких хвостов Коши по-прежнему учитывает большие коэффициенты (в отличие от нормалей с короткими хвостами) от Гельмана:

введите описание изображения здесь

Как запустить этот анализ? Используйте bayesglmфункцию в пакете arm, которая реализует этот анализ!

library(arm)

set.seed(123456)
# Faking some data where x1 is unrelated to y
# while x2 perfectly separates y.
d <- data.frame(y  =  c(0,0,0,0, 0, 1,1,1,1,1),
                x1 = rnorm(10),
                x2 = sort(rnorm(10)))

fit <- glm(y ~ x1 + x2, data=d, family="binomial")

## Warning message:
## glm.fit: fitted probabilities numerically 0 or 1 occurred 

summary(fit)
## Call:
## glm(formula = y ~ x1 + x2, family = "binomial", data = d)
##
## Deviance Residuals: 
##       Min          1Q      Median          3Q         Max  
## -1.114e-05  -2.110e-08   0.000e+00   2.110e-08   1.325e-05  
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)
## (Intercept)    -18.528  75938.934       0        1
## x1              -4.837  76469.100       0        1
## x2              81.689 165617.221       0        1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1.3863e+01  on 9  degrees of freedom
## Residual deviance: 3.3646e-10  on 7  degrees of freedom
## AIC: 6
## 
## Number of Fisher Scoring iterations: 25

Не очень хорошо работает ... Теперь байесовская версия:

fit <- bayesglm(y ~ x1 + x2, data=d, family="binomial")
display(fit)
## bayesglm(formula = y ~ x1 + x2, family = "binomial", data = d)
##             coef.est coef.se
## (Intercept) -1.10     1.37  
## x1          -0.05     0.79  
## x2           3.75     1.85  
## ---
## n = 10, k = 3
## residual deviance = 2.2, null deviance = 3.3 (difference = 1.1)

Супер просто, нет?

Рекомендации

Гельман и др. (2008), «Слабо информативное предварительное распределение по умолчанию для логистических и других регрессионных моделей», Ann. Appl. Стат., 2, 4 http://projecteuclid.org/euclid.aoas/1231424214


6
Нет . Слишком просто. Можете ли вы объяснить, что вы только что сделали? Что такое априор, который bayesglmиспользует? Если оценка ML эквивалентна байесовской с плоским предшествованием, как неинформативные приоры могут помочь здесь?
StasK

5
Добавил еще немного информации! Предшественник расплывчатый, но не плоский. Это имеет некоторое влияние, поскольку оно упорядочивает оценки и слегка подтягивает их к 0,0, что, как я полагаю, вам нужно в этом случае.
Расмус Батх

> m = bayesglm (match ~., family = binomial (link = 'logit'), data = df) Предупреждающее сообщение: подогнанные вероятности численно 0 или 1 произошло Не хорошо!
Крис

Для начала попробуйте немного более сильную регуляризацию, увеличивая prior.dfзначения по умолчанию 1.0и / или уменьшая prior.scaleзначения по умолчанию 2.5, возможно, начните пытаться:m=bayesglm(match ~. , family = binomial(link = 'logit'), data = df, prior.df=5)
Rasmus Bååth

1
Что именно мы делаем, когда увеличиваем файл prior.df в модели. Есть ли предел тому, как высоко мы хотим пойти? Насколько я понимаю, что модель ограничивает возможность сходимости с точными оценками ошибки?
Hamilthj

7

Одним из наиболее полных объяснений проблем «квазиполного разделения», по всей вероятности, является статья Пола Эллисона. Он пишет о программном обеспечении SAS, но проблемы, которые он решает, распространяются на любое программное обеспечение:

  • Полное разделение происходит всякий раз, когда линейная функция x может генерировать точные предсказания y

  • Квази-полное разделение происходит, когда (a) существует некоторый вектор коэффициентов b, такой что bxi ≥ 0, когда yi = 1 , и bxi ≤ 0 *, когда ** yi = 0, и это равенство выполняется по крайней мере для одного случая в каждой категории зависимая переменная. Другими словами, в простейшем случае для любой дихотомической независимой переменной в логистической регрессии, если в таблице 2 × 2, образованной этой переменной и зависимой переменной, есть ноль, оценка ML для коэффициента регрессии не существует.

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

http://www2.sas.com/proceedings/forum2008/360-2008.pdf


3

Для логистических моделей для вывода важно сначала подчеркнуть, что здесь нет ошибок. Значение warningin R правильно информирует вас о том, что оценка максимального правдоподобия лежит на границе пространства параметров. Отношение шансов сильно наводит на мысль об ассоциации. Единственная проблема заключается в том, что два распространенных метода создания тестов: тест Вальда и тест отношения правдоподобия требуют оценки информации в рамках альтернативной гипотезы.

С данными, сгенерированными в соответствии с

x <- seq(-3, 3, by=0.1)
y <- x > 0
summary(glm(y ~ x, family=binomial))

Предупреждение сделано:

Warning messages:
1: glm.fit: algorithm did not converge 
2: glm.fit: fitted probabilities numerically 0 or 1 occurred 

что очень очевидно отражает зависимость, которая встроена в эти данные.

В R тест Вальда находится с summary.glmили с waldtestв lmtestупаковке. Проверка отношения правдоподобия выполняется с anovaили lrtestв lmtestупаковке. В обоих случаях информационная матрица бесконечно ценится, и нет доступных выводов. Скорее всего , R делает производить вывод, но вы не можете доверять. Вывод, который R обычно производит в этих случаях, имеет значения p, очень близкие к единице. Это связано с тем, что потеря точности в операционной на порядки меньше, чем потеря точности в матрице дисперсии и ковариации.

Некоторые решения изложены здесь:

Используйте одноступенчатую оценку,

Существует множество теорий, подтверждающих низкое смещение, эффективность и обобщаемость одношаговых оценок. Легко указать одношаговую оценку в R, и результаты, как правило, очень благоприятны для прогнозирования и вывода. И эта модель никогда не будет расходиться, потому что итератор (Ньютон-Рафсон) просто не имеет возможности сделать это!

fit.1s <- glm(y ~ x, family=binomial, control=glm.control(maxit=1))
summary(fit.1s)

дает:

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) -0.03987    0.29569  -0.135    0.893    
x            1.19604    0.16794   7.122 1.07e-12 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Таким образом, вы можете увидеть, что прогнозы отражают направление тренда. И вывод весьма наводит на мысль о тенденциях, которые мы считаем истинными.

введите описание изображения здесь

выполнить тест оценки,

Счет (или Рао) статистика отличается от отношения вероятности и статистики Wald. Это не требует оценки дисперсии согласно альтернативной гипотезе. Подгоняем модель под нуль:

mm <- model.matrix( ~ x)
fit0 <- glm(y ~ 1, family=binomial)
pred0 <- predict(fit0, type='response')
inf.null <- t(mm) %*% diag(binomial()$variance(mu=pred0)) %*% mm
sc.null <- t(mm) %*% c(y - pred0)
score.stat <- t(sc.null) %*% solve(inf.null) %*% sc.null ## compare to chisq
pchisq(score.stat, 1, lower.tail=F)

Дает в качестве меры ассоциации очень сильную статистическую значимость. Обратите внимание на то, что оценщик за один шаг выдает тестовую статистику равную 50,7, а тест оценки здесь производит тестовую статистику pf 45,75.χ2

> pchisq(scstat, df=1, lower.tail=F)
             [,1]
[1,] 1.343494e-11

В обоих случаях вы делаете вывод об ИЛИ бесконечности.

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

Вы можете получить медианную несмещенную, не единственную 95% -ную ДИ для отношения бесконечных шансов, используя медианную несмещенную оценку. Пакет epitoolsв R может сделать это. И я привожу пример реализации этой оценки здесь: доверительный интервал для выборки Бернулли


2
Это здорово, но у меня, конечно, есть некоторые придирки: (1) критерий отношения правдоподобия не использует информационную матрицу; это только тест Уолда, который проваливается катастрофически при наличии разделения. (2) Я совсем не знаком с одношаговыми оценками, но оценка наклона здесь кажется абсурдно низкой. (3) Доверительный интервал не является несмещенным по медиане. В этом разделе вы ссылаетесь на средний доверительный интервал. (4) Вы можете получить доверительные интервалы, инвертируя LR или результаты тестов. ...
Scortchi

... (5) Вы можете выполнить тест оценки в R, давая аргумент test="Rao"к anovaфункции. (Ну, последние два - заметки, а не придирки.)
Scortchi

@ scortchi хорошо знать, что у anova есть тесты по умолчанию! Может быть, ручная реализация полезна. КИ не являются непредвзятыми по медиане, но КИ по несмещенным оценкам по медиане обеспечивают последовательный вывод для граничных параметров. Середина р является такой оценкой. P может быть преобразовано в отношение шансов b / c, оно инвариантно к преобразованиям один к одному. Является ли тест LR согласованным для граничных параметров?
AdamO

Только нулевая гипотеза не должна содержать параметров на границе для применения теоремы Уилкса, хотя тесты оценки и LR являются приблизительными в конечных выборках.
Scortchi

2

Будьте осторожны с этим предупреждающим сообщением от R. Посмотрите на это сообщение в блоге Эндрю Гельмана, и вы увидите, что это не всегда проблема идеального разделения, а иногда и ошибка glm. Кажется, что, если начальные значения слишком далеки от оценки максимального правдоподобия, это взрывается. Итак, проверьте сначала с другим программным обеспечением, таким как Stata.

Если у вас действительно есть эта проблема, вы можете попробовать использовать байесовское моделирование с информативными априорами.

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


8
Проблема с удалением предикторов заключается в том, что вы удаляете предиктор, который лучше всего объясняет ответ, как правило, это то, что вы хотите сделать! Я бы сказал, что это имеет смысл только в том случае, если вы подгоняете свою модель, например, устанавливая слишком много сложных взаимодействий.
Саймон Бирн

4
Не ошибка, а проблема с начальными оценками, находящимися слишком далеко от MLE, которые не возникнут, если вы не попытаетесь выбрать их самостоятельно.
Scortchi

Я понимаю это, но я думаю, что это ошибка в алгоритме.
Маноэль Гальдино

5
Ну, я не хочу спорить об определении «ошибка». Но поведение не является ни непостижимым, ни неразрешимым в базе R - вам не нужно «сверяться с другим программным обеспечением». Если вы хотите автоматически решать многие проблемы, не связанные с конвергенцией, glm2пакет реализует проверку того, что вероятность фактически увеличивается на каждом шаге оценки, и вдвое уменьшает размер шага, если это не так.
Scortchi

3
Существует (на CRAN) пакет R, safeBinaryRegression который предназначен для диагностики и устранения таких проблем, используя методы оптимизации, чтобы точно проверить, есть ли разделение или квазисепарация. Попробуй!
kjetil b halvorsen

2

Я не уверен, что согласен с утверждениями в вашем вопросе.

Я думаю, что предупреждающее сообщение означает, что для некоторого наблюдаемого уровня Х в ваших данных подобранная вероятность численно равна 0 или 1. Другими словами, при разрешении оно отображается как 0 или 1.

Вы можете запустить, predict(yourmodel,yourdata,type='response')и вы найдете 0 или / и 1 там как прогнозируемые вероятности.

В результате, я думаю, что можно просто использовать результаты.


-1

Я понимаю, что это старый пост, однако я все равно продолжу отвечать на него, поскольку я боролся с ним несколько дней, и он может помочь другим.

Полное разделение происходит, когда выбранные вами переменные, соответствующие модели, могут очень точно различать 0 и 1 или да и нет. Весь наш подход к науке о данных основан на оценке вероятности, но в этом случае он терпит неудачу.

Шаги выпрямления: -

  1. Используйте bayesglm () вместо glm (), если разница между переменными мала

  2. Иногда использование (maxit = ”некоторое числовое значение”) вместе с bayesglm () может помочь

3. Третья и самая важная проверка выбранных переменных для подгонки модели, должна быть переменная, для которой мультиколлинеарность с переменной Y (outout) очень высока, отбросьте эту переменную из вашей модели.

Как и в моем случае, у меня были данные оттока телекоммуникаций, чтобы предсказать отток данных валидации. У меня была переменная в моих тренировочных данных, которая могла очень различать между да и нет. После того, как я уронил его, я смог получить правильную модель. Более того, вы можете использовать пошаговую (подгонку), чтобы сделать вашу модель более точной.


2
Я не вижу, что этот ответ добавляет много к дискуссии. Байесовский подход подробно описан в предыдущих ответах, удаление «проблемных» предикторов также уже упоминалось (и не рекомендуется). Насколько я знаю, пошаговый выбор переменных редко является отличной идеей.
Эйнар
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.