【发布时间】:2019-08-20 23:14:28
【问题描述】:
我有一个样本均值向量,我一直在尝试使用 hist(x) 和 ggplot 绘制概率直方图,但 bin 超过 1(这对于概率分布来说非常不寻常),然后我使用了 PlotRelativeFrequency( hist(x)) 函数强制 R 绘制概率直方图,它起作用了!但我的问题是,我无法在直方图上绘制密度函数。当我使用 lines(density(x)) 函数时,它会绘制一个远离图表的密度函数。
【问题讨论】:
我有一个样本均值向量,我一直在尝试使用 hist(x) 和 ggplot 绘制概率直方图,但 bin 超过 1(这对于概率分布来说非常不寻常),然后我使用了 PlotRelativeFrequency( hist(x)) 函数强制 R 绘制概率直方图,它起作用了!但我的问题是,我无法在直方图上绘制密度函数。当我使用 lines(density(x)) 函数时,它会绘制一个远离图表的密度函数。
【问题讨论】:
由于你的问题被标记为ggplot,我将给出一个ggplot的答案。
要使直方图相对,您必须设置 aes(y = stat(density)) 使其积分为 1。然后,您可以为 stat_function() 提供任何理论分布的相关密度函数。缺点是您必须预先计算参数。
df <- data.frame(x = rnorm(500, 10, 2))
pars <- list(mean = mean(df$x), sd = sd(df$x))
library(ggplot2)
ggplot(df, aes(x)) +
geom_histogram(binwidth = 1, aes(y = stat(density))) +
stat_function(fun = function(x) {dnorm(x, mean = pars$mean, sd = pars$sd)})
接下来,我们可以使用核密度估计绘制经验密度,这几乎可以自动完成所有操作:
ggplot(df, aes(x)) +
geom_histogram(binwidth = 1, aes(y = stat(density))) +
geom_density()
最后,你可以看看这个stats function,它基本上自动化了第一个版本。完全免责声明:我是那个 github 仓库的作者。
library(ggnomics)
ggplot(df, aes(x)) +
geom_histogram(binwidth = 1, aes(y = stat(density))) +
stat_theodensity()
【讨论】: