Як боротися з ідеальним розділенням при логістичній регресії?


163

Якщо у вас є змінна, яка ідеально відокремлює нулі та цілі в цільовій змінній, R видасть таке попереджувальне повідомлення "ідеальне або квазідосконале розділення":

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

Ми все ще отримуємо модель, але оцінки коефіцієнтів завищені.

Як ви з цим справляєтесь на практиці?


4
пов'язане запитання
user603

1
пов'язане питання та демонстрація щодо регуляризації тут
Haitao Du

Відповіді:


100

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

Встановіть і завантажте glmnet пакета в R, і ви здебільшого готові до роботи. Одним із менш зручних для користувачів аспектів glmnet є те, що ви можете подавати лише матриці, а не формули, як ми звикли. Однак ви можете подивитися на model.matrix тощо, щоб побудувати цю матрицю з фрейму даних та формули ...

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


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

"Тепер, коли ви очікуєте ..." Питання щодо цього. У мене є випадок / контрольне дослідження, що стосується взаємодії з мікробіомом. Також у нас є лікування, яке майже зустрічається лише серед випадків. Однак, ми вважаємо, що лікування також може вплинути на мікробіом. Це приклад вашого застереження? Гіпотетично ми могли б знайти ще багато випадків, коли не застосовували лікування, якщо б спробували, але у нас є те, що ми маємо.
abalter

142

У вас є кілька варіантів:

  1. Видаліть частину зміщення.

    (а) Штрафуючи ймовірність відповідно до пропозиції Ніка. Пакет logistf в R або FIRTHваріант у SAS PROC LOGISTICреалізувати метод, запропонований у Firth (1993), "Зменшення зміщення максимальних оцінок імовірності", Biometrika , 80 , 1; що усуває упередження першого порядку від максимальних оцінок вірогідності. ( Тут @Gavin рекомендує brglmпакет, з яким я не знайомий, але я вважаю, він реалізує подібний підхід для неканонічних функцій зв'язку, наприклад probit.)

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

  2. Виключіть випадки, коли виникає категорія або значення предиктора, що спричиняє поділ. Вони цілком можуть виходити за рамки вашої сфери; або гідні подальшого цілеспрямованого розслідування. ( RB- пакет safeBinaryRegression зручний для їх пошуку.)

  3. Повторно відкиньте модель. Як правило, це було б зроблено заздалегідь, якби ви задумалися над цим, оскільки це занадто складно для вашого розміру вибірки.

    (а) Вилучіть прогнозник із моделі. Діссі, з причин, поданих @Simon: "Ви видаляєте предиктора, який найкраще пояснює відповідь".

    (b) Згортанням категорій предиктора / скороченням значень предиктора. Тільки якщо це має сенс.

    (c) повторне вираження предиктора як двох (або більше) схрещених факторів без взаємодії. Тільки якщо це має сенс.

  4. 5212

  5. Нічого не робити. (Але обчислюйте довірчі інтервали на основі ймовірності профілю, оскільки оцінки Wald щодо стандартної помилки сильно помиляються.) Варіант, який часто переглядають. Якщо мета цієї моделі полягає лише в тому, щоб описати те, що ви дізналися про взаємозв’язки між прогнозаторами та реакцією, немає сорому в тому, щоб цитувати довірчий інтервал для коефіцієнта шансів, скажімо, на 2,3 вище. (Дійсно, може здатися, що цитувати інтервали довіри на основі неупереджених оцінок, що виключають коефіцієнт шансів, що найкраще підтримується даними.) Проблеми виникають, коли ви намагаєтесь передбачити використання точкових оцінок, і прогноктор, на який відбувається поділ, переповнює інші.

  6. Використовуйте приховану логістичну регресійну модель, як описано в Rousseeuw & Christmann (2003), "Надітність проти відокремленості та випадок у логістичній регресії", " Обчислювальна статистика та аналіз даних" , 43 , 3, та впроваджена в пакет R hlr . (@ user603 пропонує це. ) Я не читав статтю, але вони говорять в рефераті: "запропонована трохи більш загальна модель, згідно з якою спостережувана відповідь сильно пов'язана, але не дорівнює непомітній справжній відповіді", яка пропонує мені, можливо, це не буде гарною ідеєю використовувати метод, якщо це не здається правдоподібним.

  7. "Змініть декілька випадково вибраних спостережень з 1 на 0 або 0 на 1 серед змінних, що демонструють повне розділення": @ коментар RobertF . Ця пропозиція, як видається, виникає з розгляду розлуки як проблеми як такої, а не як симптому нестачі інформації в даних, що може призвести до того, що ви віддаєте перевагу іншим методам оцінки максимальної ймовірності або обмежуєте умовиводи тим, з ким ви можете зробити розумна точність - підходи, які мають власні достоїнства & є не просто "виправленнями" розлуки. (Окрім того , що вона є безсумнівною спеціальною , для більшості це неприємно, що аналітики, які задають одне й те саме запитання одних і тих же даних, роблячи ті самі припущення, повинні давати різні відповіді через результат кидання монети чи будь-чого іншого.)


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

@RobertF: Дякую! Я не думав про це - якщо у вас є якісь посилання на його виконання, я буду вдячний. Чи натрапили ви на людей, які використовують це на практиці?
Scortchi

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

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

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

55

Це розширення відповідей Скортчі та Маноеля, але, оскільки ви, здається, використовуєте RI, думав, що я поставлю якийсь код. :)

