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

时间:2017-06-22 19:19:08

标签: r plot histogram distribution

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

你可以用理论累积密度做得很好。通过获取区域任一端的累积分布值之间的差异,可以得出应该为每个区域分配多少概率。这些应该按区域的宽度加权。以下示例使用正态分布。

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) 

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

答案 1 :(得分:1)

对于任意函数,请使用积分函数:

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)

enter image description here