CrossValidated对于何时以及如何应用King和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。注意分母中的,我大幅度地将其简化为,然后重新运行了模拟,但是在估计的事件概率上仍然没有偏差。(我用这只作为灵感。需要注意的是上面我的问题是关于估计事件的概率,而不是β 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(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])
}
}