로지스틱 회귀 분석에서 완벽한 분리를 처리하는 방법은 무엇입니까?


163

대상 변수에서 0과 1을 완벽하게 분리하는 변수가있는 경우 R은 다음과 같은 "완벽 또는 준 완벽 분리"경고 메시지를 생성합니다.

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

우리는 여전히 모델을 얻지 만 계수 추정치는 팽창됩니다.

실제로 이것을 어떻게 처리합니까?


4
관련 질문
user603

1
정규화에 대한 질문 및 데모 관련 여기
하이 타오 두

답변:


100

이것에 대한 해결책은 불이익 회귀의 형태를 이용하는 것입니다. 실제로, 이것은 형벌 된 회귀 형태 중 일부가 개발 된 최초의 이유입니다 (단, 다른 흥미로운 특성을 갖는 것으로 밝혀졌지만).

R에 glmnet 패키지를 설치하고로드하면 대부분 준비가 완료된 것입니다. glmnet의 사용자에게 친숙하지 않은 측면 중 하나는 우리가 익숙한 공식이 아닌 행렬 만 공급할 수 있다는 것입니다. 그러나 model.matrix 등을 보면 data.frame 및 수식에서이 행렬을 구성 할 수 있습니다.

이 완벽한 분리가 단지 샘플의 부산물이 아니라 모집단에서 사실 일 수 있다고 생각할 때, 구체적으로 이것을 처리하고 싶지 않습니다 .이 분리 변수를 단순히 결과의 유일한 예측 변수로 사용하십시오. 모든 종류의 모델을 사용합니다.


20
캐럿 패키지를 통해 glmnet에 대한 공식 인터페이스를 사용할 수도 있습니다.
Zach

"지금, 당신이 기대할 때 ..."이것에 관한 질문. 마이크로 바이 옴과의 관계를보고하는 사례 / 대조군 연구가 있습니다. 우리는 또한 대부분의 경우에만 발견되는 치료법을 가지고 있습니다. 그러나 우리는이 치료법이 마이크로 바이 옴에도 영향을 줄 수 있다고 생각합니다. 이것이 당신의 경고의 예입니까? 우리가 시도하면 치료를 사용하지 않는 경우가 더 많음을 발견 할 수는 있지만 실제로 가지고있는 것이 있습니다.
abalter

142

