在 R 中绘制理论密度直方图?

Drawing a theoretical density histogram in R?

我想知道是否可以为 R 中给定的连续分布绘制理论密度直方图?

理论 直方图,我指的是不基于 R 中可用随机变量生成器的直方图(例如,hist(rnorm(1e4)))。相反,直方图 与相关连续分布的概率密度函数 (pdf) 完全匹配 对于用户定义的支持(即,随机变量的范围)和可调整的中断。

作为 R 中的一个例子,我们知道 pdf 的标准正态分布的支持度 -55理论上的形状类似于通过下面的 R 代码获得的形状

在 R 中, 我们可以将 这个精确的理论 pdf 转换为相应的理论密度直方图吗? 关于如何实现的任何建议在 R 中完成?

c = curve(dnorm(x), -5, 5, n = 1e4)

你可以用理论上的累积密度很好地完成这项工作。通过计算区域两端累积分布值之间的差值,您可以获得应分配给每个区域的概率大小。这些应该由区域的宽度加权。下面的示例使用正态分布。

barplot(diff(2*pnorm(c(-Inf, seq(-4,4,0.5), Inf))), ylim=c(0,0.4))

当然,如果你只有密度,没有累积密度,你可能要整合。

请注意,条形图上的 x 轴是 bin 的索引号,而不是实际的 x 值。正因为如此,如果你简单地在上面绘制范数密度函数,它就不会对齐。但是,很容易在坐标中进行线性移动,这将导致 pdf 正确排列。对于此示例,分布的中心位于 10.9,每个宽度为 0.5 的 bin 在新比例中占据 1.2,因此您将 x 转换为 (x-10.9)/2.4。要叠加曲线,请尝试

barplot(diff(2*pnorm(c(-Inf, seq(-4,4,0.5), Inf))), ylim=c(0,0.4))
Shifted = function(x) dnorm((x-10.9)/2.4)
curve(Shifted, 0.5,21.5, add = T) 

抱歉,无法从本机发布图片。

对于任意函数,使用集成函数:

c = curve(dnorm, -5, 5, n = 1e4)
breaks <- pretty(c[[1]], nclass.Sturges(c[[1]]))

bar_x <- sapply(1:(length(breaks)-1), function(i) {
    (breaks[i]+breaks[i+1])/2
})

bar_y <- sapply(1:(length(breaks)-1), function(i) {
    integrate(dnorm, breaks[i], breaks[i+1])$value
})

barplot(bar_y, names.arg=bar_x)