답변:
이것에 대한 해결책은 불이익 회귀의 형태를 이용하는 것입니다. 실제로, 이것은 형벌 된 회귀 형태 중 일부가 개발 된 최초의 이유입니다 (단, 다른 흥미로운 특성을 갖는 것으로 밝혀졌지만).
R에 glmnet 패키지를 설치하고로드하면 대부분 준비가 완료된 것입니다. glmnet의 사용자에게 친숙하지 않은 측면 중 하나는 우리가 익숙한 공식이 아닌 행렬 만 공급할 수 있다는 것입니다. 그러나 model.matrix 등을 보면 data.frame 및 수식에서이 행렬을 구성 할 수 있습니다.
이 완벽한 분리가 단지 샘플의 부산물이 아니라 모집단에서 사실 일 수 있다고 생각할 때, 구체적으로 이것을 처리하고 싶지 않습니다 .이 분리 변수를 단순히 결과의 유일한 예측 변수로 사용하십시오. 모든 종류의 모델을 사용합니다.
몇 가지 옵션이 있습니다.
편견의 일부를 제거하십시오.
(a) @Nick의 제안에 따라 가능성을 처벌합니다. R의 패키지 logistf 또는 FIRTH
SAS의 옵션은 PROC LOGISTIC
Firth (1993), "최대 가능성 추정의 바이어스 감소", Biometrika , 80 , 1; 최대 가능성 추정치에서 1 차 편향을 제거합니다. ( 여기서 @Gavin은 brglm
익숙하지 않은 패키지를 권장 하지만 프로 비트와 같은 비정규 링크 기능에 대한 유사한 접근 방식을 구현합니다.)
(b) 정확한 조건부 로지스틱 회귀 분석에서 편향되지 않은 중앙값을 사용합니다. elrm 또는 logistiX 를 R로 패키지 하거나 EXACT
SAS의 명령문을 패키지 하십시오PROC LOGISTIC
.
예측 변수 범주 또는 분리를 유발하는 값이 발생하는 경우 는 제외 하십시오. 이것들은 당신의 범위를 벗어난 것일 수도 있습니다. 또는 더 집중된 조사가 필요합니다. (R 패키지 safeBinaryRegression 은 그것들을 찾기에 편리합니다.)
모델을 다시 캐스팅하십시오. 일반적으로 샘플 크기에 비해 너무 복잡하기 때문에 미리 생각해 본 적이 있습니다.
(a) 모형 에서 예측 변수 를 제거합니다 . 아슬 아슬, 그 이유에 대해 주어진 @ 사이먼에 의해 "당신은 최고의 응답을 설명하는 예측을 제거하고 있습니다."
(b) 예측 변수 범주를 축소 / 예측값을 비닝하여. 이것이 의미가있는 경우에만.
(c) 상호 작용 없이 예측 변수를 두 개 이상의 교차 인자로 다시 표현합니다 . 이것이 의미가있는 경우에만.
아무것도하지 마세요. 그러나 표준 오차의 Wald 추정치가 잘못 될 수 있으므로 프로파일 가능성에 따라 신뢰 구간을 계산하십시오. 종종 간과되는 옵션입니다. 모형의 목적이 예측 변수와 반응 간의 관계에 대해 배운 내용을 설명하는 것이라면 승산 비, 예를 들어 2.3 이상에 대한 신뢰 구간을 인용하는 것은 부끄러운 일이 아닙니다. (실제로 데이터에서 지원하는 승산 비를 배제한 편견없는 추정치에 근거하여 신뢰 구간을 인용하는 것은 어리석은 것처럼 보일 수 있습니다.) 점 추정치를 사용하여 예측하려고 할 때 문제가 발생하고 분리가 발생하는 예측 변수가 다른 사람을 늪으로 삼습니다.
Rousseeuw & Christmann (2003), "로지스틱 회귀 분석에서 분리 및 특이 치에 대한 견고성", 전산 통계 및 데이터 분석 , 43 , 3에서 설명하고 R 패키지 hlr에 구현 된 숨겨진 로지스틱 회귀 모델을 사용하십시오 . (@ user603가 .이 제안 "조금 더 일반적인 모델은 어떤에서 관찰 된 응답이 강력하게 관련되어 제안하지만 관측 진정한 응답과 동일하지 않습니다"을 제안, 내가 글을 읽어하지 않은 경우),하지만 그들은 추상의 말 그럴듯하게 들리지 않는 한이 방법을 사용하는 것은 좋지 않을 것입니다.
"완전히 분리 된 변수 중 무작위로 선택된 관측치를 1에서 0 또는 0에서 1로 변경하십시오": @ RobertF 's comment . 이 제안은 데이터에서 정보의 부족함의 증상이 아니라 문제 자체 로서의 분리와 관련하여 발생하는 것으로 보이며, 이로 인해 다른 방법을 최대한 가능성 추정보다 선호하거나 가능한 방법으로 추론을 제한 할 수 있습니다 합리적인 정확성 — 자신 만의 장점이 있고 분리를위한 "수정"이 아닌 접근. ( 당연히 ad hoc 인 것 외에도 , 분석가들이 동일한 데이터에 대해 동일한 질문을하고, 동일한 가정을하고, 동전 던지기 등의 결과로 인해 다른 답변을 제공해야한다는 것은 타당하지 않습니다.)
이것은 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
bayesglm
사용 하는 것은 무엇입니까 ? ML 추정치가 평평한 기준을 가진 베이지안과 동일하다면, 정보가없는 선행이 어떻게 도움이됩니까?
prior.df
에있는 기본값 1.0
및 / 또는 감소 prior.scale
에있는 기본값 2.5
, 아마 시도 시작 :m=bayesglm(match ~. , family = binomial(link = 'logit'), data = df, prior.df=5)
최대한의 "완전한 완전 분리"문제에 대한 가장 철저한 설명 중 하나는 Paul Allison의 논문입니다. 그는 SAS 소프트웨어에 대해 쓰고 있지만 그가 다루는 문제는 모든 소프트웨어에 일반화 할 수 있습니다.
x의 선형 함수가 y의 완벽한 예측을 생성 할 수있을 때마다 완전 분리가 발생합니다.
(a) 일부 계수 벡터가 존재하는 경우 준 완전한 분리가 발생 B 등을 그 bxi ≥ 0 마다 이순신 = 1 및 bxi ≤ 0 *마다 ** 이순신 = 0 이 어떤지는 각 카테고리의 적어도 하나의 경우에 보유 종속 변수. 다시 말해, 가장 간단한 경우, 로지스틱 회귀 분석의 이분법 독립 변수에 대해 해당 변수와 종속 변수로 구성된 2 × 2 테이블에 0이 있으면 회귀 계수에 대한 ML 추정치는 존재하지 않습니다.
Allison은 문제 변수 삭제, 범주 축소, 아무것도 수행하지 않음, 정확한 로지스틱 회귀 활용 , 베이지안 추정 및 처벌 된 최대 가능성 추정을 포함하여 이미 언급 된 많은 솔루션에 대해 설명 합니다.
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- 값이 1에 매우 가깝습니다. OR의 정밀도 손실은 분산 공분산 행렬의 정밀도 손실보다 수십 배 더 작기 때문입니다.
여기에 요약 된 몇 가지 솔루션이 있습니다.
한 단계 추정기의 낮은 바이어스, 효율 및 일반화를 지원하는 많은 이론이 있습니다. 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)
> pchisq(scstat, df=1, lower.tail=F)
[,1]
[1,] 1.343494e-11
두 경우 모두 무한대의 OR에 대한 유추가 있습니다.
중앙값 비 편향 추정값을 사용하여 무한 확률 비율에 대한 중앙값의 편향되지 않은 비단 수 95 % CI를 생성 할 수 있습니다. epitools
R 의 패키지 가이를 수행 할 수 있습니다. 그리고 여기에이 추정기를 구현하는 예제가 있습니다 : Bernoulli 샘플링에 대한 신뢰 구간
test="Rao"
를 주면 R에서 점수 테스트를 수행 할 수 있습니다 anova
. (음, 마지막 두 개는
R의이 경고 메시지에주의하십시오. Andrew Gelman 이 작성한 이 블로그 게시물 을 살펴보면 항상 완벽한 분리 문제가 아니라 때때로 버그가있는 것을 알 수 glm
있습니다. 시작 값이 최대 우도 추정치에서 너무 멀면 폭파됩니다. 따라서 Stata와 같은 다른 소프트웨어를 먼저 확인하십시오.
실제로이 문제가 발생하면 유익한 사전 정보와 함께 베이지안 모델링을 사용해보십시오.
그러나 실제로는 사전 정보를 선택하는 방법을 모르기 때문에 문제를 일으키는 예측 변수를 제거합니다. 그러나 완벽한 분리 문제에 대한이 문제가있을 때 사전에 유익한 정보를 사용하는 것에 대한 Gelman의 논문이 있다고 생각합니다. 그냥 구글. 어쩌면 당신은 그것을 시도해야합니다.
glm2
패키지는 각 스코어링 단계에서 가능성이 실제로 증가하는지 확인하고 그렇지 않은 경우 단계 크기를 절반으로 줄입니다.
safeBinaryRegression
이러한 문제를 진단하고 수정하도록 최적화 된 R 패키지가 있으며, 최적화 방법을 사용하여 분리 또는 엇갈림이 있는지 확인합니다. 시도 해봐!
나는 이것이 오래된 게시물이라는 것을 알고 있지만, 며칠 동안 어려움을 겪고 다른 사람들을 도울 수 있기 때문에 계속 대답 할 것입니다.
모델에 맞게 선택한 변수가 0과 1 또는 예와 아니오를 매우 정확하게 구분할 수있는 경우 완전 분리가 발생합니다. 데이터 과학에 대한 우리의 모든 접근 방식은 확률 추정을 기반으로하지만이 경우에는 실패합니다.
정류 단계 :-
변수 간의 분산이 낮은 경우 glm () 대신 bayesglm ()을 사용하십시오.
bayesglm ()과 함께 (maxit =”some numeric value”)를 사용하면
3. 모델 피팅에 대해 선택한 변수에 대한 세 번째로 가장 중요한 검사에는 Y (outout) 변수와의 다중 공선 성이 매우 높은 변수가 있어야하며 해당 변수를 모델에서 버립니다.
필자의 경우와 마찬가지로 유효성 검사 데이터의 이탈을 예측하기 위해 통신 이탈 데이터가있었습니다. 나는 훈련 데이터에 예와 아니오를 매우 차별화 할 수있는 변수를 가지고있었습니다. 그것을 떨어 뜨린 후 올바른 모델을 얻을 수있었습니다. 더 단계적으로 (적합)을 사용하여 모델을 더 정확하게 만들 수 있습니다.