Почему логистическая регрессия становится нестабильной, когда классы хорошо разделены?

34

Почему логистическая регрессия становится нестабильной, когда классы хорошо разделены? Что значит хорошо разделенные классы? Я был бы очень признателен, если бы кто-то мог объяснить на примере.

Джейн Доу
источник
4
Я объясняю подробно, с доказательством, здесь: stats.stackexchange.com/questions/224863/…
Мэтью Друри
2
И у меня также была некоторая демонстрационная версия, чтобы объяснить вопрос: stats.stackexchange.com/questions/239928/…
Du

Ответы:

31

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

Так что есть действительно разные случаи, которые нужно лечить. Во-первых, какова цель анализа? Если конечным результатом анализа является некоторая классификация случаев, разделение вообще не является проблемой, это действительно означает, что существуют очень хорошие переменные, дающие очень хорошую классификацию. Но если целью является оценка риска, нам нужны оценки параметров, а с разделением обычных оценок mle (максимального правдоподобия) не существует. Таким образом, мы должны изменить метод оценки, может быть. В литературе есть несколько предложений, я к этому еще вернусь.

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

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

  1. регуляризация, например, ридж или лассо, может сочетаться с бутстрапом.
  2. точная условно-логистическая регрессия
  3. тесты перестановок, см. https://www.ncbi.nlm.nih.gov/pubmed/15515134
  4. Процедура оценки Фертса с уменьшенным смещением, см. Модель логистической регрессии не сходится
  5. конечно, другие ...

Если вы используете R, в CRAN есть пакет, SafeBinaryRegressionкоторый помогает диагностировать проблемы с разделением, используя математические методы оптимизации, чтобы убедиться, что есть разделение или квазисепарация! Далее я приведу смоделированный пример с использованием этого пакета и elrmпакета для приблизительной условной логистической регрессии.

Во-первых, простой пример с safeBinaryRegressionпакетом. Этот пакет просто переопределяет glmфункцию, перегружая ее тестом разделения, используя методы линейного программирования. Если он обнаруживает разделение, он завершается с ошибкой, заявляя, что mle не существует. В противном случае он просто запускает обычную glmфункцию из stats. Пример взят со страниц справки:

library(safeBinaryRegression)   # Some testing of that package,
                                # based on its examples
# complete separation:
x  <-  c(-2, -1, 1, 2)
y  <-  c(0, 0, 1, 1)
glm(y ~ x, family=binomial)
glm(y ~ x,  family=binomial,  separation="test")
stats::glm(y~ x, family=binomial)
# Quasicomplete separation:
x  <-  c(-2, 0, 0, 2)
y  <-  c(0, 0, 1, 1)
glm(y ~ x, family=binomial)
glm(y ~ x,  family=binomial,  separation="test")
stats::glm(y~ x, family=binomial)

Выход из его запуска:

> # complete separation:
> x  <-  c(-2, -1, 1, 2)
> y  <-  c(0, 0, 1, 1)
> glm(y ~ x, family=binomial)
Error in glm(y ~ x, family = binomial) : 
  The following terms are causing separation among the sample points: (Intercept), x
> glm(y ~ x,  family=binomial,  separation="test")
Error in glm(y ~ x, family = binomial, separation = "test") : 
  Separation exists among the sample points.
    This model cannot be fit by maximum likelihood.
> stats::glm(y~ x, family=binomial)

Call:  stats::glm(formula = y ~ x, family = binomial)

Coefficients:
(Intercept)            x  
 -9.031e-08    2.314e+01  

Degrees of Freedom: 3 Total (i.e. Null);  2 Residual
Null Deviance:      5.545 
Residual Deviance: 3.567e-10    AIC: 4
Warning message:
glm.fit: fitted probabilities numerically 0 or 1 occurred 
> # Quasicomplete separation:
> x  <-  c(-2, 0, 0, 2)
> y  <-  c(0, 0, 1, 1)
> glm(y ~ x, family=binomial)
Error in glm(y ~ x, family = binomial) : 
  The following terms are causing separation among the sample points: x