몇 가지 옵션이 있습니다.

  1. 편견의 일부를 제거하십시오.

    (a) @Nick의 제안에 따라 가능성을 처벌합니다. R의 패키지 logistf 또는 FIRTHSAS의 옵션은 PROC LOGISTICFirth (1993), "최대 가능성 추정의 바이어스 감소", Biometrika , 80 , 1; 최대 가능성 추정치에서 1 차 편향을 제거합니다. ( 여기서 @Gavin은 brglm익숙하지 않은 패키지를 권장 하지만 프로 비트와 같은 비정규 링크 기능에 대한 유사한 접근 방식을 구현합니다.)

    (b) 정확한 조건부 로지스틱 회귀 분석에서 편향되지 않은 중앙값을 사용합니다. elrm 또는 logistiX 를 R로 패키지 하거나 EXACTSAS의 명령문을 패키지 하십시오PROC LOGISTIC .

  2. 예측 변수 범주 또는 분리를 유발하는 값이 발생하는 경우 는 제외 하십시오. 이것들은 당신의 범위를 벗어난 것일 수도 있습니다. 또는 더 집중된 조사가 필요합니다. (R 패키지 safeBinaryRegression 은 그것들을 찾기에 편리합니다.)

  3. 모델을 다시 캐스팅하십시오. 일반적으로 샘플 크기에 비해 너무 복잡하기 때문에 미리 생각해 본 적이 있습니다.

    (a) 모형 에서 예측 변수 를 제거합니다 . 아슬 아슬, 그 이유에 대해 주어진 @ 사이먼에 의해 "당신은 최고의 응답을 설명하는 예측을 제거하고 있습니다."

    (b) 예측 변수 범주를 축소 / 예측값을 비닝하여. 이것이 의미가있는 경우에만.

    (c) 상호 작용 없이 예측 변수를 두 개 이상의 교차 인자로 다시 표현합니다 . 이것이 의미가있는 경우에만.

  4. 5212

  5. 아무것도하지 마세요. 그러나 표준 오차의 Wald 추정치가 잘못 될 수 있으므로 프로파일 가능성에 따라 신뢰 구간을 계산하십시오. 종종 간과되는 옵션입니다. 모형의 목적이 예측 변수와 반응 간의 관계에 대해 배운 내용을 설명하는 것이라면 승산 비, 예를 들어 2.3 이상에 대한 신뢰 구간을 인용하는 것은 부끄러운 일이 아닙니다. (실제로 데이터에서 지원하는 승산 비를 배제한 편견없는 추정치에 근거하여 신뢰 구간을 인용하는 것은 어리석은 것처럼 보일 수 있습니다.) 점 추정치를 사용하여 예측하려고 할 때 문제가 발생하고 분리가 발생하는 예측 변수가 다른 사람을 늪으로 삼습니다.

  6. Rousseeuw & Christmann (2003), "로지스틱 회귀 분석에서 분리 및 특이 치에 대한 견고성", 전산 통계 및 데이터 분석 , 43 , 3에서 설명하고 R 패키지 hlr에 구현 된 숨겨진 로지스틱 회귀 모델을 사용하십시오 . (@ user603가 .이 제안 "조금 더 일반적인 모델은 어떤에서 관찰 된 응답이 강력하게 관련되어 제안하지만 관측 진정한 응답과 동일하지 않습니다"을 제안, 내가 글을 읽어하지 않은 경우),하지만 그들은 추상의 말 그럴듯하게 들리지 않는 한이 방법을 사용하는 것은 좋지 않을 것입니다.

  7. "완전히 분리 된 변수 중 무작위로 선택된 관측치를 1에서 0 또는 0에서 1로 변경하십시오": @ RobertF 's comment . 이 제안은 데이터에서 정보의 부족함의 증상이 아니라 문제 자체 로서의 분리와 관련하여 발생하는 것으로 보이며, 이로 인해 다른 방법을 최대한 가능성 추정보다 선호하거나 가능한 방법으로 추론을 제한 할 수 있습니다 합리적인 정확성 — 자신 만의 장점이 있고 분리를위한 "수정"이 아닌 접근. ( 당연히 ad hoc 인 것 외에도 , 분석가들이 동일한 데이터에 대해 동일한 질문을하고, 동일한 가정을하고, 동전 던지기 등의 결과로 인해 다른 답변을 제공해야한다는 것은 타당하지 않습니다.)


1
@Scortchi 또 다른 (이단적인) 옵션이 있습니다. 완전 분리를 나타내는 변수 중에서 무작위로 선택된 관측치를 1에서 0 또는 0에서 1로 변경하는 것은 어떻습니까?
RobertF

@RobertF : 감사합니다! 나는 이것에 대해 생각하지 않았다-당신이 그것의 성능에 관한 언급이 있다면 나는 감사 할 것이다. 실제로 사용하는 사람들을 만나 보셨습니까?
Scortchi

@Scortchi-아니오, 완전한 분리를 제거하기 위해 인공 데이터를 추가하는 연구원에 대한 언급이 있지만 데이터의 선택적 수정에 대한 기사를 찾지 못했습니다. 이 방법이 얼마나 효과적인지 잘 모르겠습니다.
RobertF

1
@tatami : 모든 (많은?) 프로그램이 분리 자체에 대해 경고하는 것은 아니며, 여러 변수의 선형 조합에있을 때 발견하기가 까다로울 수 있지만 수렴 실패 및 / 또는 적합하지 않은 값 또는 하나에 가까운 값에 대해서는 까다로울 수 있습니다. 항상 이것들을 확인하십시오.
Scortchi

2
@ Scortchi : 귀하의 답변에 아주 좋은 요약. 개인적으로 나는 베이지안 접근법을 선호하지만 projecteuclid.org/euclid.ejs/1239716414 의 잦은 관점에서 일반적인 현상에 대한 아름다운 분석에 대해 언급 할 가치가 있습니다 . 저자는 로지스틱 회귀 분석에서 완전히 분리 된 경우에도 사용할 수있는 단측 신뢰 구간을 제공합니다.
Cyan

