클래스가 잘 분리되어 있는데 왜 로지스틱 회귀가 불안정 해 집니까?


34

클래스가 잘 분리되어있을 때 로지스틱 회귀가 불안정 해지는 이유는 무엇입니까? 잘 분리 된 수업은 무엇을 의미합니까? 누군가가 예를 들어 설명 할 수 있다면 정말 감사하겠습니다.



답변:


31

분리가있을 때 로지스틱 회귀 자체가 불안정 해지는 것은 올바르지 않습니다 . 분리는 매우 좋은 예측 변수 인 일부 변수가 있거나, 분리가 너무 적은 관측치 / 너무 많은 변수의 인공물 일 수 있음을 의미합니다. 이 경우 해결책은 더 많은 데이터를 얻는 것일 수 있습니다. 그러나 분리 자체는 증상 일 뿐이며 그 자체로는 문제가되지 않습니다.

따라서 치료해야 할 사례가 실제로 다릅니다. 첫째, 분석의 목표는 무엇입니까? 분석의 최종 결과가 사례의 일부 분류 인 경우 분리가 전혀 문제가되지 않으며, 이는 분류가 매우 우수한 변수가 있다는 것을 의미합니다. 그러나 목표가 위험 추정 인 경우 모수 추정값이 필요하며, 분리 할 때 일반적인 mle (최대 우도) 추정치는 존재하지 않습니다. 따라서 추정 방법을 바꿔야합니다. 문헌에는 몇 가지 제안이 있습니다.

그런 다음 (위에서 언급했듯이) 분리에 대한 두 가지 가능한 원인이 있습니다. 전체 모집단에 분리가 있거나 분리 된 사례가 거의 없거나 너무 많은 변수로 인해 분리가 발생할 수 있습니다.

분리와 함께 분류되는 것은 최대 가능성 추정 절차입니다. mle 모수 추정치 (또는 적어도 일부)는 무한대가됩니다. 나는이 답변의 첫 번째 버전에서 부트 스트랩으로 쉽게 해결할 수 있지만 적어도 일반적인 경우 부트 스트랩 절차로 각 부트 스트랩 재 샘플에 분리가 있기 때문에 작동하지 않는다고 말했다. 그러나 로지스틱 회귀는 여전히 유효한 모델이지만 다른 추정 절차가 필요합니다. 일부 제안은 다음과 같습니다.

  1. 융기 또는 올가미와 같은 정규화는 부트 스트랩과 결합 될 수 있습니다.
  2. 정확한 조건부 로지스틱 회귀
  3. 순열 테스트, https://www.ncbi.nlm.nih.gov/pubmed/15515134 참조
  4. Firths 바이어스 감소 추정 절차, 로지스틱 회귀 모델이 수렴되지 않음 참조
  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로 추정됩니다. 코드를 직접 실행하십시오. 빠릅니다!

그런 다음이 코드를 확장하여 elrm에서 다른 추정 절차, mle 및 근사 조건부 로지스틱 회귀를 시도합니다. 내 컴퓨터에서이 시뮬레이션을 실행하는 데 약 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보다 작다는 것입니다. 그것은 우리가 수정 된 모델에서 시뮬레이션했다는 사실과 관련이있을 수 있습니다. 조사가 필요합니다.



1
(+1) 그러나 최대 우도 이외의 추정 절차 가 필요 하다고 말하는 것이 다소 강력합니다 . 무한 승산 및 승산 비율은 합리적인 포인트 추정치 일 수 있습니다. 종종 분리로 인한 문제는 단지 좋은 간격 추정치를 얻는 것입니다.
Scortchi-Monica Monica 복원

@kjetilbhalvorsen 사과는 오래된 스레드를 되살려 주지만 파이썬에서 비슷한 패키지를 알고 있는지 궁금합니다.
MEEP

죄송하지만 파이썬에 대해서는 모르겠습니다. 그러나 파이썬 내에서 R을 실행할 수 있어야합니다.
kjetil b halvorsen

25