> glm(y ~ x,  family=binomial,  separation="test")
Error in glm(y ~ x, family = binomial, separation = "test") : 
  Separation exists among the sample points.
    This model cannot be fit by maximum likelihood.
> stats::glm(y~ x, family=binomial)

Call:  stats::glm(formula = y ~ x, family = binomial)

Coefficients:
(Intercept)            x  
  5.009e-17    9.783e+00  

Degrees of Freedom: 3 Total (i.e. Null);  2 Residual
Null Deviance:      5.545 
Residual Deviance: 2.773    AIC: 6.773

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

pl  <-  function(a, b, x) 1/(1+exp(-a-b*x))
a  <-  0
b  <-  1.5
x_cutoff  <-  uniroot(function(x) pl(0,1.5,x)-0.98,lower=1,upper=3.5)$root
### circa 2.6
pltrue  <-  function(a, b, x) ifelse(x < x_cutoff, pl(a, b, x), 1.0)

x <- -3:3

### Let us simulate many times from this model,  and try to estimate it
### with safeBinaryRegression::glm  That way we can estimate the probability
### of separation from this model

set.seed(31415926)  ### May I have a large container of coffee 
replications  <-  1000
p  <-  pltrue(a, b, x)
err  <-  0
good  <- 0

for (i in 1:replications) {
    y  <- rbinom(length(x), 1, p)
    res  <-  try(glm(y~x, family=binomial), silent=TRUE)
    if (inherits(res,"try-error")) err <-  err+1 else good <- good+1
}
P_separation  <-  err/replications
P_separation

При выполнении этого кода мы оцениваем вероятность разделения как 0,759. Запустите код самостоятельно, это быстро!

Затем мы расширяем этот код, чтобы попробовать различные процедуры оценки, mle и приблизительную условную логистическую регрессию от elrm. Запуск этого моделирования займет около 40 минут на моем компьютере.

library(elrm)  # from CRAN
set.seed(31415926)  ### May I have a large container of coffee
replications  <-  1000
GOOD  <-  numeric(length=replications) ### will be set to one when MLE exists!
COEFS <- matrix(as.numeric(NA), replications, 2)
COEFS.elrm <- matrix(as.numeric(NA), replications, 2) # But we'll only use second col for x
p  <-  pltrue(a, b, x)
err  <-  0
good  <- 0

for (i in 1:replications) {
    y  <- rbinom(length(x), 1, p)
    res  <-  try(glm(y~x, family=binomial), silent=TRUE)
    if (inherits(res,"try-error")) err <-  err+1 else{ good <- good+1
                                                     GOOD[i] <- 1 }
    # Using stats::glm
    mod  <-  stats::glm(y~x, family=binomial)
    COEFS[i, ]  <-  coef(mod)
    # Using elrm:
    DATASET  <-  data.frame(x=x, y=y, n=1)
    mod.elrm  <-  elrm(y/n ~ x,  interest= ~ x -1, r=4, iter=10000, burnIn=1000,
                       dataset=DATASET)
    COEFS.elrm[i, 2 ]  <-  mod.erlm$coeffs       
}
### Now we can compare coefficient estimates of x,
###  when there are separation,  and when not:

non  <-  which(GOOD==1)
cof.mle.non  <-  COEFS[non, 2, drop=TRUE]
cof.mle.sep  <-  COEFS[-non, 2, drop=TRUE]
cof.elrm.non  <-  COEFS.elrm[non, 2, drop=TRUE]
cof.elrm.sep  <-  COEFS.elrm[-non, 2, drop=TRUE]

Теперь мы хотим построить результаты, но перед этим отметим, что ВСЕ условные оценки равны! Это действительно странно и нуждается в объяснении ... Общее значение 0,9523975. Но, по крайней мере, мы получили конечные оценки с доверительными интервалами, которые содержат истинное значение (здесь не показано). Поэтому я покажу только гистограмму оценок mle в случаях без разделения:

hist(cof.mle.non, prob=TRUE)

