为什么我的 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
生成数字更有意义。
我在玩 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
生成数字更有意义。