如何在相同的 ggplot2 (R) 上拟合负二项式、正态和泊松密度函数,但缩放到计数数据?

Bio*_*eek 3 r distribution ggplot2 data-fitting

我有一些计数数据。我想用计数数据绘制直方图,并添加负二项式、正态密度函数和泊松密度函数,但将函数拟合到计数数据。

我尝试按照这个示例进行操作,但是(a)我无法拟合负二项式和泊松函数(b)无法将其缩放到计数数据级别(c)不知道如何将所有三个函数拟合到同一个图表上,并为每个函数添加图例(d)行另外,我怎样才能获得每个适合的基本统计数据?例如,负二项式拟合将生成参数 k。我怎样才能让它出现在情节上

set.seed(111)
counts <- rbinom(500,100,0.1) 
df <- data.frame(counts)

ggplot(df, aes(x = counts)) + 
  geom_histogram(aes(y=..density..),colour = "black", fill = "white") +
  stat_function(fun=dnorm,args=fitdistr(df$counts,"normal")$estimate)

ggplot(df, aes(x = counts)) + 
  geom_histogram(aes(y=..density..),colour = "black", fill = "white") +
  stat_function(fun=poisson,args=fitdistr(df$counts,"poisson")$estimate)

ggplot(df, aes(x = counts)) + 
  geom_histogram(aes(y=..density..),colour = "black", fill = "white") +
  stat_function(fun=dnbinom,args=fitdistr(df$counts,"dnbinom")$estimate)
Run Code Online (Sandbox Code Playgroud)

Ian*_*ell 5

您有一些问题,首先"dnbinom"不是 的有效发行版MASS::fitdistr。其次,MASS::fitdistr无法使用默认方法,因此我们可以使用method = "SANN". 第三,stat_function尝试评估dnbinom非整数值,除非你另有说明,这是行不通的。

让参数显示在图例中有点棘手,因为您必须在调用之外估计它们ggplot。我很懒并且习惯了purrr::map2,但是你可以使用一些基本的 R 函数来做同样的事情。

library(purrr)
library(dplyr)
norm.params <- fitdistr(df$counts,"normal")$estimate
poisson.params <- fitdistr(df$counts,"poisson")$estimate
negbinom.params <- fitdistr(df$counts,"negative binomial", method = "SANN")$estimate

dist.params <- map(list(Normal = norm.params,Poisson = poisson.params,`Negative Binomial` = negbinom.params),
    ~ map2(names(.),.,~ paste0(.x," = ",round(.y,2))) %>% unlist %>% paste0(.,collapse = ", ")) %>% 
    map2_chr(names(.),., ~ paste(.x,.y,sep=":\n"))
Run Code Online (Sandbox Code Playgroud)

最后,如果我们想按计数进行缩放,如本答案所示,我们只需定义匿名函数。

mybinwidth = 1
ggplot(df, aes(x = counts)) + 
  geom_histogram(aes(y=..count..),colour = "black", fill = "white", binwidth = mybinwidth) +
  stat_function(aes(color = "black"),fun=function(x,mean,sd) mybinwidth * nrow(df) * dnorm(x,mean, sd),
                args=fitdistr(df$counts,"normal")$estimate) +
  stat_function(aes(color = "blue"),fun=function(x,lambda) mybinwidth * nrow(df) * dpois(x,lambda), 
                args=fitdistr(df$counts,"poisson")$estimate,
                xlim=c(1,20), n=20) + 
  stat_function(aes(color = "orange"),fun=function(x,size, mu) mybinwidth * nrow(df) * dnbinom(x,size = size, mu = mu),
                args=fitdistr(df$counts,"negative binomial", method="SANN")$estimate,
                xlim=c(1,20),n=20) + 
  scale_color_manual("Distribution", values=c(black="black",blue="blue",orange="orange"),
                     labels=dist.params)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述