희귀 사건 로지스틱 회귀 편향 : 최소한의 예제로 과소 평가 된 p를 시뮬레이션하는 방법은 무엇입니까?


19

CrossValidated는 King and Zeng (2001) 의 희귀 사건 편향 보정을 언제 어떻게 적용 할 것인지에 대한 몇 가지 질문을 가지고 있습니다 . 바이어스가 존재한다는 최소한의 시뮬레이션 기반 데모를 통해 다른 것을 찾고 있습니다.

특히 왕과 eng 주

"... 드문 사건 데이터에서 확률의 편향은 수천의 표본 크기에서 실질적으로 의미가 있으며 예측 가능한 방향입니다. 추정 된 사건 확률이 너무 작습니다."

R에서 이러한 바이어스를 시뮬레이션하려는 시도는 다음과 같습니다.

# FUNCTIONS
do.one.sim = function(p){
    N = length(p)
    # Draw fake data based on probabilities p  
    y = rbinom(N, 1, p)  
    # Extract the fitted probability.
    #    If p is constant, glm does y ~ 1, the intercept-only model.
    #    If p is not constant, assume its smallest value is p[1]:
    glm(y ~ p, family = 'binomial')$fitted[1]
}
mean.of.K.estimates = function(p, K){
    mean(replicate(K, do.one.sim(p) ))
}

# MONTE CARLO
N = 100
p = rep(0.01, N)
reps = 100
# The following line may take about 30 seconds
sim = replicate(reps, mean.of.K.estimates(p, K=100))
# Z-score:
abs(p[1]-mean(sim))/(sd(sim)/sqrt(reps))
# Distribution of average probability estimates:
hist(sim)

내가 이것을 실행할 때, 나는 아주 작은 z- 점수를 얻는 경향이 있으며, 추정의 히스토그램은 진리 p = 0.01을 중심으로 매우 가깝습니다.

내가 무엇을 놓치고 있습니까? 내 시뮬레이션이 충분히 크지 않아서 (아주 매우 작은) 바이어스를 보여줍니까? 치우침에는 일종의 공변량 (절편보다 더 많은)이 포함되어야합니까?

업데이트 1 : King과 Zeng은 논문의 방정식 12에서 의 바이어스에 대한 대략적인 근사치를 포함합니다 . 을 주목 분모에, 나는 크게 감소 로 시뮬레이션을 다시 실행 만, 여전히 추정 이벤트 확률에는 바이어스는 분명하지 않습니다. (난 단지 영감이를 사용했다. 내 질문에 위의 추정 이벤트 확률에 관한 것입니다하지 않는 것이 주 β 0 .)β0NN5β^0

업데이트 2 : 의견에 대한 제안에 따라 회귀에 독립 변수를 포함시켜 동등한 결과를 얻었습니다.

p.small = 0.01
p.large = 0.2
p = c(rep(p.small, round(N/2) ), rep(p.large, N- round(N/2) ) )
sim = replicate(reps, mean.of.K.estimates(p, K=100))

설명 : p독립 변수로 사용 되었습니다. 여기서 p작은 값 (0.01)과 큰 값 (0.2)의 반복이있는 벡터가 있습니다. 결국, p = 0.01에sim 해당하는 추정 된 확률 만 저장 하고 바이어스의 징후는 없습니다.=0.01

업데이트 3 (2016 년 5 월 5 일) : 결과가 눈에 띄게 변경되지는 않지만 새로운 내부 시뮬레이션 기능은 다음과 같습니다.

do.one.sim = function(p){
    N = length(p)
    # Draw fake data based on probabilities p  
    y = rbinom(N, 1, p)
    if(sum(y) == 0){ # then the glm MLE = minus infinity to get p = 0
        return(0)
    }else{
        # Extract the fitted probability.
        #    If p is constant, glm does y ~ 1, the intercept only model.
        #    If p is not constant, assume its smallest value is p[1]:
        return(glm(y ~ p, family = 'binomial')$fitted[1])
    }
}

=0


3
이 작업을 진행하고 다른 사람들의 의견을 기다리겠습니다. 치우침이 있더라도 치우침 보정은 추정값의 평균 제곱 오차를 높이기 위해 분산을 충분히 증가시킬 수 있습니다.
Frank Harrell

3
@FrankHarrell, King 및 Zeng은 또한 "편향을 줄이면 편차가 감소하는 행복한 상황에 처해있다"고 주장했다.
zkurtz

1
좋은. 편견의 양이 걱정할만큼 큰지 여전히 지켜봐야합니다.
Frank Harrell

"희귀"란 무엇입니까? 예를 들어, 0.001 %의 연간 기본 요율은 신용 AAA 등급과 관련이 있습니다. 이것은 당신에게 충분하지 않습니까?
Aksakal

1
@Aksakal, 내가 가장 좋아하는 "희귀 한"선택은 King과 Zeng이 쓴 편견을 가장 명확하게 보여주는 것입니다.
zkurtz

답변:


4

