为什么我的 R 直方图中的第一个条这么大?

Why is the first bar so big in my R histogram?

我在玩 R。我尝试使用以下 R 脚本可视化 1000 次掷骰子的分布:

cases <- 1000

min <- 1
max <- 6

x <- as.integer(runif(cases,min,max+1))
mx <- mean(x)
sd <- sd(x)

hist(
  x,
  xlim=c(min - abs(mx/2),max + abs(mx/2)),
  main=paste(cases,"Samples"),
  freq = FALSE,
  breaks=seq(min,max,1)
)

curve(dnorm(x, mx, sd), add = TRUE, col="blue", lwd = 2)
abline(v = mx, col = "red", lwd = 2)

legend("bottomleft", 
       legend=c(paste('Mean (', mx, ')')), 
       col=c('red'), lwd=2, lty=c(1))

该脚本生成以下直方图:

有人能给我解释一下为什么第一个栏这么大吗?我检查了数据,看起来不错。我该如何解决这个问题?

提前致谢!

您的 breaks 不正确,因此,第一个柱状图在滚动中计数 1 和 2。

hist(
  x,
  xlim=c(0,6),
  main=paste(cases,"Samples"),
  freq = FALSE,
  breaks=seq(0,6,1)
)

直方图不适用于离散数据,它们是为连续数据设计的。您的数据看起来像这样:

> table(x)
x
  1   2   3   4   5   6 
174 138 162 178 196 152 

即每个值的数量大致相等。但是当你把它放在直方图中时,你选择了 1:6 处的断点。第一个条形在其左侧极限有 174 个条目,在其右侧极限有 138 个条目,因此它显示 312。

您可以通过在半整数处指定分隔符来获得更好看的直方图,即 breaks = 0:6 + 0.5,但是对这样的数据使用直方图仍然没有意义。只需 运行 plot(table(x))barplot(table(x)) 即可更准确地描述数据。

m0nhawk 解决了部分问题。另一个问题可能是您使用 as.integer,它总是向下舍入(因此偏向 1)。

as.integer(1.7)
# 1

round(1.7)
# 2

最后,我不确定为什么要使高斯分布适合均匀分布。从 rnorm 而不是 runif 生成数字更有意义。