55

이것은 Scortchi와 Manoel의 답변의 확장이지만 RI를 사용하는 것처럼 보이므로 코드를 제공 할 것입니다. :)

본인의 문제에 대한 가장 쉽고 간단한 해결책은 Gelman et al (2008)이 제안한 정보가없는 사전 가정을 사용하여 베이지안 분석을 사용하는 것입니다. Scortchi가 언급했듯이 Gelman은 각 계수에 대해 평균 0.0과 스케일 2.5를 사용하여 Cauchy를 먼저 두는 것이 좋습니다 (평균 0.0과 SD가 0.5로 정규화 됨). 그러면 계수가 정규화되어 0으로 약간 당겨집니다. 이 경우 정확히 원하는 것입니다. 매우 넓은 꼬리를 가지고 있기 때문에 Cauchy는 Gelman으로부터 여전히 큰 계수를 허용합니다 (짧은 꼬리의 법선과 반대).

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

이 분석을 실행하는 방법? 이 분석을 구현하는 arm 패키지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), "물류 및 기타 회귀 모델에 대한 약한 유익한 기본 사전 분포", Ann. Appl. 통계, 2, 4 http://projecteuclid.org/euclid.aoas/1231424214


6
아뇨. 너무 간단합니다. 방금 수행 한 작업을 설명 할 수 있습니까? 이전에 bayesglm사용 하는 것은 무엇입니까 ? ML 추정치가 평평한 기준을 가진 베이지안과 동일하다면, 정보가없는 선행이 어떻게 도움이됩니까?
StasK

5
더 많은 정보를 추가했습니다! 이전은 모호하지만 평평하지는 않습니다. 그것은 추정을 정규화하고 0.0으로 약간 끌어 당길 때 약간의 영향을 미칩니다.이 경우에는 내가 생각하는 것입니다.
Rasmus Bååth

> m = bayesglm (일치 ~., family = binomial (link = 'logit'), data = df) 경고 메시지 : 적합 확률로 숫자 0 또는 1이 발생했습니다 !
Chris

선발로 증가하여 약간 강한 정규화를 시도 prior.df에있는 기본값 1.0및 / 또는 감소 prior.scale에있는 기본값 2.5, 아마 시도 시작 :m=bayesglm(match ~. , family = binomial(link = 'logit'), data = df, prior.df=5)
라스무스 바트

1
모델에서 prior.df를 늘릴 때 정확히 무엇을합니까? 우리가 가고 싶은 한도가 있습니까? 내 이해는 모델이 정확한 오차 추정치로 수렴하도록 제한한다는 것입니다.
hamilthj

7

최대한의 "완전한 완전 분리"문제에 대한 가장 철저한 설명 중 하나는 Paul Allison의 논문입니다. 그는 SAS 소프트웨어에 대해 쓰고 있지만 그가 다루는 문제는 모든 소프트웨어에 일반화 할 수 있습니다.

  • x의 선형 함수가 y의 완벽한 예측을 생성 할 수있을 때마다 완전 분리가 발생합니다.

  • (a) 일부 계수 벡터가 존재하는 경우 준 완전한 분리가 발생 B 등을 그 bxi ≥ 0 마다 이순신 = 1bxi ≤ 0 *마다 ** 이순신 = 0 이 어떤지는 각 카테고리의 적어도 하나의 경우에 보유 종속 변수. 다시 말해, 가장 간단한 경우, 로지스틱 회귀 분석의 이분법 독립 변수에 대해 해당 변수와 종속 변수로 구성된 2 × 2 테이블에 0이 있으면 회귀 계수에 대한 ML 추정치는 존재하지 않습니다.

