我想知道是否有可能为R中的给定连续分布绘制理论密度直方图?
通过理论直方图,我的意思是不基于R中可用的随机变量生成器的直方图(例如,hist(rnorm(1e4))
)。相反, 与用户定义的支持相关的连续分布的概率密度函数( pdf )完全匹配 的直方图(即,可调中断的随机变量范围。
作为R中的一个例子,我们知道支持-5
到5
的标准正态分布的 pdf 是 理论上形状像通过以下R代码获得 。
在R中,我们可以将这个精确的理论pdf转换为相应的理论密度直方图吗?有关如何在R中完成此操作的任何建议吗?
c = curve(dnorm(x), -5, 5, n = 1e4)
答案 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)