मैं आर में शून्य-फुलाया पैरामीटर के घनत्व का अनुमान कैसे लगा सकता हूं?


10

मेरे पास बहुत सारे शून्य के साथ एक डेटा सेट है जो इस तरह दिखता है:

set.seed(1)
x <- c(rlnorm(100),rep(0,50))
hist(x,probability=TRUE,breaks = 25)

मैं इसके घनत्व के लिए एक रेखा खींचना चाहूंगा, लेकिन density()फ़ंक्शन एक चलती हुई खिड़की का उपयोग करता है जो एक्स के नकारात्मक मूल्यों की गणना करता है।

lines(density(x), col = 'grey')

एक density(... from, to)तर्क है, लेकिन ये केवल गणना को छोटा करते हैं, न कि खिड़की को बदल देते हैं ताकि 0 पर घनत्व डेटा के अनुरूप हो जैसा कि निम्नलिखित कथानक द्वारा देखा जा सकता है:

lines(density(x, from = 0), col = 'black')

(यदि प्रक्षेप बदल दिया गया था, तो मैं उम्मीद करूंगा कि काली रेखा ग्रे लाइन की तुलना में 0 पर अधिक घनत्व होगी)

क्या इस फ़ंक्शन के विकल्प हैं जो शून्य पर घनत्व की बेहतर गणना प्रदान करेंगे?

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

जवाबों:


14

घनत्व शून्य पर अनंत है क्योंकि इसमें एक असतत स्पाइक शामिल है। आपको शून्य के अनुपात का उपयोग करके स्पाइक का अनुमान लगाने की आवश्यकता है, और फिर घनत्व के सकारात्मक भाग का अनुमान है कि यह चिकनी है। केडीई बाएं हाथ के छोर पर समस्या पैदा करेगा क्योंकि यह नकारात्मक मूल्यों पर कुछ भार डालेगा। एक उपयोगी दृष्टिकोण लॉग में बदलना है, केडीई का उपयोग करके घनत्व का अनुमान लगाना है, और फिर वापस बदलना है। देखें वैंड, भूरा और Ruppert (JASA 1991) एक संदर्भ के लिए।

निम्नलिखित आर फ़ंक्शन रूपांतरित घनत्व करेगा:

logdensity <- function (x, bw = "SJ") 
{
    y <- log(x)
    g <- density(y, bw = bw, n = 1001)
    xgrid <- exp(g$x)
    g$y <- c(0, g$y/xgrid)
    g$x <- c(0, xgrid)
    return(g)
}

फिर निम्नलिखित आप चाहते हैं कि भूखंड दे देंगे:

set.seed(1)
x <- c(rlnorm(100),rep(0,50))
hist(x,probability=TRUE,breaks = 25)
fit <- logdensity(x[x>0]) # Only take density of positive part
lines(fit$x,fit$y*mean(x>0),col="red") # Scale density by proportion positive
abline(v=0,col="blue") # Add spike at zero.

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


पी(एक्स=0)

पी(एक्स=0)

यह काम आ रहा है। fyi: ऐसा प्रतीत होता है कि, हालांकि bw = "SJ" अप्रतिष्ठित स्थान में घनत्व को प्रभावित करता है, logdensity "SJ" और डिफ़ॉल्ट "nrd0" का उपयोग करने के लिए समान है ... मैं SJ संदर्भ को पढ़ने वाला हूं: "Sheather जोन्स (1991) कर्नेल घनत्व आकलन के लिए एक विश्वसनीय डेटा-आधारित बैंडविड्थ चयन विधि। " jstor.org/stable/2345597
Abe

4

मैं रोब Hyndman से सहमत हूँ कि आपको अलग से शून्य से निपटने की आवश्यकता है। 'परावर्तन ’,' रेननॉर्मलिज़ेशन’ और combination लीनियर कॉम्बिनेशन ’सहित, बाउंड सपोर्ट के साथ एक चर के कर्नेल घनत्व अनुमान से निपटने के कुछ तरीके हैं। ये R के densityफ़ंक्शन में लागू नहीं किए गए हैं, लेकिन Stata के लिए Benn Jann के kdensपैकेज में उपलब्ध हैं ।


1

एक अन्य विकल्प जब आपके पास लॉजिकल बाउंड बाउंड के साथ डेटा होता है (जैसे 0, लेकिन अन्य मान हो सकते हैं) जो आपको पता है कि डेटा नीचे नहीं जाएगा और नियमित कर्नेल घनत्व अनुमान मान को उस बाउंड से नीचे रखता है (या यदि आपके पास ऊपरी सीमा है या दोनों) लॉग्सलाइन अनुमानों का उपयोग करना है। R के लिए लॉगस्लाइन पैकेज इन पर लागू होता है और कार्यों में सीमा निर्दिष्ट करने के लिए तर्क होते हैं इसलिए अनुमान बाउंड तक जाएगा, लेकिन परे और अभी भी 1 के पैमाने पर नहीं।

ऐसे तरीके ( oldlogsplineफ़ंक्शन) भी हैं जो अंतराल अंतराल को ध्यान में रखते हैं, इसलिए यदि वे 0 सटीक 0 नहीं हैं, लेकिन गोल हैं ताकि आप जानते हैं कि वे 0 और कुछ अन्य संख्याओं (उदाहरण के लिए एक पता लगाने की सीमा) के बीच मूल्यों का प्रतिनिधित्व करते हैं तो आप फिटिंग फ़ंक्शन को वह जानकारी दे सकता है।

यदि अतिरिक्त 0 सच 0 हैं (गोल नहीं हैं) तो स्पाइक या बिंदु द्रव्यमान का आकलन करना बेहतर दृष्टिकोण है, लेकिन लॉगस्पलाइन अनुमान के साथ भी जोड़ा जा सकता है।


0

आप बैंडविड्थ कम करने की कोशिश कर सकते हैं (नीली रेखा इसके लिए है adjust=0.5), यहां छवि विवरण दर्ज करें

लेकिन शायद केडीई ऐसे डेटा से निपटने का सबसे अच्छा तरीका नहीं है।


क्या कोई और तरीका है जिसे आप सुझाएंगे?
अबे

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