आर में गैर-नकारात्मक चर के घनत्व भूखंडों के लिए अच्छे तरीके?


36
plot(density(rexp(100))

जाहिर है शून्य के बाईं ओर सभी घनत्व पूर्वाग्रह का प्रतिनिधित्व करते हैं।

मैं गैर-सांख्यिकीविदों के लिए कुछ डेटा को संक्षेप में प्रस्तुत करना चाह रहा हूं, और मैं इस सवाल से बचना चाहता हूं कि गैर-नकारात्मक डेटा में शून्य के बाईं ओर घनत्व क्यों है। भूखंड यादृच्छिकता जाँच के लिए हैं; मैं उपचार और नियंत्रण समूहों द्वारा चर के वितरण को दिखाना चाहता हूं। वितरण अक्सर घातीय-ईश होते हैं। हिस्टोग्राम विभिन्न कारणों से मुश्किल हैं।

एक त्वरित Google खोज मुझे गैर-नकारात्मक गुठली पर सांख्यिकीविदों द्वारा काम देता है, जैसे: यह

लेकिन क्या इसे आर में लागू किया गया है? कार्यान्वित तरीकों में से, किसी भी तरह से वर्णनात्मक आंकड़ों के लिए "सर्वश्रेष्ठ" हैं?

संपादित करें: भले ही fromकमांड मेरी वर्तमान समस्या को हल कर सकता है, यह जानना अच्छा होगा कि क्या किसी ने गैर-नकारात्मक घनत्व आकलन पर साहित्य के आधार पर गुठली को लागू किया है या नहीं


3
यह नहीं कि आप क्या पूछ रहे हैं, लेकिन मैं कुछ के लिए कर्नेल घनत्व अनुमान लागू नहीं करूंगा, जो घातीय होना चाहिए, विशेष रूप से गैर-सांख्यिकीय दर्शकों के लिए प्रस्तुति के लिए। मैं एक क्वांटाइल-क्वांटाइल प्लॉट का उपयोग करता हूं और समझाता हूं कि यदि वितरण घातीय था, तो प्लॉट सीधा होना चाहिए।
निक कॉक्स

6
plot(density(rexp(100), from=0))?
स्टीफन लॉरेंट

4
एक चीज जो मैंने कभी-कभी काफी सफलतापूर्वक की है, वह है लॉग पर केडी प्राप्त करना, और फिर घनत्व का अनुमान बदलना (जैकब को न भूलना)। एक और संभावना यह होगी कि लॉग-स्लाइन घनत्व के अनुमान का उपयोग किया जाए ताकि यह बाध्यता के बारे में जान सके।
Glen_b


1
मैंने @ glen_b द्वारा stata-journal.com/sjpdf.html?articlenum=gr0003 (pp.76-78 देखें) में उल्लिखित परिवर्तन विधि पर चर्चा की । शून्य को लॉग के बजाय लॉग (x + 1) का उपयोग करके समायोजित किया जा सकता है और याकूब को संशोधित कर सकता है।
निक कॉक्स

जवाबों:


21

स्थानिक आँकड़ों के किनारे-भार के दृष्टिकोण से उधार लिया गया एक समाधान, शून्य पर बाईं ओर घनत्व को कम करना है, लेकिन शून्य से निकटतम डेटा को वज़न से ऊपर करना है। विचार यह है कि प्रत्येक मान है पर केन्द्रित इकाई कुल क्षेत्रफल का एक कर्नेल में "स्प्रेड" है ; कर्नेल का कोई भी भाग जो नकारात्मक क्षेत्र में फैल जाएगा और कर्नेल को इकाई क्षेत्र में बदल दिया जाता है।एक्सxx

उदाहरण के लिए, एक गाऊसी कर्नेल , रद्दीकरण वजन हैKh(y,x)=exp(12((yx)/h)2)/2π

w(x)=1/0K(y,x)dy=11Φx,h(0)

जहाँ औसत और मानक विचलन के एक सामान्य संस्करण का संचयी वितरण कार्य है । तुलनात्मक सूत्र अन्य गुठली के लिए उपलब्ध हैं।x Φxh

यह सरल है - और संगणना में बहुत तेज - पास बैंडविंड्स को संकीर्ण करने की कोशिश करने से । वास्तव में यह बताना मुश्किल है कि कैसे बैंडविद को पास बदला जाना चाहिए , वैसे भी। फिर भी, यह विधि तदर्थ भी है : पास अभी भी कुछ पूर्वाग्रह होंगे । यह डिफ़ॉल्ट घनत्व अनुमान से बेहतर काम करता प्रतीत होता है। यहाँ एक लार्जिश डेटासेट का उपयोग करके तुलना की गई है:000

आकृति

लाल डिफ़ॉल्ट घनत्व दिखाता है जबकि लाल पर किनारे के लिए समायोजित घनत्व दिखाता है । सही अंतर्निहित वितरण को संदर्भ के लिए एक बिंदीदार रेखा के रूप में पता लगाया जाता है।0


आर कोड

इस densityसमारोह में Rशिकायत होगी कि भार का योग एकता नहीं है, क्योंकि यह चाहता है कि सभी वास्तविक संख्याओं पर अभिन्नता एकता हो, जबकि यह दृष्टिकोण एकता के बराबर सकारात्मक संख्याओं पर अभिन्न बनाता है। एक जांच के रूप में, बाद के अभिन्न को रीमैन योग के रूप में अनुमानित किया गया है।

set.seed(17)
x <- rexp(1000)
#
# Compute a bandwidth.
#
h <- density(x, kernel="gaussian")$bw # $
#
# Compute edge weights.
#
w <- 1 / pnorm(0, mean=x, sd=h, lower.tail=FALSE)
#
# The truncated weighted density is what we want.
#
d <- density(x, bw=h, kernel="gaussian", weights=w / length(x))
d$y[d$x < 0] <- 0
#
# Check: the integral ought to be close to 1:
#
sum(d$y * diff(d$x)[1])
#
# Plot the two density estimates.
#
par(mfrow=c(1,1))
plot(d, type="n", main="Default and truncated densities", xlim=c(-1, 5))
polygon(density(x, kernel="gaussian", bw=h), col="#6060ff80", border=NA)
polygon(d, col="#ff606080", border=NA)
curve(exp(-x), from=0, to=max(x), lty=2, add=TRUE)

21

एक विकल्प कोपरबर्ग और सहकर्मियों का दृष्टिकोण है, डेटा के लॉग-घनत्व को अनुमानित करने के लिए स्प्लिन का उपयोग करके घनत्व का अनुमान लगाने पर आधारित है। मैं @ व्हिबर के उत्तर से डेटा का उपयोग करके एक उदाहरण दिखाऊंगा, जो दृष्टिकोण की तुलना के लिए अनुमति देगा।

set.seed(17)
x <- rexp(1000)

आपको इसके लिए स्थापित लॉगस्पलाइन पैकेज की आवश्यकता होगी ; इसे स्थापित करें यदि यह नहीं है:

install.packages("logspline")

पैकेज लोड करें और logspline()फ़ंक्शन का उपयोग करके घनत्व का अनुमान लगाएं :

require("logspline")
m <- logspline(x)

निम्नलिखित में, मैं मानता हूं कि d@ व्हिबर के उत्तर से वस्तु कार्यक्षेत्र में मौजूद है।

plot(d, type="n", main="Default, truncated, and logspline densities", 
     xlim=c(-1, 5), ylim = c(0, 1))
polygon(density(x, kernel="gaussian", bw=h), col="#6060ff80", border=NA)
polygon(d, col="#ff606080", border=NA)
plot(m, add = TRUE, col = "red", lwd = 3, xlim = c(-0.001, max(x)))
curve(exp(-x), from=0, to=max(x), lty=2, add=TRUE)
rug(x, side = 3)

परिणामी प्लॉट नीचे दिखाया गया है, जिसमें लॉग लाइनलाइन घनत्व लाल रेखा द्वारा दिखाया गया है

डिफ़ॉल्ट, छंटनी की गई और लॉगस्पैन घनत्व

इसके अतिरिक्त, घनत्व का समर्थन तर्कों lboundऔर के माध्यम से निर्दिष्ट किया जा सकता है ubound। अगर हम यह मान लें कि घनत्व 0 से 0 के बाईं ओर है और 0 पर एक असंतोष है, तो हम lbound = 0कॉल में उपयोग कर सकते हैं logspline(), उदाहरण के लिए

m2 <- logspline(x, lbound = 0)

निम्नलिखित घनत्व का अनुमान लगाना ( mपिछले लॉग पहले से ही व्यस्त होने के कारण मूल लॉगस्लाइन फिट के साथ यहां दिखाया गया है)।

plot.new()
plot.window(xlim = c(-1, max(x)), ylim = c(0, 1.2))
title(main = "Logspline densities with & without a lower bound",
      ylab = "Density", xlab = "x")
plot(m,  col = "red",  xlim = c(0, max(x)), lwd = 3, add = TRUE)
plot(m2, col = "blue", xlim = c(0, max(x)), lwd = 2, add = TRUE)
curve(exp(-x), from=0, to=max(x), lty=2, add=TRUE)
rug(x, side = 3)
axis(1)
axis(2)
box()

परिणामी भूखंड नीचे दिखाया गया है

लॉगस्पलाइन घनत्व अनुमानों की तुलना और समर्थन पर कम बाध्य के बिना

इस मामले में, xएक घनत्व अनुमान में परिणामों के ज्ञान का दोहन जो पर 0 तक नहीं होता है , लेकिन मानक logspline के समान है जो कहीं और फिट होता हैx=0x


1
+1 यह विचार मुझे पसंद है लेकिन मुझे आश्चर्य है कि यह उदाहरण डेटा (एक घातांक वितरण से) के साथ इतनी अच्छी तरह से काम करता है । क्या आपके पास कुछ अंतर्ज्ञान है क्यों? कुछ अर्थों में यह पास बहुत अच्छा करता है, लेकिन यह वास्तविक डेटा में पास मूल्यों की "गांठ" को याद कर रहा है, इसलिए मुझे आश्चर्य है कि क्या कम मूल्यों और कम सटीकता (या इसके बराबर) पर अच्छी सटीकता के बीच किसी प्रकार का व्यापार बंद नहीं है , उच्च मूल्यों पर)। 101
whuber

