У CrossValidated є кілька запитань щодо того, коли і як застосувати виправлення зміщення рідкісних подій Кінгом і Дзенгом (2001) . Я шукаю щось інше: мінімальна демонстрація на основі симуляції того, що упередженість існує.
Зокрема, Кінг і Дзенг
"... у даних про рідкісні події ухили до ймовірностей можуть мати істотне значення з розмірами вибірки в тисячах і знаходяться в передбачуваному напрямку: передбачувані ймовірності подій занадто малі."
Ось моя спроба моделювати такий зміщення в 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: Кінг і Зенг містять приблизне наближення для зміщення у рівнянні 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). Зрештою, sim
зберігається лише орієнтовна ймовірність, що відповідає і немає ознак упередженості.
Оновлення 3 (5 травня 2016 р.): Це помітно не змінює результати, але моя нова функція внутрішнього моделювання є
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])
}
}