Allison은 문제 변수 삭제, 범주 축소, 아무것도 수행하지 않음, 정확한 로지스틱 회귀 활용 , 베이지안 추정 및 처벌 된 최대 가능성 추정을 포함하여 이미 언급 된 많은 솔루션에 대해 설명 합니다.

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이상에서 lrtestlmtest패키지. 두 경우 모두 정보 매트릭스는 무한히 가치가 있으며 추론은 ​​없습니다. 오히려 R 출력을 생성하지만 신뢰할 수는 없습니다. 이러한 경우 R이 일반적으로 생성하는 추론은 p- 값이 1에 매우 가깝습니다. OR의 정밀도 손실은 분산 공분산 행렬의 정밀도 손실보다 수십 배 더 작기 때문입니다.

여기에 요약 된 몇 가지 솔루션이 있습니다.

1 단계 추정기를 사용하십시오.

한 단계 추정기의 낮은 바이어스, 효율 및 일반화를 지원하는 많은 이론이 있습니다. R로 1 단계 추정기를 쉽게 지정할 수 있으며 결과는 일반적으로 예측 및 추론에 매우 유리합니다. 그리고 반복자 (Newton-Raphson)는 그렇게 할 기회가 없기 때문에이 모델은 절대로 분기되지 않습니다!

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

예측이 추세의 방향을 반영하는 것을 볼 수 있습니다. 그리고 추론은 우리가 진실이라고 믿는 경향을 암시합니다.

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

점수 테스트를 수행

점수 (또는 라오) 통계는 상기 우도 비 상이한 통계를 월드. 대립 가설 하에서 분산의 평가가 필요하지 않습니다. 우리는 null 아래에 모델을 맞습니다.

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

두 경우 모두 무한대의 OR에 대한 유추가 있습니다.

신뢰 구간에 대해 편향되지 않은 중앙값 추정값을 사용합니다.

중앙값 비 편향 추정값을 사용하여 무한 확률 비율에 대한 중앙값의 편향되지 않은 비단 수 95 % CI를 생성 할 수 있습니다. epitoolsR 의 패키지 가이를 수행 할 수 있습니다. 그리고 여기에이 추정기를 구현하는 예제가 있습니다 : Bernoulli 샘플링에 대한 신뢰 구간


2
이것은 훌륭하지만 물론 몇 가지 퀴즈가 있습니다. (1) 우도 비 테스트는 정보 매트릭스를 사용하지 않습니다. 그것은 단지 Wald 테스트 뿐이며, 분리가있을 때 치명적으로 실패합니다. (2) 나는 원스텝 추정기에 전혀 익숙하지 않지만, 여기의 기울기 추정치는 터무니없이 낮습니다. (3) 신뢰 구간 은 중간 편향되지 않습니다. 이 섹션에서 링크하는 것은 p-mid 신뢰 구간입니다. (4) LR 또는 점수 테스트를 반전시켜 신뢰 구간을 얻을 수 있습니다. ...
Scortchi

