CrossValidated a plusieurs questions sur le moment et la manière d'appliquer la correction du biais des événements rares par King et Zeng (2001) . Je cherche quelque chose de différent: une démonstration minimale basée sur la simulation que le biais existe.
En particulier, King et Zeng State
"... dans les données d'événements rares, les biais dans les probabilités peuvent être significativement significatifs avec des tailles d'échantillon par milliers et sont dans une direction prévisible: les probabilités d'événement estimées sont trop faibles."
Voici ma tentative de simuler un tel biais dans 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)
Lorsque je lance ceci, j'ai tendance à obtenir de très petits scores z, et l'histogramme des estimations est très proche de centré sur la vérité p = 0,01.
Qu'est-ce que je rate? Est-ce que ma simulation n'est pas assez grande pour montrer le vrai biais (et évidemment très petit)? Le biais nécessite-t-il d'inclure une sorte de covariable (plus que l'ordonnée à l'origine)?
Mise à jour 1: King et Zeng incluent une approximation approximative du biais de dans l'équation 12 de leur article. Notant le dans le dénominateur, j'ai considérablement réduit pour être et relancé la simulation, mais toujours aucun biais dans les probabilités d'événement estimées n'est évident. (Je l'ai utilisé uniquement comme source d'inspiration. Notez que ma question ci-dessus concerne les probabilités d'événement estimées, pas .)N
N
5
Mise à jour 2: suite à une suggestion dans les commentaires, j'ai inclus une variable indépendante dans la régression, conduisant à des résultats équivalents:
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))
Explication: Je me suis utilisé p
comme variable indépendante, où p
est un vecteur avec des répétitions d'une petite valeur (0,01) et d'une plus grande valeur (0,2). Au final, sim
ne stocke que les probabilités estimées correspondant à et il n'y a aucun signe de biais.
Mise à jour 3 (5 mai 2016): cela ne modifie pas sensiblement les résultats, mais ma nouvelle fonction de simulation interne est
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])
}
}
Explication: Le MLE lorsque y est identique à zéro n'existe pas ( merci aux commentaires ici pour le rappel ). R ne lance pas d'avertissement car sa « tolérance de convergence positive » est effectivement satisfaite. Plus libéralement parlant, le MLE existe et est moins l'infini, ce qui correspond à ; d'où ma mise à jour de fonction. La seule autre chose cohérente à laquelle je peux penser est de rejeter les cycles de simulation où y est identique à zéro, mais cela conduirait clairement à des résultats encore plus contraires à l'affirmation initiale selon laquelle "les probabilités d'événement estimées sont trop petites".