为什么R直方图中的第一个条形图如此之大?

时间:2017-05-14 19:10:21

标签: r histogram distribution

我正在玩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))

该脚本生成以下直方图: histogram

有人可以向我解释为什么第一个酒吧这么大吗?我检查了数据,看起来很好。我该如何解决这个问题?

提前谢谢!

3 个答案:

答案 0 :(得分:6)

直方图对于离散数据并不好,它们是为连续数据设计的。您的数据如下所示:

> 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))即可更准确地描述数据。

答案 1 :(得分:1)

您的breaks不正确,因此,第一个栏正在计算卷中的1和2。

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

答案 2 :(得分:1)

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

as.integer(1.7)
# 1

round(1.7)
# 2

最后,我不确定为什么人们会将高斯分布为均匀分布。从rnorm而不是runif生成数字会更有意义。