दुर्लभ घटना लॉजिस्टिक रिग्रेशन पूर्वाग्रह: कम से कम उदाहरण के साथ कम करके आंका गया p कैसे अनुकरण करें?


19

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 ।)β0NN5β^0

अद्यतन 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केवल अनुमानित संभावनाओं को बराबर संग्रहीत करता है और पूर्वाग्रह का कोई संकेत नहीं है।पी=0.01

अपडेट 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])
    }
}

पी=0


3
मुझे खुशी है कि आप इस पर काम कर रहे हैं और दूसरों की टिप्पणियों का इंतजार कर रहे हैं। पूर्वाग्रह होने पर भी, पूर्वाग्रह सुधार संभवतः विचरण को पर्याप्त बढ़ा सकता है ताकि अनुमानों की औसत चुकता त्रुटि को बढ़ाया जा सके।
फ्रैंक हरेल

3
@FrankHarrell, किंग और ज़ेंग भी जोर देकर कहते हैं कि "हम खुशहाल स्थिति में हैं जहाँ पूर्वाग्रह कम करने से गठबंधन में कमी आती है।"
zkurtz

1
अच्छा। अभी भी यह देखा जाना बाकी है कि क्या पूर्वाग्रह की मात्रा काफी बड़ी है।
फ्रैंक हारेल

आपके लिए "दुर्लभ" क्या है? उदाहरण के लिए, 0.001% वार्षिक डिफ़ॉल्ट दर क्रेडिट एएए रेटिंग के साथ जुड़ा हुआ है। क्या यह आपके लिए काफी दुर्लभ है?
अक्कल ५15

1
@ अक्षल, "दुर्लभ" की मेरी पसंदीदा पसंद वह है जो राजा और ज़ेंग के बारे में लिखे गए पूर्वाग्रह को स्पष्ट रूप से प्रदर्शित करता है।
zkurtz

जवाबों:


4

यह एक दिलचस्प सवाल है - मैंने कुछ सिमुलेशन किए हैं जो मैं इस उम्मीद में नीचे पोस्ट करता हूं कि यह आगे की चर्चा को उत्तेजित करता है।

सबसे पहले, कुछ सामान्य टिप्पणियां:

  • आपके द्वारा उद्धृत कागज दुर्लभ घटना पूर्वाग्रह के बारे में है। इससे पहले मेरे लिए क्या स्पष्ट नहीं था (टिप्पणियों के संबंध में भी जो ऊपर किए गए थे) क्या है अगर उन मामलों के बारे में कुछ विशेष है जहां आपके पास 10/10000 10/30 टिप्पणियों के विपरीत हैं। हालाँकि, कुछ सिमुलेशन के बाद, मैं सहमत हूँ कि वहाँ है।

  • एक समस्या जो मुझे ध्यान में थी (मैं अक्सर इसका सामना कर चुका हूं, और हाल ही में इकोलॉजी एंड इवोल्यूशन में मेथड्स में एक पेपर था, मैं उस संदर्भ को नहीं ढूंढ पाया) हालांकि यह है कि आप छोटे-छोटे डेटा में जीएलएम के साथ पतित मामलों को प्राप्त कर सकते हैं ऐसी परिस्थितियाँ, जहाँ MLE सच्चाई से दूर है, या यहाँ तक कि - / + अनंत (नॉनलाइन लिंक के कारण मैं मान लेता हूँ)। यह मेरे लिए स्पष्ट नहीं है कि पूर्वाग्रह के आकलन में इन मामलों का इलाज कैसे किया जाना चाहिए, लेकिन मेरे सिमुलेशन से मैं कहूंगा कि वे दुर्लभ घटना पूर्वाग्रह के लिए महत्वपूर्ण हैं। मेरा अंतर्ज्ञान उन्हें हटाने के लिए होगा, लेकिन फिर यह बिल्कुल स्पष्ट नहीं है कि उन्हें कितनी दूर करना होगा। शायद पूर्वाग्रह-सुधार के लिए कुछ ध्यान रखें।

  • इसके अलावा, इन पतित मामलों में संख्यात्मक समस्याएं होने का खतरा होता है (इसलिए मैंने glm फ़ंक्शन में अधिकतम वृद्धि की है, लेकिन कोई एप्सिलॉन को बढ़ाने के बारे में सोच सकता है और साथ ही यह सुनिश्चित कर सकता है कि वास्तव में सही MLE रिपोर्ट करता है)।

वैसे भी, यहां कुछ कोड जो लॉजिस्टिक रिग्रेशन में अवरोधन, ढलान और भविष्यवाणियों के लिए अनुमानों और सत्य के बीच अंतर की गणना करते हैं, पहले एक कम नमूना आकार / मध्यम घटना की स्थिति के लिए:

set.seed(123)
replicates = 1000
N= 40
slope = 2 # slope (linear scale)
intercept = - 1 # intercept (linear scale)