이것은 흥미로운 질문입니다. 추가 토론을 촉진하기 위해 아래에 게시 한 몇 가지 시뮬레이션을 수행했습니다.

우선 몇 가지 일반적인 의견 :

  • 인용 한 논문은 희귀 사건 편향에 관한 것입니다. 이전에 나에게 분명하지 않은 것은 (위에서 언급 한 의견과 관련하여) 10/30 관찰과 반대로 10/10000이있는 경우에 특별한 것이 있는지입니다. 그러나 일부 시뮬레이션 후에는 동의합니다.

  • 내가 생각한 문제 (이 문제가 자주 발생하고 최근 생태학 및 진화론의 방법론에 대한 논문이 있지만 참조를 찾을 수는 없었습니다)은 작은 데이터에서 GLM으로 퇴행 사례를 얻을 수 있다는 것입니다 MLE이 진실에서 멀리 떨어져 있거나 심지어-/ + 무한대에 처한 상황 (비선형 링크로 인해 가정). 편견 추정에서 이러한 사례를 어떻게 처리해야하는지 명확하지 않지만 시뮬레이션을 통해 희귀 사건 편견의 핵심이라고 생각합니다. 내 직감은 그것들을 제거하는 것이지만, 얼마나 멀리 제거해야하는지 명확하지 않습니다. 편향 보정에 대해 명심해야 할 사항이있을 수 있습니다.

  • 또한, 이러한 퇴화 된 사례는 수치 적 문제를 일으키는 경향이 있습니다 (glm 함수의 최대 값이 증가했지만 실제로는 실제 MLE를보고하기 위해 엡실론 증가에 대해 생각할 수 있습니다).

어쨌든, 여기에서는 로지스틱 회귀 분석에서 절편, 기울기 및 예측에 대한 추정치와 진실의 차이를 계산하는 코드가 있습니다. 먼저 표본 크기가 낮고 중간 정도의 발생률 상황입니다.

set.seed(123)
replicates = 1000
N= 40
slope = 2 # slope (linear scale)
intercept = - 1 # intercept (linear scale)

bias <- matrix(NA, nrow = replicates, ncol = 3)
incidencePredBias <- rep(NA, replicates)

for (i in 1:replicates){
  pred = runif(N,min=-1,max=1) 
  linearResponse = intercept + slope*pred
  data = rbinom(N, 1, plogis(linearResponse))  
  fit <- glm(data ~ pred, family = 'binomial', control = list(maxit = 300))
  bias[i,1:2] = fit$coefficients - c(intercept, slope)
  bias[i,3] = mean(predict(fit,type = "response")) - mean(plogis(linearResponse))
}

par(mfrow = c(1,3))
text = c("Bias intercept", "Bias slope", "Bias prediction")

for (i in 1:3){
  hist(bias[,i], breaks = 100, main = text[i])
  abline(v=mean(bias[,i]), col = "red", lwd = 3)  
}

apply(bias, 2, mean)
apply(bias, 2, sd) / sqrt(replicates)

절편, 기울기 및 예측에 대한 결과 바이어스 및 표준 오류는 다음과 같습니다.

-0.120429315  0.296453122 -0.001619793
 0.016105833  0.032835468  0.002040664

플롯 된 결과를 보면 추정값의 분산과 비교하여 바이어스가 작다는 것을 보여 주지만, 절편에 약간의 음의 바이어스와 기울기에 약간의 양의 바이어스에 대한 꽤 좋은 증거가 있다고 결론을 내릴 것입니다.

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

희귀 한 상황으로 매개 변수를 설정하는 경우

N= 4000
slope = 2 # slope (linear scale)
intercept = - 10 # intercept (linear scale)

요격에 대한 더 큰 편견을 얻었지만 여전히 예측에 대해서는 없음

   -1.716144e+01  4.271145e-01 -3.793141e-06
    5.039331e-01  4.806615e-01  4.356062e-06

추정값의 히스토그램에서, 모수 추정치의 퇴화 현상을 볼 수 있습니다

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

절편 추정값이 <20 인 모든 행을 제거합시다

apply(bias[bias[,1] > -20,], 2, mean)
apply(bias[bias[,1] > -20,], 2, sd) / sqrt(length(bias[,1] > -10))

치우침이 줄어들고 수치가 더 명확 해집니다. 모수 추정값은 정규 분포가 명확하지 않습니다. 그것이보고 된 CI의 유효성을 의미한다고 생각합니다.

-0.6694874106  1.9740437782  0.0002079945
1.329322e-01 1.619451e-01 3.242677e-06

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

절편에 대한 희귀 사건 편향은 희귀 사건 자체, 즉 매우 드물고 매우 작은 추정치에 의해 결정된다고 결론 지을 것입니다. 제거 여부를 확실하지 않으면 컷오프가 무엇인지 확실하지 않습니다.

그러나 주목해야 할 것은 응답 스케일에서 예측에 대한 편견이없는 것 같습니다. 링크 함수는 이러한 매우 작은 값을 흡수합니다.