@ sean501과 @kjetilbhalvorsen의 좋은 답변이 있습니다. 예를 물었습니다. 아래 그림을 고려하십시오. 데이터 생성 프로세스가 패널 A에 표시된 것과 유사한 상황이 발생할 수 있습니다 . 그렇다면 실제로 수집하는 데이터가 패널 B 의 데이터와 유사 할 수 있습니다 . 이제 데이터를 사용하여 통계 모델을 작성할 때 아이디어는 실제 데이터 생성 프로세스를 복구하거나 최소한 근사치에 가까운 근사치를 도출하는 것입니다. 따라서 문제는 B 의 데이터에 로지스틱 회귀를 적합시키는 것이 A ? 패널 C 를 보면, 당신은 회색 선이 실제 함수보다 데이터에 더 가깝다는 것을 알 수 있습니다. 따라서 가장 적합한 것을 찾으려면 로지스틱 회귀는 파란색이 아닌 회색 선을 반환하는 것이 바람직합니다. 그러나 거기서 멈추지 않습니다. 패널을보고 D를검은 선은 회색 선보다 데이터를 더 잘 근사합니다. 실제로 발생할 수있는 것이 가장 적합합니다. 이것이 로지스틱 회귀 모형이 추구하는 선입니다. 음의 무한대 절편과 무한대의 기울기에 해당합니다. 그것은 물론, 당신이 회복하기를 바라는 진실과는 거리가 멀습니다. 완전 분리는 로지스틱 회귀 출력에서 ​​표준으로 제공되는 변수에 대한 p- 값 계산에 문제를 일으킬 수 있습니다 (설명이 약간 다르고 복잡함). 또한 여기에 적합을 다른 시도, 예를 들어 메타 분석과 결합하려고하면 다른 결과가 덜 정확 해집니다.

여기에 이미지 설명을 입력하십시오


1
(+1) 이것은 문제의 매우 유용한 예입니다.
mkt-복원 모니카

다이어그램이 보여주는 흥미로운 측면 중 하나는 표본이 50-50 확률 (예 : 12 <x <15 범위의 점)로 이어지는 "x 공간"에서 추출하기를 원한다는 것입니다. 사실 나는이 결과를 제공 한 실제 시나리오 에서이 중간 지역 (10 <x <17)에서 더 많은 데이터를 수집하려고한다고 생각합니다.
확률 론적

@probabilityislogic, 맞습니다. 관계에 대한 대부분의 정보는 중간 지역의 데이터에 있습니다.
gung-Monica Monica 복원

10

그것은 한쪽에 모든 양의 점이 있고 다른쪽에 모든 음의 점이있는 초평면이 있다는 것을 의미합니다. 최대 우도 솔루션은 한쪽에서 평평한 1이고 다른 쪽에서 평평한 0입니다. 이는 계수를 무한대로함으로써 로지스틱 함수로 '달성'됩니다.


6

당신이 "분리"( '분리'가 아니라)라고 부르는 것은 동일한 문제를 일으키는 두 가지 다른 상황을 다룹니다.

삽화 : 타이타닉 에서의 생존

  • V(0,1)에스V 분액, 독립 변수.

    에스VV01

  • 에스VV .

    타이타닉의 1 등석 승객이 모두 잔해에서 살아 남았고 2 등석 승객은 살아남지 않은 경우입니다.

  • 에스VV=0V=1 , 그러나 둘.

    에스VV=1V=0

    에스VV=0V=1

V에스V에스V

이 경우 로지스틱 회귀가 "불안정한"이유는 무엇입니까?

이것은 Rainey 2016Zorn 2005 에 잘 설명되어 있습니다.

  • V1에스V=1V0에스V=0 .

    에스V=1

    01에스VV

  • 01V에스V=0에스V=1

두 경우 모두 모형의 우도 함수는 최대 우도 추정값을 찾을 수 없습니다. 무조건 접근하여 해당 값의 근사값 만 찾습니다.

"불안정성"이라고 부르는 것은 완전 또는 준 완전 분리의 경우 로지스틱 모델에 도달 할 수있는 유한 한 가능성이 없다는 것입니다. 그러나 그 용어는 사용하지 않을 것입니다. 우도 함수는 사실 계수 값을 무한대에 할당 할 때 꽤 "안정적"(단수 적)입니다.


참고 : 내 예는 허구입니다. 타이타닉 에서의 생존은 승객 클래스 멤버십에만 국한 되지 않았습니다. Hall (1986) 참조 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.