bias <- matrix(NA, nrow = replicates, ncol = 3)
incidencePredBias <- rep(NA, replicates)

for (i in 1:replicates){
  pred = runif(N,min=-1,max=1) 
  linearResponse = intercept + slope*pred
  data = rbinom(N, 1, plogis(linearResponse))  
  fit <- glm(data ~ pred, family = 'binomial', control = list(maxit = 300))
  bias[i,1:2] = fit$coefficients - c(intercept, slope)
  bias[i,3] = mean(predict(fit,type = "response")) - mean(plogis(linearResponse))
}

par(mfrow = c(1,3))
text = c("Bias intercept", "Bias slope", "Bias prediction")

for (i in 1:3){
  hist(bias[,i], breaks = 100, main = text[i])
  abline(v=mean(bias[,i]), col = "red", lwd = 3)  
}

apply(bias, 2, mean)
apply(bias, 2, sd) / sqrt(replicates)

अवरोधन, ढलान और भविष्यवाणी के लिए परिणामी पूर्वाग्रह और मानक त्रुटियां हैं

-0.120429315  0.296453122 -0.001619793
 0.016105833  0.032835468  0.002040664

मैं निष्कर्ष निकालूंगा कि अवरोधन में मामूली नकारात्मक पूर्वाग्रह के लिए बहुत अच्छे सबूत हैं, और ढलान में मामूली सकारात्मक पूर्वाग्रह, हालांकि प्लॉट किए गए परिणामों पर एक नज़र से पता चलता है कि पूर्वाग्रह अनुमानित मूल्यों के विचरण की तुलना में छोटा है।

यहाँ छवि विवरण दर्ज करें

अगर मैं एक दुर्लभ-घटना स्थिति के लिए पैरामीटर सेट कर रहा हूं

N= 4000
slope = 2 # slope (linear scale)
intercept = - 10 # intercept (linear scale)

मुझे इंटरसेप्ट के लिए एक बड़ा पूर्वाग्रह मिल रहा है, लेकिन अभी भी भविष्यवाणी पर कोई नहीं है

   -1.716144e+01  4.271145e-01 -3.793141e-06
    5.039331e-01  4.806615e-01  4.356062e-06

अनुमानित मूल्यों के हिस्टोग्राम में, हम पतित पैरामीटर अनुमानों की घटना देखते हैं (यदि हमें उन्हें इस तरह से कॉल करना चाहिए)

यहाँ छवि विवरण दर्ज करें

आइए उन सभी पंक्तियों को हटा दें जिनके लिए अवरोधन अनुमान <20 हैं

apply(bias[bias[,1] > -20,], 2, mean)
apply(bias[bias[,1] > -20,], 2, sd) / sqrt(length(bias[,1] > -10))

पूर्वाग्रह घटता है, और आंकड़े में चीजें थोड़ी अधिक स्पष्ट हो जाती हैं - पैरामीटर अनुमान स्पष्ट रूप से वितरित नहीं होते हैं। मुझे आश्चर्य है कि सीआई की वैधता के लिए इसका मतलब है कि रिपोर्ट किए गए हैं।

-0.6694874106  1.9740437782  0.0002079945
1.329322e-01 1.619451e-01 3.242677e-06

यहाँ छवि विवरण दर्ज करें

मैं अंत में दुर्लभ ईवेंट पूर्वाग्रह को समाप्त कर दूंगा, जो कि दुर्लभ, अत्यंत छोटे अनुमानों से दुर्लभ घटनाओं से प्रेरित है। निश्चित नहीं है कि हम उन्हें हटाना चाहते हैं या नहीं, यह सुनिश्चित नहीं है कि कटऑफ क्या होगा।

एक महत्वपूर्ण बात यह है कि हालांकि, किसी भी तरह से, प्रतिक्रिया पैमाने पर भविष्यवाणियों पर कोई पूर्वाग्रह नहीं लगता है - लिंक फ़ंक्शन केवल इन बेहद छोटे मूल्यों को अवशोषित करता है।


1
हाँ, अभी भी दिलचस्पी है। +1 अच्छी चर्चा के लिए और मेरे (कोई स्पष्ट भविष्यवाणी पूर्वाग्रह) के समान परिणाम खोजने के लिए। यह मानते हुए कि हम दोनों सही हैं, मैं अंततः उन परिस्थितियों के लक्षण वर्णन को देखना चाहूंगा जो भविष्यवाणी पूर्वाग्रह (यानी कम से कम एक उदाहरण) या राजा और ज़ेंग पेपर की कमजोरियों के बारे में सही चिंता का कारण बनती हैं। उनके पूर्वाग्रह सुधार के महत्व को समाप्त करने के लिए।
zkurtz

±20

1

दुर्लभ घटनाएं पूर्वाग्रह केवल तब होती हैं जब रजिस्टरों होते हैं। यह इंटरसेप्ट-ओनली मॉडल में घटित नहीं होगा, जैसे कि यहाँ नकली। इस पोस्ट को विवरण के लिए देखें: http://statutichorizons.com/linear-vs-logistic#comment-276108