[гистограмма смоделированных оценок параметров [1]

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

Къетил б Халворсен
источник
Некоторые соответствующие ссылки: andrewgelman.com/2014/02/06/... jstor.org/stable/20640647?seq=1#page_scan_tab_contents 2011.isiproceedings.org/papers/950654.pdf
Кьетил б Халворсеном
1
(+1) Но довольно убедительно сказать, что нам нужна процедура оценки, отличная от максимальной вероятности. Бесконечные отношения шансов и шансов могут быть разумными точечными оценками; достаточно часто проблема, вызванная разделением, заключается просто в получении хороших интервальных оценок.
Scortchi - Восстановить Монику
@kjetilbhalvorsen Извиняюсь за возрождение старого потока, но мне было интересно, знаете ли вы о подобном пакете в python?
Мип
Извините, но я не знаю о питоне. Но должно быть возможно запустить R изнутри python.
kjetil b halvorsen
25

Здесь есть хорошие ответы от @ sean501 и @kjetilbhalvorsen. Вы просили пример. Посмотрите на рисунок ниже. Вы можете встретить некоторые ситуации , в которой процесс генерирования данных подобен изображенному на панели A . Если это так, то вполне возможно , что данные , которые вы на самом деле собираетесь выглядеть , как на панели B . Теперь, когда вы используете данные для построения статистической модели, идея состоит в том, чтобы восстановить истинный процесс генерирования данных или, по крайней мере, придумать приблизительное приближение. Таким образом, вопрос в том, даст ли логистическая регрессия для данных в B модель, которая приближается к синей линии в A ? Если вы посмотрите на панель CВы можете видеть, что серая линия лучше приближает данные, чем истинная функция, поэтому при поиске наилучшего соответствия логистическая регрессия «предпочтет» вернуть серую линию, а не синюю. Это не останавливается там, как бы то ни было. Глядя на панель Dчерная линия лучше аппроксимирует данные, чем серая - на самом деле это наилучшее совпадение, которое может произойти. Такова линия, которую преследует модель логистической регрессии. Это соответствует пересечению отрицательной бесконечности и наклону бесконечности. Это, конечно, очень далеко от истины, которую вы надеетесь восстановить. Полное разделение может также вызвать проблемы с вычислением p-значений для ваших переменных, которые стандартно поставляются с выводом логистической регрессии (объяснение здесь немного другое и более сложное). Более того, попытка объединить это соответствие с другими попытками, например, с метаанализом, просто сделает другие выводы менее точными.

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

Gung - Восстановить Монику
источник
1
(+1) Это очень полезная иллюстрация проблемы.
mkt - Восстановить Монику
Один интересный аспект, который показывает ваша диаграмма, заключается в том, что в идеале вы хотите, чтобы выборка исходила из «пространства x», что приводит к 50-50 вероятностям (например, точкам в диапазоне 12 <x <15). на самом деле я думаю, что вы, вероятно, захотите собрать больше данных из этого среднего региона (10 <x <17) в реальном сценарии, который обеспечил этот результат.
вероятностная
@probabilityislogic, это верно. Большая часть информации об отношениях находится в данных из среднего региона.
gung - Восстановить Монику
10

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

seanv507
источник
6

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

Иллюстрация: Выживание на Титанике

  • DВ(0,1)SВ

    SВDВ01

  • SВDВ

    Это было бы так, если бы все пассажиры первого класса на « Титанике» пережили крушение, и никто из пассажиров второго класса не выжил.

  • SВDВзнак равно0DВзнак равно1

    SВDВзнак равно1DВзнак равно0

    SВDВзнак равно0DВзнак равно1

DВSВSВ

Почему логистическая регрессия "нестабильна" в этих случаях?

Это хорошо объясняется в Rainey 2016 и Zorn 2005 .

  • DВ1SВзнак равно1DВ0SВзнак равно0

    SВзнак равно1

    01SВDВ

  • 01DВSВзнак равно0SВзнак равно1

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

То, что вы называете «нестабильностью», - это тот факт, что в случаях полного или почти полного разделения нет конечной вероятности достижения логистической модели. Однако я бы не стал использовать этот термин: функция правдоподобия, на самом деле, довольно «стабильна» (монотонна) при присвоении значений коэффициентов бесконечности.


Примечание: мой пример вымышленный. Выживание на Титанике не сводилось только к членству в пассажирском классе. См Холл (1986) .

Fr.
источник