CrossValidated पर किंग और ज़ेंग (2001) द्वारा दुर्लभ घटना पूर्वाग्रह सुधार कब और कैसे लागू किया जाए, इस पर कई सवाल हैं । मैं कुछ अलग खोज रहा हूं: एक न्यूनतम सिमुलेशन-आधारित प्रदर्शन जो पूर्वाग्रह मौजूद है।
विशेष रूप से, राजा और ज़ेंग राज्य
"... दुर्लभ घटनाओं के आंकड़ों में संभावनाओं में पक्षपात हजारों में नमूना आकार के साथ काफी सार्थक हो सकता है और एक अनुमानित दिशा में है: अनुमानित घटना संभावनाएं बहुत छोटी हैं।"
यहाँ 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)
जब मैं इसे चलाता हूं, तो मुझे बहुत छोटे z- स्कोर मिलते हैं, और अनुमानों का हिस्टोग्राम सच्चाई p = 0.01 पर केंद्रित होने के बहुत करीब है।
मुझे किसकी याद आ रही है? क्या यह है कि मेरा अनुकरण पर्याप्त नहीं है सच (और स्पष्ट रूप से बहुत छोटा) पूर्वाग्रह दिखाते हैं? क्या पूर्वाग्रह को शामिल करने के लिए किसी प्रकार के कोवरिएट (अवरोधन से अधिक) की आवश्यकता होती है?
अद्यतन 1: राजा और ज़ेंग के पूर्वाग्रह के लिए एक मोटा अनुमान शामिल है उनके कागज के समीकरण 12 में। यह उल्लेख करते हुएहर में, मैं काफी कमहोने के लिएऔर सिमुलेशन फिर से भाग गया, लेकिन अभी भी अनुमान घटना संभावनाओं में कोई पूर्वाग्रह स्पष्ट है। (मैं केवल प्रेरणा के रूप में यह प्रयोग किया जाता है। ध्यान दें कि मेरे सवाल इसके बाद के संस्करण, अनुमानित घटना संभावनाओं के बारे में है नहीं β 0 ।)N
N
5
अद्यतन 2: टिप्पणियों में एक सुझाव के बाद, मैंने प्रतिगमन में एक स्वतंत्र चर को शामिल किया, जिससे समकक्ष परिणाम प्राप्त हुए:
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))
स्पष्टीकरण: मैंने p
खुद को स्वतंत्र चर के रूप में इस्तेमाल किया , जहां p
एक वेक्टर एक छोटे मूल्य (0.01) और एक बड़े मूल्य (0.2) का दोहराव है। अंत में, sim
केवल अनुमानित संभावनाओं को बराबर संग्रहीत करता है और पूर्वाग्रह का कोई संकेत नहीं है।
अपडेट 3 (5 मई, 2016): इससे परिणाम में कोई परिवर्तन नहीं होता है, लेकिन मेरा नया आंतरिक सिमुलेशन कार्य है
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])
}
}