R中具有相对频率轴的直方图的奇怪问题

机器算法验证 r 数据可视化 直方图
2022-03-21 06:13:53

使用 MASS 中的 truehist() 或仅使用 R 中带有 prob=TRUE 选项的普通 hist() 函数,我得到 y 轴的非常奇怪的值。我的印象是这些值都应该低于 1.00,因为任何值的相对频率都应该低于 1.00,并且曲线下的面积会增加这一点。

相反,我得到的轴的范围接近 1500,步长为数百。有谁知道发生了什么?这些值不是事件一致的,因此它们似乎没有任何相对的缩放比例。作为参考,我使用以下代码:

hist(g1$Betweenness, main="", xlab="Betweenness", sub="Generation 1", prob=TRUE)

The data for one such plot: 0.009619951 0.009619951 0.006750843 0.006750843 0.006750843 0.006750843 0.014497435 0.006750843 0.006750843 0.006750843 0.006750843 0.006750843 0.006750843 0.006750843 0.006750843 0.006750843 0.006750843 0.006750843 0.006750843 0.006750843 0.006750843 0.006750843 0.006750843 0.006750843 0.008663582 0.008663582 0.006750843 0.012058693 0.012489059 0.024587132 0.084941213 0.01248905 0.012489059

令人讨厌的是,JMP 处理得很好,但我开始更喜欢 R 的绘图风格。

3个回答

一种解释是数据的标准差远小于 1,直方图给出了概率密度之类的信息。

例如,当我将范围为 (0, 1) 的均匀随机变量除以 1000 时,查看直方图上的密度如何变化:

set.seed(4444)
x <- runif(100)
y <- x / 1000

par(mfrow=c(2,1))
hist(x, prob=TRUE)
hist(y, prob=TRUE)

在此处输入图像描述

如果您想要更直观的密度值,您可以更改变量的单位。

正如其他人所指出的,frequency=FALSE仅使直方图上的积分等于 1,而不是sum所有值。(顺便说一下,该参数probability=TRUE仅用于 S 兼容性,因此可能用词不当。 概率密度会更好。)

这是一些重新标记 y 轴以将概率绘制为刻度线的代码。

my.data <- rnorm(2000)

my.hist <- hist(my.data, breaks=100, yaxt='n', ylab="Probability")

ticks <- seq(par("yaxp")[1], par("yaxp")[2], length.out=par("yaxp")[3]+1)
l <- length(my.data)
max.prob <- max(my.hist$counts)/l
tick.labels <- head(pretty(c(0, max.prob)), -1)
ticks <- tick.labels * l
print(tick.labels)
print(sum(my.hist$counts/l))

axis(2, at=ticks, labels=tick.labels)

有关示例输出,请参见此图像:

带有概率 y 轴的直方图

如果您通过probability=TRUE(或frequency=FALSE),您确实应该在图上看到密度。

请注意,如果您的休息次数相对较少且您的垃圾箱宽度较小(远低于 1),这并不意味着它们不可能高于 1。查看您的代码hist.default可以看到密度计算为dens <- counts/(n * diff(breaks))

如果不看数据本身,就很难说你的情况出了什么问题(根据你的解释,箱的宽度肯定足够宽,可以保证小的密度值)。但是,我似乎记得hist在一些相对较新的 R 版本中存在问题。所以也许您可以更新到最新版本并再试一次?