在R中使用hist()
并设置freq=FALSE
时,我应该获得密度。但是,我没有。我得到的其他数字比它只显示计数时要多。我仍需要规范化。
例如:
> h = hist(c(1,2,1,3,1,4,5,4,5,8,2,4,1,7,6,10,7,4,3,7,3,5), freq=FALSE)
> h$density
0.13636364 0.15909091 0.09090909 0.09090909 0.02272727
> sum(h$density)
[1] 0.5
> h$density/sum(h$density)
[1] 0.27272727 0.31818182 0.18181818 0.18181818 0.0454545
答案 0 :(得分:6)
如果检查直方图输出的其余部分,您会注意到条形长度为2:
$breaks
[1] 0 2 4 6 8 10
因此,您应该将sum(h$density)
乘以2,以使区域等于1。如果你看直方图,你可以清楚地看到这一点。
答案 1 :(得分:1)
直方图的区域实际上是1.0
。你没有考虑到的是每个栏都是两个单位:
> h$breaks
[1] 0 2 4 6 8 10
答案 2 :(得分:1)
密度和概率不一样。直方图的密度是条形的高度。概率是条形的面积。您需要将高度乘以宽度来获得面积。试试
x <- c(1,2,1,3,1,4,5,4,5,8,2,4,1,7,6,10,7,4,3,7,3,5)
hh <- hist(x, probability = TRUE)
sum(diff(hh$breaks) * hh$density)
# [1] 1
之所以有效,是因为 breaks
包含每个 bin 的起点/终点。因此,通过取每个值之间的差值,您可以获得 bin 的总宽度。您还可以 with()
更轻松地获取这两个值。
x <- c(1,2,1,3,1,4,5,4,5,8,2,4,1,7,6,10,7,4,3,7,3,5)
with(hist(x, probability = TRUE), sum(diff(breaks) * density))
# [1] 1
答案 3 :(得分:0)
sum(h$density*(h$breaks[-1] - h$breaks[-length(h$breaks)]))
[1] 1