CrossValidated tiene varias preguntas sobre cuándo y cómo aplicar la corrección de sesgo por eventos raros mediante King y Zeng (2001) . Busco algo diferente: una demostración mínima basada en la simulación de que el sesgo existe.
En particular, King y Zeng afirman
"... en los datos de sucesos raros los sesgos en las probabilidades pueden ser significativos con muestras de miles de ejemplares y están en una dirección predecible: las probabilidades estimadas de los sucesos 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 verdadero (y evidentemente muy pequeño) sesgo? ¿Requiere el sesgo que se incluya algún tipo de covariable (más que el intercepto)?
Actualización 1: King y Zeng incluyen una aproximación para el sesgo de $\beta_0$ en la ecuación 12 de su documento. Teniendo en cuenta la N
en el denominador, reduje drásticamente N
ser 5
y volví a ejecutar la simulación, pero seguía sin apreciarse ningún sesgo en las probabilidades de sucesos estimadas. (Lo he utilizado sólo como inspiración. Tenga en cuenta que mi pregunta anterior se refiere a las probabilidades de sucesos estimadas, no a las probabilidades de sucesos estimadas. $\hat \beta_0$ .)
Actualización 2: A raíz de una sugerencia en los comentarios, he incluido una variable independiente en la regresión, lo que ha dado lugar 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: He utilizado p
como 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 únicamente las probabilidades estimadas correspondientes a $p = 0.01$ y no hay indicios de parcialidad.
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 por el recordatorio ). R no lanza una advertencia porque su " tolerancia de convergencia positiva se satisface realmente". En términos más liberales, la MLE existe y es menos infinito, lo que corresponde a $p=0$ de ahí la actualización de mi función. La única otra cosa coherente que se me ocurre hacer es descartar aquellas ejecuciones de la simulación en las que y es idénticamente cero, pero eso conduciría claramente a resultados aún más contrarios a la afirmación inicial de que "las probabilidades de sucesos estimadas son demasiado pequeñas".