आर में एक हिस्टोग्राम के लिए एक घनत्व वक्र फिटिंग


91

क्या आर में एक फ़ंक्शन है जो एक हिस्टोग्राम के लिए एक वक्र फिट बैठता है?

मान लीजिए कि आपके पास निम्नलिखित हिस्टोग्राम था

hist(c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4)))

यह सामान्य दिखता है, लेकिन यह तिरछा है। मैं एक सामान्य वक्र फिट करना चाहता हूं जिसे इस हिस्टोग्राम के चारों ओर लपेटने के लिए तिरछा किया गया है।

यह सवाल बल्कि बुनियादी है, लेकिन मैं इंटरनेट पर आर के लिए जवाब खोजने के लिए प्रतीत नहीं कर सकता।


क्या आप मी और एस को ऐसे खोजना चाहते हैं कि गॉसियन वितरण एन (एम, एस) आपके डेटा पर फिट बैठता है?
स्टीननरहेम

मुझे यकीन नहीं है कि इसका क्या मतलब है ...> _>
user5243421

10
@ मथे: मुझे लगता है कि उनका मतलब मी = माध्य और मानक विचलन है। गौसियन वितरण सामान्य वितरण का दूसरा नाम है।
पीटर मोर्टेंसन

जवाबों:


154

अगर मैं आपके प्रश्न को सही ढंग से समझ पाऊं, तो आप शायद हिस्टोग्राम के साथ एक घनत्व का अनुमान चाहते हैं:

X <- c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4))
hist(X, prob=TRUE)            # prob=TRUE for probabilities not counts
lines(density(X))             # add a density estimate with defaults
lines(density(X, adjust=2), lty="dotted")   # add another "smoother" density

एक लंबे समय बाद संपादित करें:

यहाँ थोड़ा और कपड़े पहने संस्करण है:

X <- c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4))
hist(X, prob=TRUE, col="grey")# prob=TRUE for probabilities not counts
lines(density(X), col="blue", lwd=2) # add a density estimate with defaults
lines(density(X, adjust=2), lty="dotted", col="darkgreen", lwd=2) 

ग्राफ के साथ यह उत्पादन:

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


3
+1 - क्या आप इसे हिस्टोग्राम फिट करने के लिए घनत्व प्लॉट को समायोजित करने के अलावा, दूसरे तरीके से भी कर सकते हैं?
वॉनजड

2
मेरा सुझाव है lines(density(X,na.rm= TRUE)कि वेक्टर के रूप में अतिरिक्त मान देने के लिए NA मान हो सकते हैं।
अनिरुद्ध

30

ऐसी बात ggplot2 के साथ आसान है

library(ggplot2)
dataset <- data.frame(X = c(rep(65, times=5), rep(25, times=5), 
                            rep(35, times=10), rep(45, times=4)))
ggplot(dataset, aes(x = X)) + 
  geom_histogram(aes(y = ..density..)) + 
  geom_density()

या डिर्क के समाधान से परिणाम की नकल करने के लिए

ggplot(dataset, aes(x = X)) + 
  geom_histogram(aes(y = ..density..), binwidth = 5) + 
  geom_density()

28

यहाँ मैं ऐसा कर रहा हूँ:

foo <- rnorm(100, mean=1, sd=2)
hist(foo, prob=TRUE)
curve(dnorm(x, mean=mean(foo), sd=sd(foo)), add=TRUE)

एक बोनस व्यायाम ggplot2 पैकेज के साथ ऐसा करने के लिए है ...


हालाँकि, यदि आप कुछ ऐसा चाहते हैं, जो तिरछा हो, तो आप या तो ऊपर से घनत्व का उदाहरण दे सकते हैं, अपने डेटा को परिवर्तित कर सकते हैं (जैसे foo.log & lt; - log (foo) और ऊपर की कोशिश करें), या एक तिरछा वितरण फिटिंग करने का प्रयास करें, जैसे कि गामा या लोगनॉर्मल (लॉगनॉर्मल लॉग को लेने और सामान्य, बीडब्ल्यूटी को फिट करने के बराबर है)।
जॉन जॉनसन

2
लेकिन फिर भी पहले आपके वितरण के मापदंडों का अनुमान लगाना आवश्यक है।
डिर्क एडल्डबुलेटेल

यह केवल R पर चर्चा करने से थोड़ा दूर हो जाता है, क्योंकि हम सैद्धांतिक आँकड़ों में अधिक हो रहे हैं, लेकिन आप गामा के लिए इस लिंक को आज़मा सकते हैं: en.wikipedia.org/wiki/Gamma_distribution#Parameter-estimation lognormal के लिए, बस लॉग इन करें (मान लें सभी डेटा सकारात्मक है) और लॉग-ट्रांसफ़ॉर्म किए गए डेटा के साथ काम करते हैं। किसी भी चीज के लिए, मुझे लगता है कि आपको एक पाठ्यपुस्तक के साथ काम करना होगा।
जॉन जॉनसन

3
मुझे लगता है कि आप गलत समझ रहे हैं कि दोनों मूल पोस्टर के साथ-साथ अन्य सभी उत्तरों में गैर-पैरामीट्रिक अनुमानों का उपयोग करने के लिए काफी सामग्री है - जैसे कि एक पुराने स्कूल के हिस्टोग्राम या कुछ हद तक आधुनिक डेटा-संचालित डेंसिस्टी अनुमान। यदि आपके पास वितरण पर संदेह करने का अच्छा कारण है, तो पैरामीट्रिक अनुमान बहुत अच्छे हैं। लेकिन यहां ऐसा नहीं था।
डिर्क एडल्डबुलेटेल

11

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

> sn.mle(y=c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4)))
$call
sn.mle(y = c(rep(65, times = 5), rep(25, times = 5), rep(35, 
    times = 10), rep(45, times = 4)))

$cp
    mean     s.d. skewness 
41.46228 12.47892  0.99527 

तिरछा-सामान्य वितरित डेटा प्लॉट

यह संभवतः अधिक तिरछा-सामान्य डेटा पर बेहतर काम करता है:

एक और तिरछा-सामान्य भूखंड


3

मैं एक ही समस्या थी, लेकिन डिर्क का समाधान काम नहीं कर रहा था। मुझे यह चेतावनी हर बार मिल रही थी

"prob" is not a graphical parameter

मैंने पढ़ा ?histऔर पायाfreq: a logical vector set TRUE by default.

मेरे लिए काम करने वाला कोड है

hist(x,freq=FALSE)
lines(density(x),na.rm=TRUE)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.