У CrossValidated есть несколько вопросов о том, когда и как применять коррекцию смещения редкого события, разработанную King and Zeng (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 своей статьи. Отмечая в знаменателе, я резко сократил быть и повторно запускал моделирование, но до сих пор нет смещения расчетных вероятностей событий не очевидно. (Я использовал это только для вдохновения. Обратите внимание, что мой вопрос выше касается оценочных вероятностей событий, а не .)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])
}
}
Объяснение: MLE, когда y тождественно равен нулю, не существует ( спасибо за комментарии здесь за напоминание ). R не может выдать предупреждение, потому что его " положительный допуск сходимости " фактически удовлетворен. Более свободно говоря, MLE существует и является минус бесконечность, что соответствует ; отсюда и моя функция обновления. Единственная другая связная вещь, которую я могу придумать, - это отбросить те прогоны симуляции, где y тождественно равен нулю, но это явно приведет к результатам, еще более противоречащим первоначальному утверждению, что «оценочные вероятности события слишком малы».