用 R 中的 dlnorm 覆盖数据的密度直方图,ggplot

Overlaying data's density histogram with dlnorm in R, ggplot

我使用的是加拿大的人口普查数据,其中 x 轴为变量 Wage,y 轴为密度。我试图覆盖我用对数正态分布 dlnorm 创建的图表,但我不确定使用什么作为 meanlog 和 sdlog 参数值。我试过使用 mean(data$Wages)sd(data$Wages),以及取两者的自然对数等。没有什么能给我一个与我生成的密度直方图相似的图形。

这是因为我的数据不是对数正态的吗?如何找到正确的 meanlog 和 sdlog 参数?

这是我的代码:

inc_plot <- data_adults %>%
  ggplot(aes(x=Wages)) +
  geom_histogram(aes(y=..density..),  bins=100,fill="transparent", colour="black")+
  scale_x_continuous(labels=scales::comma) +
  stat_function(fun = dlnorm,
      args = list(meanlog = 48637.91, sdlog = 62459.15),
      col = "red")

inc_plot

当前参数是使用前面提到的mean()sd()函数。

如果设置 meanlog = mean(log(your_data)) 并且同样 sdlog = sd(log(your_data)) 密度应该接近直方图。

library(ggplot2)


df <- data.frame(x = rlnorm(1e4))

ggplot(df, aes(x)) +
  geom_histogram(
    aes(y = after_stat(density)),
    bins = 100, fill = "transparent", colour = "black"
  ) +
  stat_function(
    fun = dlnorm,
    args = list(meanlog = mean(log(df$x)), sdlog = sd(log(df$x))),
    colour = "red"
  )

reprex package (v2.0.1)

于 2021-08-23 创建

另一种方法是使用 ggh4x::stat_theodensity(distri = "lnorm", colour = "red")。 (免责声明:我是 ggh4x 的作者)