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 .)N
N
5
업데이트 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
해당하는 추정 된 확률 만 저장 하고 바이어스의 징후는 없습니다.
업데이트 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])
}
}