नमूने से दो आबादी को अलग करना


13

मैं एक ही डेटा सेट से मूल्यों के दो समूहों को अलग करने की कोशिश कर रहा हूं। मैं मान सकता हूं कि आबादी में से एक सामान्य रूप से वितरित की गई है और नमूने का कम से कम आधा आकार है। दूसरे वाले का मान पहले वाले (वितरण अज्ञात है) से मानों की तुलना में कम या अधिक है। मैं जो करने की कोशिश कर रहा हूं वह ऊपरी और निचली सीमाओं को खोजने के लिए है जो दूसरे से सामान्य रूप से वितरित आबादी को संलग्न करेगा।

मेरी धारणा मुझे शुरुआती बिंदु प्रदान करती है:

  • नमूने की इंटरक्वेर्टाइल रेंज के भीतर सभी बिंदु सामान्य रूप से वितरित जनसंख्या से हैं।

जब तक वे सामान्य रूप से वितरित आबादी के 3 st.dev में फिट नहीं होते हैं, तब तक मैं उन्हें बाकी के नमूने से बाहर ले जाने वाले outliers के लिए परीक्षण करने की कोशिश कर रहा हूं। जो आदर्श नहीं है, लेकिन उचित पर्याप्त परिणाम उत्पन्न करने के लिए लगता है।

क्या मेरी धारणा सांख्यिकीय ध्वनि है? इससे बेहतर तरीका क्या हो सकता है?

पीएस कृपया टैग किसी को ठीक करें।


क्या आप मान सकते हैं कि अन्य दो समूह अलग-अलग सामान्य वितरण से हैं?
csgillespie

@cgillespie: यह एक ही समूह है, बस दो मोड के साथ, मुझे लगता है, और इसलिए मैं शायद यह नहीं मान सकता।
साइलेंटगॉस्ट

1
क्या आप जानते हैं कि दूसरे समूह के सदस्य पहले समूह में शामिल नहीं हैं या आप केवल उन सदस्यों को गलत तरीके से लेबल करने के लिए तैयार हैं जो पहले समूह से संबंधित हैं?
क्रिश्चियन

जवाबों:


10

अगर मैं सही तरीके से समझूं, तो आप डेटा में सिर्फ दो नॉर्म्स का मिश्रण फिट कर सकते हैं। बहुत सारे आर पैकेज हैं जो ऐसा करने के लिए उपलब्ध हैं। यह उदाहरण मिक्सटूल पैकेज का उपयोग करता है :

#Taken from the documentation
library(mixtools)
data(faithful)
attach(faithful)

#Fit two Normals
wait1 = normalmixEM(waiting, lambda = 0.5)
plot(wait1, density=TRUE, loglik=FALSE)

यह देता है:

दो नॉर्मल का मिश्रण http://img294.imageshack.us/img294/4213/kern..pg

पैकेज में अधिक परिष्कृत तरीके भी शामिल हैं - प्रलेखन की जांच करें।


1
आपके द्वारा संलग्न की गई छवि समाप्त हो गई है।
नकटिनियों

3
  1. IQR रेंज में डेटा के लिए आपको इस वितरण के मापदंडों का अनुमान लगाने के लिए काटे गए सामान्य वितरण (उदाहरण के लिए R पैकेज gamlss.tr) का उपयोग करना चाहिए।
  2. एक अन्य दृष्टिकोण 2 या 3 घटकों (वितरण) के साथ मिश्रण मॉडल का उपयोग कर रहा है। आप ऐसे मॉडल को फिट कर सकते हैं जिनका उपयोग गैमलेसs.x पैकेज (पैकेज गैम्लेससेडिस्ट से वितरण मिश्रण के प्रत्येक घटक के लिए निर्दिष्ट किया जा सकता है)।

2

यह मानता है कि आप यह भी नहीं जानते हैं कि दूसरा वितरण सामान्य है या नहीं; मैं मूल रूप से केवल वितरण पर ध्यान केंद्रित करके इस अनिश्चितता को संभालता हूं। यह सबसे अच्छा तरीका हो सकता है या नहीं भी।

