在 R 中绘制理论密度直方图?
Drawing a theoretical density histogram in R?
我想知道是否可以为 R 中给定的连续分布绘制理论密度直方图?
理论 直方图,我指的是不基于 R 中可用随机变量生成器的直方图(例如,hist(rnorm(1e4))
)。相反,直方图 与相关连续分布的概率密度函数 (pdf) 完全匹配 对于用户定义的支持(即,随机变量的范围)和可调整的中断。
作为 R 中的一个例子,我们知道 pdf 的标准正态分布的支持度 -5
到 5
是 理论上的形状类似于通过下面的 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)
我想知道是否可以为 R 中给定的连续分布绘制理论密度直方图?
理论 直方图,我指的是不基于 R 中可用随机变量生成器的直方图(例如,hist(rnorm(1e4))
)。相反,直方图 与相关连续分布的概率密度函数 (pdf) 完全匹配 对于用户定义的支持(即,随机变量的范围)和可调整的中断。
作为 R 中的一个例子,我们知道 pdf 的标准正态分布的支持度 -5
到 5
是 理论上的形状类似于通过下面的 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)