3
हाय पॉल। यह बेहतर होगा यदि आप अपने उत्तर का विस्तार करते हैं ताकि यह स्टैंडअलोन हो और बाहरी वेबसाइट तक पहुंच की आवश्यकता न हो (जो, उदाहरण के लिए, किसी बिंदु पर अनुपलब्ध हो सकता है)।
पैट्रिक कॉलोम्बे

ओपी में "अपडेट 2" भी नोट करें। पूर्वाग्रह भी एक एकल प्रतिगामी के साथ दिखाई देने में विफल रहा।
zkurtz

राजा और ज़ेंग के समीकरण (16) और चित्रा 7 के अनुसार, पूर्वाग्रह रजिस्टरों का एक कार्य है। एक्स छोटा है, तो कोई पूर्वाग्रह नहीं है, जो कि अद्यतन 2 में ओपी द्वारा मानी जाने वाली स्थिति है। मैं सुझाव देना चाहूंगा कि पूर्वाग्रह जब एक्स बड़ा है। मैं राजा और ज़ेंग के अनुकरण को दोहराने की कोशिश करना भी सुझाऊंगा।
पॉल वॉन हिप्पल

यहाँ किंग-ज़ेंग पेपर का लिंक दिया गया है: gking.harvard.edu/files/0s.pdf
पॉल वॉन हिप्पल

1

कागज में चित्र 7 पूर्वानुमानों में पूर्वाग्रह के सवाल को सबसे प्रत्यक्ष रूप से संबोधित करता है। मैं आंकड़े को पूरी तरह से नहीं समझता (विशेष रूप से, व्याख्या "अनुमानित घटना संभावनाएं बहुत छोटी हैं" एक ओवरसिम्प्लीफिकेशन की तरह लगता है), लेकिन मैं खंड 6.1 में उनके अनुकरण के उनके उलट विवरण के आधार पर इसके समान कुछ को पुन: उत्पन्न करने में कामयाब रहा:

n_grid = 40
x_grid = seq(0, 7, length.out = n_grid)
beta0 = -6
beta1 = 1

inverse_logit = function(x) 1/(1 + exp(-x))

do.one.sim = function(){
    N = 5000
    x = rnorm(N)
    p = inverse_logit(beta0 + beta1*x)
    # 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(rep(0, n_grid))
    }else{
        # Extract the error
        mod = glm(y ~ x, family = 'binomial')
        truth = inverse_logit(beta0 + beta1*x_grid)
        pred = predict(mod, newdata = data.frame(x = x_grid),
            type = 'response')
        return(pred - truth)
    }
}
mean.of.K.estimates = function(K){
    rowMeans(replicate(K, do.one.sim()))
}

set.seed(1)
bias = replicate(10, mean.of.K.estimates(100))
maxes = as.numeric(apply(bias, 1, max))
mins = as.numeric(apply(bias, 1, min))

par(mfrow = c(3, 1), mar = c(4,4,2,2))
plot(x_grid, rowMeans(bias), type = 'l',
    ylim = c(min(bias), max(bias)),
    xlab = 'x', ylab = 'bias')
lines(x_grid, maxes, lty = 2)
lines(x_grid, mins, lty = 2)
plot(x_grid, dnorm(x_grid), type = 'l',
    xlab = 'x', ylab = 'standard normal density')
plot(x_grid, inverse_logit(beta0 + beta1*x_grid),
    xlab = 'x', ylab = 'true simulation P(Y = 1)',
    type = 'l')

पहला कथानक उनके आंकड़े 7 की मेरी प्रतिकृति है, जिसमें 10 परीक्षणों पर परिणामों की पूरी श्रृंखला का प्रतिनिधित्व करते हुए धराशायी घटता है।

कागज के अनुसार, xयहां मानक सामान्य से तैयार किए गए प्रतिगमन में एक पूर्वसूचक चर है। इस प्रकार, जैसा कि दूसरे भूखंड में चित्रित किया गया है, x > 3(जहां पहले दृश्य में सबसे अधिक दिखाई देने वाला पूर्वाग्रह है) के लिए टिप्पणियों की सापेक्ष आवृत्ति कम है।

तीसरा प्लॉट "सच" सिमुलेशन संभावनाओं को एक प्रक्रिया के रूप में निर्माण प्रक्रिया में दिखाता है x। ऐसा प्रतीत होता है कि सबसे बड़ा पूर्वाग्रह वहां होता है जहां xदुर्लभ या गैर-मौजूद है।

साथ में, ये सुझाव देते हैं कि ओपी ने "दुर्लभ घटना" (यानी x > 3) जिसके लिए " P(Y = 1)बहुत छोटा है" को भ्रमित करके कागज के केंद्रीय दावे को पूरी तरह से गलत बताया। वर्तमान में कागज बाद के बजाय पूर्व की चिंता करता है।

यहाँ छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.