@ शुभ प्रश्न मैं केवल हाल ही में इस दृष्टिकोण में आया था। मुझे लगता है कि यहाँ एक अच्छा सवाल यह है कि जिस तरह से काट-छाँट और लॉगस्पलाइन विधियां सही घनत्व का अनुमान लगा रही हैं, क्या वे फिट के अंतर में महत्वपूर्ण हैं, सांख्यिकीय रूप से? मुझे यकीन नहीं है कि यह शून्य पर इतना अच्छा क्यों करता है, हालांकि। मैं जानना चाहूंगा कि क्यों।
मोनिका को बहाल करें - जी। सिम्पसन

@GavinSimpson, इस अच्छे उत्तर के लिए धन्यवाद। आप के अंतिम संस्करण के साथ पिछले साजिश को पुन: पेश कर सकते हैं logspline? मेरे लिए, दोनों का घनत्व और बंधे-बंधाए संस्करण शून्य हो जाते हैं x = 0
cel

4

समूहों द्वारा वितरण की तुलना करने के लिए (जो आप कहते हैं कि आपकी टिप्पणियों में से एक में लक्ष्य है) कुछ सरल क्यों नहीं? यदि N बड़ा है तो समानांतर बॉक्स प्लॉट अच्छी तरह से काम करते हैं; समांतर स्ट्रिप प्लॉट काम करते हैं यदि N छोटा है (और दोनों आउटलेर को अच्छी तरह से दिखाते हैं, जो आप कहते हैं कि आपके डेटा में एक समस्या है)।