1
예, 여전히 관심이 있습니다. 좋은 토론과 내 것과 비슷한 결과를 찾기 위해 +1 (명확한 예측 편견 없음). 우리 모두가 옳다고 가정하면, 궁극적으로 예측 편향 (즉, 적어도 예)에 대한 진정한 우려를 불러 일으킬 수있는 상황의 특성화 또는 주도한 King and Zeng 논문의 약점에 대한 설명을보고 싶습니다 그들은 그들의 편향 교정의 중요성을 과장되게 진술합니다.
zkurtz

±20

1

희귀 이벤트 편향은 회귀자가있을 때만 발생합니다. 여기서 시뮬레이션 된 것과 같은 인터셉트 전용 모델에서는 발생하지 않습니다. 자세한 내용은이 게시물을 참조하십시오 : http://statisticalhorizons.com/linear-vs-logistic#comment-276108


3
안녕 폴 독립형이며 외부 웹 사이트에 액세스 할 필요가 없도록 답변을 확장 한 경우 (예를 들어 어느 시점에서 사용할 수 없게 될 수 있음) 바람직합니다.
Patrick Coulombe

OP의 "업데이트 2"도 참고하십시오. 편향도 단일 회귀로 나타나지 않았습니다.
zkurtz

King & Zeng의 식 (16)과 그림 7에 따르면, 편향은 회귀 기 X의 함수입니다. X가 작 으면 편향이 없습니다. 이것은 업데이트 2의 OP에 의해 고려되는 상황입니다. X가 클 때 바이어스. 또한 King & Zeng의 시뮬레이션을 복제하는 것이 좋습니다.
Paul von Hippel

King-Zeng 논문에 대한 링크는 다음과 같습니다. gking.harvard.edu/files/0s.pdf
Paul von Hippel

1

논문의 그림 7은 예측에서 편견 문제를 가장 직접적으로 다루는 것으로 보인다. 나는 그 수치를 완전히 이해하지 못하고 (특히, "추정 된 이벤트 확률이 너무 작다"는 해석이 지나치게 단순화 된 것처럼 보인다) 6.1 절에서 시뮬레이션에 대한 간결한 설명을 기반으로 유사한 것을 재현 할 수 있었다.

n_grid = 40
x_grid = seq(0, 7, length.out = n_grid)
beta0 = -6
beta1 = 1

inverse_logit = function(x) 1/(1 + exp(-x))

do.one.sim = function(){
    N = 5000
    x = rnorm(N)
    p = inverse_logit(beta0 + beta1*x)
    # Draw fake data based on probabilities p
    y = rbinom(N, 1, p)
    if(sum(y) == 0){ # then the glm MLE = minus infinity to get p = 0
        return(rep(0, n_grid))
    }else{
        # Extract the error
        mod = glm(y ~ x, family = 'binomial')
        truth = inverse_logit(beta0 + beta1*x_grid)
        pred = predict(mod, newdata = data.frame(x = x_grid),
            type = 'response')
        return(pred - truth)
    }
}
mean.of.K.estimates = function(K){
    rowMeans(replicate(K, do.one.sim()))
}

set.seed(1)
bias = replicate(10, mean.of.K.estimates(100))
maxes = as.numeric(apply(bias, 1, max))
mins = as.numeric(apply(bias, 1, min))

par(mfrow = c(3, 1), mar = c(4,4,2,2))
plot(x_grid, rowMeans(bias), type = 'l',
    ylim = c(min(bias), max(bias)),
    xlab = 'x', ylab = 'bias')
lines(x_grid, maxes, lty = 2)
lines(x_grid, mins, lty = 2)
plot(x_grid, dnorm(x_grid), type = 'l',
    xlab = 'x', ylab = 'standard normal density')
plot(x_grid, inverse_logit(beta0 + beta1*x_grid),
    xlab = 'x', ylab = 'true simulation P(Y = 1)',
    type = 'l')

첫 번째 줄거리는 그림 7을 복제 한 것으로, 10 회 시행 된 결과의 전체 범위를 나타내는 파선이 추가되었습니다.

논문 x에 따라 표준 법선에서 도출 한 회귀 분석의 예측 변수는 다음과 같습니다. 따라서, 두 번째 도표에 도시 된 바와 같이, x > 3(첫 번째 도표에서 가장 가시적 인 편향이 발생하는 경우)에 대한 관측의 상대 빈도 는 감소합니다.

세 번째 줄거리는 생성 과정에서 "진정한"시뮬레이션 확률을의 함수로 보여줍니다 x. 가장 큰 편견 x은 드물거나 존재하지 않는 곳에서 발생합니다 .

종합하면, 이것은 OP가 "희귀 사건"(즉, x > 3)을 "사건 P(Y = 1)이 작은 사건"과 혼동함으로써 논문의 중심 주장을 완전히 잘못 해석했음을 암시한다 . 아마도이 논문은 후자 대신 전자에 관한 것이다.

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

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