Я вважаю, що найпростішим і найпростішим рішенням вашої проблеми є використання байєсівського аналізу з попередніми неінформативними припущеннями, як це запропонували Gelman et al (2008). Як згадує Скортчі, Гельман рекомендує поставити Коші попередньо з середньою 0,0 та шкалою 2,5 на кожен коефіцієнт (нормалізується, щоб було середнє значення 0,0 і SD 0,5). Це дозволить регулювати коефіцієнти і трохи потягне їх до нуля. У цьому випадку це саме те, що ви хочете. Завдяки дуже широким хвостиком Коші все ще дозволяє отримати великі коефіцієнти (на відміну від короткого хвоста Нормального), від Гельмана:

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

Як запустити цей аналіз? Використовуйте bayesglmфункцію в пакеті, який реалізує цей аналіз!

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)

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

Список літератури

Gelman et al (2008), "Слабо інформативний попередній розподіл за замовчуванням для логістичних та інших регресійних моделей", Енн. Додаток Стат., 2, 4 http://projecteuclid.org/euclid.aoas/1231424214


6
Ні. Занадто просто. Чи можете ви пояснити, що ви тільки що зробили? Що є попереднім, що bayesglmвикористовує? Якщо оцінка ML еквівалентна байєсівській з рівнем попереднього, як тут допомагають неінформативні пріори?
Стаск

5
Додано ще трохи інформації! Попередній розпливчастий, але не рівний. Це має певний вплив, оскільки воно регулює оцінки і трохи підтягує їх до 0,0, що я вважаю, що ви хочете в цьому випадку.
Rasmus Bååth,

> 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

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

Еллісон обговорює багато згаданих рішень, включаючи видалення змінних проблем, руйнування категорій, нічого не роблячи, використовуючи точну логістичну регресію, байєсівську оцінку та пеналізовану оцінку максимальної ймовірності.

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


3

warning

З даними, згенерованими за рядками

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 тест Wald знайдений з пакетом 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

Таким чином, ви можете бачити, що прогнози відображають напрямок тенденції. І висновок дуже вказує на тенденції, які ми вважаємо правдивими.

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

виконати бальний тест,

Статистика (або Rao) відрізняється від коефіцієнта ймовірності та статистики вальд. Він не вимагає оцінки дисперсії за альтернативною гіпотезою. Ми підходимо під нуль:

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)

χ2

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

В обох випадках у вас є висновок про АБО нескінченності.

та використовувати медіанні об'єктивні оцінки для довірчого інтервалу.

За допомогою коефіцієнта нескінченних шансів ви можете створити медіанний неупереджений, несингулярний 95% ІС для коефіцієнта нескінченних шансів. Пакет epitoolsв R може це зробити. І я наводжу приклад реалізації цього оцінювача тут: Інтервал довіри для вибірки Бернуллі


2
Це чудово, але, звичайно, у мене є деякі підказки: (1) Тест коефіцієнта ймовірності не використовує інформаційну матрицю; це лише тест Уолда, який & катастрофічно провалюється за наявності розлуки. (2) Я взагалі не знайомий з одномоментними оцінками, але оцінка нахилу тут здається абсурдно низькою. (3) Інтервал довіри не є медіа-неупередженим. Що ви посилаєтесь у цьому розділі, це довірчий інтервал середнього рівня p. (4) Ви можете отримати довірчі інтервали, перевернувши LR або оцінюючи тести. ...
Scortchi

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

@scortchi Добре знати, що у Anova є тести за замовчуванням! Можливо, власна реалізація корисна. КІ не є медіаном неупередженими, але КІ для медіанного неупередженого оцінювача забезпечують послідовне висновок для граничних параметрів. Середина р - такий оцінювач. Р може бути перетворений на коефіцієнт шансів 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

Я не впевнений, що я згоден із твердженнями у вашому запитанні.

Я думаю, що попереджувальне повідомлення означає, що для деякого із спостережуваних рівнів X у ваших даних встановлена ​​ймовірність чисельно дорівнює 0 або 1. Іншими словами, у роздільній здатності вона відображається як 0 або 1.

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

Як результат, я думаю, що нормально просто використовувати результати.


-1

Я розумію, що це старий пост, проте я все одно продовжуватиму відповідати на це, оскільки я боровся з ним кілька днів, і він може допомогти іншим.

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

Крок виправлення: -

  1. Використовуйте bayesglm () замість glm (), якщо на випадок дисперсія між змінними є низькою

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

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

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


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