CrossValidated'ın King ve Zeng (2001) tarafından yapılan nadir olay önyargı düzeltmesinin ne zaman ve nasıl uygulanacağı konusunda birkaç sorusu vardır . Ben farklı bir şey arıyorum: önyargı var minimal simülasyon tabanlı bir gösteri.
Özellikle, Kral ve Zeng devleti
“... nadir olay verilerinde olasılıklardaki yanlılıklar binlerce örneklem büyüklüğü ile büyük ölçüde anlamlı olabilir ve tahmin edilebilir bir yöndedir: tahmini olay olasılıkları çok küçük.”
İşte benim R böyle bir önyargı simüle girişimi:
# 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)
Bunu çalıştırdığımda, çok küçük z skorları elde etme eğilimindeyim ve tahminlerin histogramı p = 0.01 gerçeğine odaklanmış durumda.
Neyi kaçırıyorum? Simülasyonum yeterince büyük değil mi (gerçekte çok küçük) önyargıyı gösteriyor mu? Önyargı, bir çeşit ortak değişkenin (kesişimden daha fazla) dahil edilmesini gerektiriyor mu?
Güncelleme 1: King ve Zeng, 12. denkleminde sapması için kabaca bir yaklaşım içermektedir . Kaydeden paydada, ben büyük ölçüde azaltılmış olması ve simülasyon yeniden koştu, ama yine de tahmin olay olasılıkları hiçbir önyargı belirgindir. (Bunu sadece ilham kaynağı olarak kullandım. Yukarıdaki olay değil, tahmini olay olasılıkları ile ilgili olduğunu .)β 0N
N
5
Güncelleme 2: Yorumlardaki bir öneriyi takiben, eşdeğer sonuçlara yol açan regresyona bağımsız bir değişken ekledim:
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))
Açıklama: p
Kendini bağımsız değişken olarak kullandım , burada p
küçük bir değer (0.01) ve daha büyük bir değer (0.2) tekrarları olan bir vektör. Sonunda, sim
sadece 0.01'e karşılık gelen tahmini olasılıkları saklar ve yanlılık işareti yoktur.
Güncelleme 3 (5 Mayıs 2016): Bu, sonuçları belirgin bir şekilde değiştirmez, ancak yeni iç simülasyon işlevim
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])
}
}
Açıklama: y aynı sıfır olduğunda MLE mevcut değildir ( hatırlatma için buradaki yorumlar sayesinde ). R, " pozitif yakınsama toleransı " aslında tatmin olduğu için bir uyarı atar . Daha liberal olarak konuşursak, MLE vardır ve eksi sonsuzdur, bu da karşılık gelir ; dolayısıyla işlev güncellemem. Yapmayı düşünebileceğim tek tutarlı şey, simülasyonun y'nin aynı olduğu sıfırları atmasıdır, ancak bu, "tahmini olay olasılıklarının çok küçük olduğu" ilk iddiasına açıkça daha fazla sonuç verecektir.