CrossValidated hat verschiedene Fragen, wann und wie die Selten-Ereignis-Bias-Korrektur von King und Zeng (2001) angewendet werden soll. . Ich suche etwas anderes: eine minimale simulationsbasierte Demonstration, dass der Bias existiert.
Insbesondere König und Zeng Zustand
"... in Daten zu seltenen Ereignissen können die Wahrscheinlichkeiten bei Stichprobengrößen zu Tausenden erheblich sein und in eine vorhersagbare Richtung weisen: Geschätzte Ereigniswahrscheinlichkeiten sind zu klein."
Hier ist mein Versuch, eine solche Verzerrung in R zu simulieren:
# 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)
Wenn ich dies durchführe, neige ich dazu, sehr kleine Z-Scores zu erhalten, und das Histogramm der Schätzungen ist sehr nahe daran, über der Wahrheit p = 0,01 zu zentrieren.
Was vermisse ich? Ist es so, dass meine Simulation nicht groß genug ist, um die wahre (und offensichtlich sehr kleine) Tendenz aufzuzeigen? Benötigt die Verzerrung eine Art Kovariate (mehr als der Achsenabschnitt), um einbezogen zu werden?
Update 1: King und Zeng geben in Gleichung 12 ihrer Arbeit eine grobe Näherung für die Verzerrung von an. Unter Hinweis auf die im Nenner, ich drastisch reduziert werden und wieder lief die Simulation, aber noch keine Verzerrung der geschätzten Ereigniswahrscheinlichkeiten ist evident. (Ich habe dies nur als Inspiration verwendet. Beachten Sie, dass es sich bei meiner obigen Frage um geschätzte Ereigniswahrscheinlichkeiten handelt, nicht um .)N
N
5
Update 2: Aufgrund eines Vorschlags in den Kommentaren habe ich eine unabhängige Variable in die Regression aufgenommen, was zu äquivalenten Ergebnissen führte:
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))
Erklärung: Ich habe mich p
selbst als unabhängige Variable verwendet, wobei p
es sich um einen Vektor mit Wiederholungen eines kleinen Werts (0,01) und eines größeren Werts (0,2) handelt. sim
Speichert am Ende nur die geschätzten Wahrscheinlichkeiten, die und es gibt kein Anzeichen einer Verzerrung.
Update 3 (5. Mai 2016): Das ändert nichts an den Ergebnissen, aber meine neue innere Simulationsfunktion ist
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])
}
}
Erläuterung: Die MLE existiert nicht, wenn y identisch Null ist ( dank Kommentaren hier für die Erinnerung ). R gibt keine Warnung aus, weil seine " positive Konvergenztoleranz " tatsächlich erfüllt wird. Im Allgemeinen existiert die MLE und ist minus unendlich, was . daher mein Funktionsupdate. Die einzige andere zusammenhängende Sache, an die ich denken kann, ist das Verwerfen der Läufe der Simulation, bei denen y identisch Null ist. Dies würde jedoch eindeutig zu Ergebnissen führen, die der ursprünglichen Behauptung, dass "geschätzte Ereigniswahrscheinlichkeiten zu klein sind", noch mehr entgegenwirken.