在直方图上叠加正态分布

时间:2011-11-13 11:59:05

标签: r ggplot2 histogram normal-distribution

  

可能重复:
  ggplot2: Overlay histogram with density curve

抱歉可能是一个简单的问题,但我有点问题。

我创建了一个基于二项分布的直方图,其中均值= 0.65,sd = 0.015,含10000个样本。直方图本身看起来很好。但是,我需要在此基础上覆盖正态分布(具有相同的均值和标准差)。目前,我有以下内容:

qplot(x,data = prob,geom =“histogram”,binwidth = .05)+ stat_function(geom =“line”,fun = dnorm,arg = list(mean = 0.65,sd = 0.015))

分布显示,但它是TINY。这可能是因为平均值计数上升到近2,000,而正态分布要小得多。简而言之,它不像R自动执行的那样配备数据。有没有办法指定正态分布的线以适合直方图,或者是否有某种方法可以操纵直方图以适应正态分布?

提前致谢。

2 个答案:

答案 0 :(得分:2)

@daroczig的答案是正确的,需要在绘制密度而不是计数时保持一致,但是:我很难看到你如何设法获得具有这些属性的二项式样本。特别是,二项式的平均值为n*p,方差为n*p*(1-p),标准差为sqrt(n*p*(1-p)),因此..

b.m <- 0.65
b.sd <- 0.015

计算方差:

b.v <- b.sd^2  ## n*p*(1-p)

计算p

## (1-p) = b.v/(n*p) = b.v/b.m
## p = 1-b.v/b.m
b.p <- 1-b.v/b.m

计算n

## n = n*p/p = b.m/b.p
b.n <- b.m/b.p

这会给n=0.6502251p=0.9996538 - 所以我看不出如何在没有n<1的情况下获得这个二项分布,除非我弄乱了代数......

答案 1 :(得分:1)

“分布很小”,因为您正在计数上绘制密度函数。您应该在两个图中使用相同的度量标准,例如:

我尝试为您的示例生成一些数据:

x <- rbinom(10000, 10, 0.15)
prob <- data.frame(x=x/(mean(x)/0.65))

并将其绘制为密度函数

library(ggplot2)
ggplot(prob, aes(x=x)) + geom_histogram(aes(y = ..density..), binwidth=.05) + stat_function(geom="line", fun=dnorm, arg=list(mean=0.65, sd=0.015))

enter image description here