यदि आप मान सकते हैं कि दो आबादी पूरी तरह से अलग हैं (यानी, वितरण ए से सभी मान वितरण बी से सभी मानों से कम हैं), तो एक दृष्टिकोण आर-टू में ऑप्टिमाइज़ () फ़ंक्शन का उपयोग करके ब्रेक-पॉइंट की खोज करना है जो सामान्य वितरण के माध्य और sd का अनुमान लगाता है जो डेटा को सबसे अधिक संभावना बनाता है:

#generate completely separated data
a = rnorm(100)
b = rnorm(100,10)
while(!all(a<b)){
    a = rnorm(100)
    b = rnorm(100,10)
}

#create a mix
mix = c(a,b)

#"forget" the original distributions
rm(a)
rm(b)

#try to find the break point between the distributions
break_point = optimize(
    f = function(x){
        data_from_a = mix[mix<x]
        likelihood = dnorm(data_from_a,mean(data_from_a),sd(data_from_a))
        SLL = sum(log(likelihood))
        return(SLL)
    }
    , interval = c(sort(mix)[2],max(mix))
    , maximum = TRUE
)$maximum

#label the data
labelled_mix = data.frame(
    x = mix
    , source = ifelse(mix<break_point,'A','B')
)
print(labelled_mix)

यदि आप पूर्ण पृथक्करण का अनुमान नहीं लगा सकते हैं, तो मुझे लगता है कि आपको दूसरे वितरण के लिए कुछ वितरण ग्रहण करना होगा और फिर मिश्रण मॉडलिंग का उपयोग करना होगा। ध्यान दें कि मिश्रण मॉडलिंग वास्तव में व्यक्तिगत डेटा बिंदुओं को लेबल नहीं करेगा, लेकिन आपको मिश्रण वितरण और प्रत्येक वितरण के मापदंडों का अनुमान देगा (उदाहरण के लिए, एसडी, आदि)।


optimizeजैसा कि मैं समझता हूं, दो वितरणों की आवश्यकता है। मेरे मामले में एक दूसरे के अंदर है, यानी, दूसरी आबादी के मूल्य सीमा के दोनों ओर हैं।
साइलेंटगॉस्ट

1

मुझे आश्चर्य है कि किसी ने भी स्पष्ट समाधान का सुझाव नहीं दिया:

 #generate completely separated data
library(robustbase)
set.seed(123)  
x<-rnorm(200)
x[1:40]<-x[1:40]+10  
x[41:80]<-x[41:80]-10
Rob<-ltsReg(x~1,nsamp="best")
#all the good guys
which(Rob$raw.weights==1)

अब स्पष्टीकरण के लिए: ltsRegपैकेज में फ़ंक्शन robustbase, जब विकल्प के साथ बुलाया जाता है

nsamp="best"

पैदावार (सटीक) एमसीडी वज़न बढ़ाता है। (ये एक एन-वेक्टर 0-1 वेट $raw.weightsऑब्जेक्ट में संग्रहीत हैं । इन्हें पहचानने के लिए एल्गोरिदम एमसीडी अनुमानक (1) है)।

संक्षेप में, ये वज़न के सबसेट के सदस्यों के लिए 1 हैं ।h=(n+2)/2

आयाम एक में, यह सब टिप्पणियों छँटाई से शुरू होता है तो सभी को सन्निहित सबसेट के उपाय की गणना करता है टिप्पणियों: दर्शाने क्रमबद्ध टिप्पणियों के वेक्टर के प्रवेश, यह के उपाय की गणना करता है ( जैसे तो और बहुत आगे है ... ) तो छोटे उपाय के साथ एक बरकरार रखती है।एक्स ( मैं ) मैं टी एच ( एक्स ( 1 ) , , एक्स ( + 1 ) ) ( एक्स ( 2 ) , , एक्स ( + 2 ) )hx(i)ith
(x(1),...,x(h+1))(x(2),...,x(h+2))

यह एल्गोरिथ्म मानता है कि आपकी रुचि का समूह मूल नमूने का एक सख्त बहुमत है और यह एक सममित वितरण है (लेकिन शेष अवलोकन के वितरण पर कोई परिकल्पना नहीं है )।nh

(1) पीजे रूससी (1984)। वर्गों के प्रतिगमन के कम से कम मध्यस्थ, अमेरिकी सांख्यिकीय एसोसिएशन के जर्नल।

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