为什么hist()函数没有区域1

时间:2011-10-18 13:53:49

标签: r histogram area

在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

4 个答案:

答案 0 :(得分:6)

如果检查直方图输出的其余部分,您会注意到条形长度为2:

$breaks
[1]  0  2  4  6  8 10

因此,您应该将sum(h$density)乘以2,以使区域等于1。如果你看直方图,你可以清楚地看到这一点。

http://i53.tinypic.com/a3mlab.jpg

答案 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