1
हाँ, धन्यवाद, यह काम करता है। लेकिन मुझे घनत्व वाले प्लॉट पसंद हैं। वे बॉक्सप्लॉट्स की तुलना में डेटा के बारे में अधिक दिखाते हैं। मुझे लगता है कि मैं इस तरह से हैरान हूं कि लगता है कि कुछ भी पहले से लागू नहीं हुआ है। हो सकता है कि मैं इन चीजों में से एक को खुद एक दिन लागू करूं। लोगों को शायद यह उपयोगी लगेगा।
जेनेरिक_युसर 10

1
मुझे घनत्व प्लॉट भी पसंद हैं; लेकिन आपको अपने दर्शकों पर विचार करना होगा।
पीटर Flom - को पुनः स्थापित मोनिका

1
इस पर @PeterFlom से सहमत होना होगा। यदि आपके दर्शक सांख्यिकीय रूप से जानकार नहीं हैं, तो बहुत जटिल न हों। आप शीर्ष पर तितली भूखंडों के ओवरले के साथ तुलनात्मक / समानांतर बॉक्स-प्लॉट भी कर सकते थे। इस तरह से बॉक्स-प्लॉट सारांश के साथ-साथ सभी डेटा दिखाई देते हैं।
doug.numbers

यह सुझाव कि अलग-अलग लोग समग्र भूखंडों को अलग-अलग समझ लेते हैं, निश्चित रूप से सही है। यह समझने के बावजूद कि एक घनत्व प्लॉट क्या है (और यह समझ कि यह संभावना नहीं है) मुझे इस बात की कोई समझ नहीं है कि आप "समानांतर बॉक्सप्लेट" क्या हो सकते हैं। यह एक समानांतर निर्देशांक साजिश का सुझाव देता है लेकिन मुझे संदेह है कि यह सही नहीं है।
ड्विन

