Как подогнать отрицательную биномиальную, нормальную и пуассоновскую функции плотности на том же ggplot2 (R), но масштабированном к данным подсчета? - PullRequest
4 голосов
/ 11 апреля 2020

У меня есть данные подсчета. Я хочу построить гистограмму с данными подсчета и добавить отрицательную биномиальную, нормальную и функцию плотности Пуассона, но подгонять функции к данным подсчета.

Я пытался следовать этому примеру , но (a) у меня проблемы с подгонкой отрицательных биномиальных и пуассоновских функций (b) Нет места, где можно приблизить масштабирование до уровня данных счета (c) Не знаю, как разместить все три на одном графике с легендами для каждой строки (d) Кроме того, как я могу получить базовые c характеристики каждого соответствия? например, отрицательное биномиальное соответствие будет генерировать параметр 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)

Ответы [ 2 ]

3 голосов
/ 11 апреля 2020

У вас есть несколько проблем, во-первых "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"))

Наконец, если мы хотим масштабировать по счетчикам, как показано в этого ответа , мы просто определяем анонимные функции.

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)

enter image description here

0 голосов
/ 11 апреля 2020

Решение для плотности Пуассона.

library(MASS)
library(ggplot2)
ggplot(df, aes(x = counts)) + 
  geom_histogram(aes(y=..density..),colour = "black", fill = "white", bins=20) +
  stat_function(fun=dpois, args=fitdistr(df$counts,"poisson")$estimate, 
                xlim=c(0,19), n=20, size=1) +
  theme_bw()

enter image description here

А вот решение для отрицательного бинома.

ggplot(df, aes(x = counts)) + 
  geom_histogram(aes(y=..density..),colour = "black", fill = "white", bins=20) +
  stat_function(fun=dnbinom, 
                args=fitdistr(df$counts,"negative binomial", method="SANN")$estimate, 
                xlim=c(0,19), n=20, size=1) +
  theme_bw()

enter image description here

...