CrossValidated tiene varias preguntas sobre cuándo y cómo aplicar la corrección de sesgo de eventos raros por King y Zeng (2001) . Estoy buscando algo diferente: una demostración mínima basada en simulación de que existe el sesgo.
En particular, el estado de King y Zeng
"... en datos de eventos raros, los sesgos en las probabilidades pueden ser significativamente significativos con tamaños de muestra en miles y están en una dirección predecible: las probabilidades de eventos estimadas son demasiado pequeñas".
Aquí está mi intento de simular tal sesgo en 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)
Cuando ejecuto esto, tiendo a obtener puntuaciones z muy pequeñas, y el histograma de estimaciones está muy cerca de centrarse sobre la verdad p = 0.01.
¿Qué me estoy perdiendo? ¿Es que mi simulación no es lo suficientemente grande como para mostrar el sesgo verdadero (y evidentemente muy pequeño)? ¿El sesgo requiere algún tipo de covariable (más que la intercepción) para ser incluido?
Actualización 1: King y Zeng incluyen una aproximación aproximada del sesgo de en la ecuación 12 de su artículo. Observando el en el denominador, reduje drásticamente a ser y volví a ejecutar la simulación, pero aún no hay sesgo en las probabilidades estimadas de eventos. (Utilicé esto solo como inspiración. Tenga en cuenta que mi pregunta anterior es sobre las probabilidades estimadas de eventos, no ).N
N
5
Actualización 2: Siguiendo una sugerencia en los comentarios, incluí una variable independiente en la regresión, lo que condujo a resultados equivalentes:
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))
Explicación: me utilicé p
como la variable independiente, donde p
es un vector con repeticiones de un valor pequeño (0.01) y un valor mayor (0.2). Al final, sim
almacena solo las probabilidades estimadas correspondientes a y no hay signos de sesgo.
Actualización 3 (5 de mayo de 2016): Esto no cambia notablemente los resultados, pero mi nueva función de simulación interna es
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])
}
}
Explicación: El MLE cuando y es idénticamente cero no existe ( gracias a los comentarios aquí para el recordatorio ). R no puede lanzar una advertencia porque su " tolerancia de convergencia positiva " en realidad se satisface. Hablando más liberalmente, el MLE existe y es menos infinito, que corresponde a ; de ahí la actualización de mi función. La única otra cosa coherente que se me ocurre hacer es descartar esas ejecuciones de la simulación donde y es idénticamente cero, pero eso claramente conduciría a resultados aún más contrarios a la afirmación inicial de que "las probabilidades estimadas de eventos son demasiado pequeñas".