CrossValidated ha diverse domande su quando e come applicare la rara correzione del bias di eventi di King e Zeng (2001) . Sto cercando qualcosa di diverso: una dimostrazione minima basata sulla simulazione dell'esistenza del pregiudizio.
In particolare, il re e lo stato di Zeng
"... in dati di eventi rari le distorsioni nelle probabilità possono essere sostanzialmente significative con le dimensioni del campione in migliaia e sono in una direzione prevedibile: le probabilità di eventi stimate sono troppo piccole."
Ecco il mio tentativo di simulare un simile pregiudizio in 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)
Quando eseguo questo, tendo a ottenere punteggi z molto piccoli e l'istogramma delle stime è molto vicino al centrato sulla verità p = 0,01.
Che cosa mi manca? La mia simulazione non è abbastanza grande per mostrare il vero (e evidentemente molto piccolo) pregiudizio? Il pregiudizio richiede un tipo di covariata (più dell'intercettazione) da includere?
Aggiornamento 1: King e Zeng includono un'approssimazione approssimativa per il bias di nell'equazione 12 del loro articolo. Notando il nel denominatore, mi sono drasticamente ridotto e ho eseguito nuovamente la simulazione, ma non è ancora evidente alcuna distorsione nelle probabilità di evento stimate. (Ho usato questo solo come fonte di ispirazione. Nota che la mia domanda di cui sopra è di circa le probabilità di eventi stimate, non β 0 .)N
N
5
Aggiornamento 2: seguendo un suggerimento nei commenti, ho incluso una variabile indipendente nella regressione, portando a risultati equivalenti:
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))
Spiegazione: Mi sono usato p
come variabile indipendente, dove p
è un vettore con una ripetizione di un valore piccolo (0,01) e un valore più grande (0,2). Alla fine, sim
memorizza solo le probabilità stimate corrispondenti a e non vi è alcun segno di distorsione.
Aggiornamento 3 (5 maggio 2016): questo non modifica sensibilmente i risultati, ma la mia nuova funzione di simulazione interna è
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])
}
}