2012-06-27 9 views
8

मैं ggplot का उपयोग कर हिस्टोग्राम पर मनमाने ढंग से पैरामीट्रिक वितरण को कैसे बढ़ा सकता हूं?मैं ggplot का उपयोग कर हिस्टोग्राम पर मनमाने ढंग से पैरामीट्रिक वितरण को कैसे बढ़ा सकता हूं?

मैंने Quick-R example पर आधारित प्रयास किया है, लेकिन मुझे नहीं पता कि स्केलिंग कारक कहां से आता है। क्या यह विधि उचित है? Ggplot का उपयोग करने के लिए मैं इसे कैसे संशोधित कर सकता हूं?

एक उदाहरण इस पद्धति का उपयोग सामान्य और lognormal वितरण overplot इस प्रकार है: Plot produced by the code above, showing a histogram of word length superimposed with a normal distribution curve and a log-normal distribution curve

स्पष्ट करने के लिए, मैं y- अक्ष पर मायने रखता है करने के लिए करना चाहते हैं:

## Get a log-normalish data set: the number of characters per word in "Alice in Wonderland" 
alice.raw <- readLines(con = "http://www.gutenberg.org/cache/epub/11/pg11.txt", 
         n = -1L, ok = TRUE, warn = TRUE, 
         encoding = "UTF-8") 

alice.long <- paste(alice.raw, collapse=" ") 
alice.long.noboilerplate <- strsplit(alice.long, split="\\*\\*\\*")[[1]][3] 
alice.words <- strsplit(alice.long.noboilerplate, "[[:space:]]+")[[1]] 
alice.nchar <- nchar(alice.words) 
alice.nchar <- alice.nchar[alice.nchar > 0] 

# Now we want to plot both the histogram and then log-normal probability dist 
require(MASS) 
h <- hist(alice.nchar, breaks=1:50, xlab="Characters in word", main="Count") 
xfit <- seq(1, 50, 0.1) 

# Plot a normal curve 
yfit<-dnorm(xfit,mean=mean(alice.nchar),sd=sd(alice.nchar)) 
yfit <- yfit * diff(h$mids[1:2]) * length(alice.nchar) 
lines(xfit, yfit, col="blue", lwd=2) 

# Now plot a log-normal curve 
params <- fitdistr(alice.nchar, densfun="lognormal") 
yfit <- dlnorm(xfit, meanlog=params$estimate[1], sdlog=params$estimate[1]) 
yfit <- yfit * diff(h$mids[1:2]) * length(alice.nchar) 
lines(xfit, yfit, col="red", lwd=2) 

यह निम्न साजिश का उत्पादन घनत्व अनुमान के बजाए।

+0

ध्यान दें कि एक सामान्य वितरण शब्दों में सभी के रूप में समझ में नहीं आता है> 0 अक्षर, और मान अलग पूर्णांक हैं; सामान्य निरंतर है। –

+0

सहमत - यह एक आसान डेटासेट के साथ एक खिलौना उदाहरण है। और एक सामान्य वक्र शायद अनुचित है। – fmark

उत्तर

11

() stat_function पर एक नज़र

alice.raw <- readLines(con = "http://www.gutenberg.org/cache/epub/11/pg11.txt", 
         n = -1L, ok = TRUE, warn = TRUE, 
         encoding = "UTF-8") 

alice.long <- paste(alice.raw, collapse=" ") 
alice.long.noboilerplate <- strsplit(alice.long, split="\\*\\*\\*")[[1]][3] 
alice.words <- strsplit(alice.long.noboilerplate, "[[:space:]]+")[[1]] 
alice.nchar <- nchar(alice.words) 
alice.nchar <- alice.nchar[alice.nchar > 0] 
dataset <- data.frame(alice.nchar = alice.nchar) 
library(ggplot2) 
ggplot(dataset, aes(x = alice.nchar)) + geom_histogram(aes(y = ..density..)) + 
    stat_function(fun = dnorm, 
    args = c(
     mean = mean(dataset$alice.nchar), 
     sd = sd(dataset$alice.nchar)), 
    colour = "red") 

enter image description here

आप उदाहरण के रूप में y- अक्ष पर गिना जाता है करना चाहते हैं, तो आप एक समारोह है कि घनत्व धर्मान्तरित की आवश्यकता होगी है मायने रखता है के लिए:

dnorm.count <- function(x, mean = 0, sd = 1, log = FALSE, n = 1, binwidth = 1){ 
    n * binwidth * dnorm(x = x, mean = mean, sd = sd, log = log) 
} 

ggplot(dataset, aes(x = alice.nchar)) + geom_histogram(binwidth=1.6) + 
    stat_function(fun = dnorm.count, 
       args = c(
        mean = mean(dataset$alice.nchar), 
        sd = sd(dataset$alice.nchar), 
        n = nrow(dataset), binwidth=1.6), 
       colour = "red") 

enter image description here

+0

अच्छा। मुझे लगता है कि stat_function नया होना चाहिए। यह मेरे पिछले दृष्टिकोण पर एक बड़ा सुधार है, जो पहले x, dnorm (x,,) का डेटा फ्रेम बनाना था। –

+1

@ डेविड 'stat_function' तब तक रहा है जब तक मुझे याद है! :) – joran

+0

यह बहुत अच्छा है - क्या उपर्युक्त उदाहरण में घनत्व के बजाए वाई-अक्ष पर गणना करना संभव है? – fmark

संबंधित मुद्दे