2

स्टीफन टिप्पणियों के रूप में आप उपयोग कर सकते हैं from = 0और, इसके अतिरिक्त, आप घनत्व वक्र के साथ अपने मूल्यों का प्रतिनिधित्व कर सकते हैंrug (x)


4
मुझे सही करें अगर मैं गलत हूं, लेकिन from=0ऐसा लगता है जैसे यह सिर्फ 0 से नीचे के मूल्यों के लिए साजिश रचता है; यह इस तथ्य के लिए गणना को सही नहीं करता है कि वितरण में से कुछ नीचे स्मियर किया गया है
निक कॉक्स

1
वह सही है। fromकमांड का उपयोग करने से एक प्लॉट मिलता है जो ऐसा दिखता है जैसे कि यह शून्य के ठीक शिखर पर है। लेकिन अगर आप हिस्टोग्राम को लगातार छोटे डिब्बे से देखते हैं, तो बहुत सारा डेटा चरम एटी शून्य दिखाएगा। fromसिर्फ एक चित्रमय चाल है।
जेनेरिक_सियर

@NickCox मुझे यकीन नहीं है, लेकिन मुझे नहीं लगता कि from=0कुछ भी दबा देता है। यह सिर्फ शून्य पर "ग्रिड" शुरू करता है।
स्टीफन लॉरेंट

अंतर यह है कि अनुमानित घनत्व नकारात्मक मानों के लिए गैर-शून्य है, न कि यह प्लॉट किया गया है या नहीं। शोधकर्ता इस बारे में चिंता न करने का निर्णय ले सकते हैं कि यदि वे चाहते हैं तो यह एक दृश्य है।
निक कॉक्स

@NickCox कमांड density(rexp(100), from=0)का ग्राफिक से कोई लेना-देना नहीं है
स्टीफन लॉरेंट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.