【问题标题】:Overlay barplot with negative binomial/poisson distribution具有负二项式/泊松分布的叠加条形图
【发布时间】:2014-12-11 18:45:36
【问题描述】:

如何使用相同的均值和方差将我的条形图与估计的负二项式密度函数叠加在真实数据上?

library(data.table)
library(ggplot2)

temp <- data.table(cbind(V1=c(1,2,3,4,5,9), N=c(50,40,30,20,10,2)))

ggplot(temp, aes(x=V1, y= N)) +
  geom_histogram(stat="identity", binwidth = 2.5) +
  scale_y_continuous(breaks=c(0, 100, 200, max(temp$N))) +
  scale_x_continuous(breaks=c(0, 100, 200, max(temp$V1))) +
  theme(panel.grid.minor.x=element_blank(),
        panel.grid.major.x=element_blank()
  )

我尝试添加stat_function(fun = dnbinom, args = list(size=1, mu = mean(temp$V1)), color="red"),但我看到的只是横坐标上的一条红线。 dpois(与lambda=mean(temp$V1))和dnorm(与mean = mean(temp$V1), sd = sd(temp$V1))相同。

也许我的参数化有误?

【问题讨论】:

  • 您提到的三个分布函数中,只有dnorm() 带参数meansd。您是否尝试过更改stat_function() 调用中的参数以匹配dnbinom() 的要求?
  • 很好的提示,谢谢。事实上,我错过了这些分布的参数化。现在至少我有一条红线。
  • 红线的平坦度可能是比例问题——密度函数层的最大 y 值应小于 1,而直方图层的最大 y 值为 50。一种解决方案可能是使用 aes(x=V1, y= N/sum(temp$N)) 之类的东西重新缩放直方图。

标签: r ggplot2 bar-chart


【解决方案1】:

@mmk 是正确的:规范化是关键。以下是实现您想要的目标的方法:

#simplest normalization
temp$Nmod <- temp$N / sum(temp$N)
#alternative normalization
#temp$Nmod <- temp$N / sqrt(sum(temp$N * temp$N))
temp$pois <- dpois(temp$V1, lambda = mean(temp$V1))
temp$nbinom <- dnbinom(temp$V1, mu = mean(temp$V1), size = 1)
ggplot(temp, aes(x=V1, y= Nmod)) +
  geom_histogram(stat="identity", binwidth = 2.5) +
  theme(panel.grid.minor.x=element_blank(),
       panel.grid.major.x=element_blank()) + 
  geom_line(aes(y = pois), col = "red") + 
  geom_line(aes(y = nbinom), col = "blue")

【讨论】: