R中均匀分布的直方图绘制不正确

5
当我运行这段代码时
hist(1:5)

或者

hist(c(1,2,3,4,5))

生成的直方图显示,当数组中只有一个“1”时,第一个数字“1”的频率为2。 enter image description here 我还尝试了...
hist(c(1,2,3,7,7,7,9))

但它仍然显示第一个条形图比第二个高两倍

enter image description here

但是,当我运行时
 hist(c(1:10))

每个条形图的频率高度都相等。
我对统计学和R都很陌生,不知道这背后的原因是什么。希望有人能帮助我澄清为什么会发生这种情况。谢谢。 输入图片说明

1
记录一下,每当你处理一个不具有很多取值的离散变量时,将数据绘制成这样可能更有趣:plot(table(1:5))。这样做,你不会失去关于具体值的信息,而当你绘制直方图时会出现这种情况。 - Waldir Leoncio
3个回答

12

以你的第一个例子hist(1:5)为例,输入了五个数字,它们被分到了四个区间里。所以其中两个数字会被合并到同一个区间里。

直方图在2345处有断点,因此可以合理推断出hist函数中用于确定数字所在区间的规则是:

#pseudocode
if (i <= break) { # plot in bin }

您可以手动指定断点来解决此问题:

hist(1:5, breaks=0:5)

在此输入图片描述


8

试试这个:

> trace("hist.default", quote(print(fuzzybreaks)), at = 25)
Tracing function "hist.default" in package "graphics"
[1] "hist.default"
>
> out <- hist(1:5)
Tracing hist.default(1:5) step 25 
[1] 0.9999999 2.0000001 3.0000001 4.0000001 5.0000001
> out$count
[1] 2 1 1 1

这里展示了实际使用的fuzzybreaks值以及每个区间内的计数。显然第一个区间(0.99999992.0000001之间)有两个点,而其他各区间则只有一个点。

与以下内容进行比较:

> out <- hist(1:5, breaks = 0:5 + 0.5)
Tracing hist.default(1:5, breaks = 0:5 + 0.5) step 25 
[1] 0.4999999 1.5000001 2.5000001 3.5000001 4.5000001 5.5000001
> out$count
[1] 1 1 1 1 1

现在每个箱子里都明确有一个点。


5

您现在看到的是,hist将1:5分为四个区间。因此,将有一个包含2个计数的区间。

如果您这样指定截止点:

 hist(1:5, breaks=(c(0.5, 1.5, 2.5, 3.5, 4.5 , 5.5)))

然后您将获得您期望的行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接