... (5) 함수에 인수 test="Rao"를 주면 R에서 점수 테스트를 수행 할 수 있습니다 anova. (음, 마지막 두 개는
퀴즈가

anova는 알고 기본 좋은 점수 테스트를 알고 좋은! 아마도 직접 구현하는 것이 유용 할 것입니다. CI는 편향된 중앙값이 아니지만, 편향된 중앙값 추정기의 CI는 경계 매개 변수에 대해 일관된 추론을 제공합니다. 중간 p는 그러한 추정기입니다. p는 승산 비 b / c로 변환 될 수 있으며 일대일 변환에는 변하지 않는다. LR 테스트는 경계 매개 변수에 대해 일관성이 있습니까?
AdamO

점수 및 LR 검정은 유한 표본에서 근사하지만, 귀무 가설에만 Wilks 정리가 적용되는 경계에 매개 변수를 포함해서는 안됩니다.
Scortchi

2

R의이 경고 메시지에주의하십시오. Andrew Gelman 이 작성한 이 블로그 게시물 을 살펴보면 항상 완벽한 분리 문제가 아니라 때때로 버그가있는 것을 알 수 glm있습니다. 시작 값이 최대 우도 추정치에서 너무 멀면 폭파됩니다. 따라서 Stata와 같은 다른 소프트웨어를 먼저 확인하십시오.

실제로이 문제가 발생하면 유익한 사전 정보와 함께 베이지안 모델링을 사용해보십시오.

그러나 실제로는 사전 정보를 선택하는 방법을 모르기 때문에 문제를 일으키는 예측 변수를 제거합니다. 그러나 완벽한 분리 문제에 대한이 문제가있을 때 사전에 유익한 정보를 사용하는 것에 대한 Gelman의 논문이 있다고 생각합니다. 그냥 구글. 어쩌면 당신은 그것을 시도해야합니다.


8
예측 변수를 제거 할 때의 문제는 응답을 가장 잘 설명하는 예측 변수를 제거한다는 것입니다. 일반적으로 목표는 무엇입니까? 예를 들어 너무 복잡한 상호 작용을 너무 많이 적용하여 모델에 과적 합한 경우에만 의미가 있다고 주장합니다.
사이먼 번

4
버그는 아니지만 초기 추정치가 MLE에서 너무 멀어서 문제를 직접 선택하지 않으면 발생하지 않습니다.
Scortchi

나는 이것을 이해하지만 이것이 알고리즘의 버그라고 생각합니다.
Manoel Galdino

5
글쎄, 나는 '버그'의 정의에 대해 퀴즈하고 싶지 않다. 그러나 행동은 기본 R에서 헤아릴 수없고 고칠 수 없습니다. "다른 소프트웨어로 확인"할 필요는 없습니다. 비 수렴 문제를 자동으로 처리하려는 경우 glm2패키지는 각 스코어링 단계에서 가능성이 실제로 증가하는지 확인하고 그렇지 않은 경우 단계 크기를 절반으로 줄입니다.
Scortchi

3
CRAN에는 safeBinaryRegression 이러한 문제를 진단하고 수정하도록 최적화 된 R 패키지가 있으며, 최적화 방법을 사용하여 분리 또는 엇갈림이 있는지 확인합니다. 시도 해봐!
kjetil b halvorsen

2

귀하의 질문 내용에 동의하는지 확실하지 않습니다.

경고 메시지는 데이터에서 관찰 된 X 수준의 일부에 대해 적합 확률이 숫자 0 또는 1 임을 의미한다고 생각합니다 . 즉, 해상도에서 0 또는 1로 표시됩니다.

당신은 실행할 수 있으며 predict(yourmodel,yourdata,type='response')예측 확률로 0 또는 1을 찾을 수 있습니다 .

결과적으로 결과를 사용하는 것이 좋습니다.


-1

나는 이것이 오래된 게시물이라는 것을 알고 있지만, 며칠 동안 어려움을 겪고 다른 사람들을 도울 수 있기 때문에 계속 대답 할 것입니다.

모델에 맞게 선택한 변수가 0과 1 또는 예와 아니오를 매우 정확하게 구분할 수있는 경우 완전 분리가 발생합니다. 데이터 과학에 대한 우리의 모든 접근 방식은 확률 추정을 기반으로하지만이 경우에는 실패합니다.

정류 단계 :-

  1. 변수 간의 분산이 낮은 경우 glm () 대신 bayesglm ()을 사용하십시오.

  2. bayesglm ()과 함께 (maxit =”some numeric value”)를 사용하면

3. 모델 피팅에 대해 선택한 변수에 대한 세 번째로 가장 중요한 검사에는 Y (outout) 변수와의 다중 공선 성이 매우 높은 변수가 있어야하며 해당 변수를 모델에서 버립니다.

필자의 경우와 마찬가지로 유효성 검사 데이터의 이탈을 예측하기 위해 통신 이탈 데이터가있었습니다. 나는 훈련 데이터에 예와 아니오를 매우 차별화 할 수있는 변수를 가지고있었습니다. 그것을 떨어 뜨린 후 올바른 모델을 얻을 수있었습니다. 더 단계적으로 (적합)을 사용하여 모델을 더 정확하게 만들 수 있습니다.


2
이 답변이 토론에 많은 도움이된다는 것을 알 수 없습니다. 베이지안 접근법은 이전 답변에서 철저히 다루었으며 "문제성"예측 변수의 제거도 이미 언급되어 있으며 권장하지 않습니다. 단계별 변수 선택은 내가 아는 한 좋은 아이디어는 아닙니다.
einar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.