Answers:
虽然直方图通常很方便,有时甚至有用,但它们可能会产生误导。它们的外观会随着容器边界位置的变化而发生很大变化。
这个问题早已为人所知*,尽管可能未达到应有的程度。您很少在基本级别的讨论中看到它(尽管有例外)。
*例如,保罗·鲁宾[1]这样说:“ 众所周知,改变直方图的端点会显着改变其外观 ”。。
我认为在引入直方图时应该更广泛地讨论这个问题。我将给出一些示例和讨论。
为什么您应该警惕依赖数据集的单个直方图
看一下这四个直方图:
那是四个看起来非常不同的直方图。
如果将以下数据粘贴到(我在这里使用R):
Annie <- c(3.15,5.46,3.28,4.2,1.98,2.28,3.12,4.1,3.42,3.91,2.06,5.53,
5.19,2.39,1.88,3.43,5.51,2.54,3.64,4.33,4.85,5.56,1.89,4.84,5.74,3.22,
5.52,1.84,4.31,2.01,4.01,5.31,2.56,5.11,2.58,4.43,4.96,1.9,5.6,1.92)
Brian <- c(2.9, 5.21, 3.03, 3.95, 1.73, 2.03, 2.87, 3.85, 3.17, 3.66,
1.81, 5.28, 4.94, 2.14, 1.63, 3.18, 5.26, 2.29, 3.39, 4.08, 4.6,
5.31, 1.64, 4.59, 5.49, 2.97, 5.27, 1.59, 4.06, 1.76, 3.76, 5.06,
2.31, 4.86, 2.33, 4.18, 4.71, 1.65, 5.35, 1.67)
Chris <- c(2.65, 4.96, 2.78, 3.7, 1.48, 1.78, 2.62, 3.6, 2.92, 3.41, 1.56,
5.03, 4.69, 1.89, 1.38, 2.93, 5.01, 2.04, 3.14, 3.83, 4.35, 5.06,
1.39, 4.34, 5.24, 2.72, 5.02, 1.34, 3.81, 1.51, 3.51, 4.81, 2.06,
4.61, 2.08, 3.93, 4.46, 1.4, 5.1, 1.42)
Zoe <- c(2.4, 4.71, 2.53, 3.45, 1.23, 1.53, 2.37, 3.35, 2.67, 3.16,
1.31, 4.78, 4.44, 1.64, 1.13, 2.68, 4.76, 1.79, 2.89, 3.58, 4.1,
4.81, 1.14, 4.09, 4.99, 2.47, 4.77, 1.09, 3.56, 1.26, 3.26, 4.56,
1.81, 4.36, 1.83, 3.68, 4.21, 1.15, 4.85, 1.17)
然后,您可以自己生成它们:
opar<-par()
par(mfrow=c(2,2))
hist(Annie,breaks=1:6,main="Annie",xlab="V1",col="lightblue")
hist(Brian,breaks=1:6,main="Brian",xlab="V2",col="lightblue")
hist(Chris,breaks=1:6,main="Chris",xlab="V3",col="lightblue")
hist(Zoe,breaks=1:6,main="Zoe",xlab="V4",col="lightblue")
par(opar)
现在看一下这张带状图:
x<-c(Annie,Brian,Chris,Zoe)
g<-rep(c('A','B','C','Z'),each=40)
stripchart(x~g,pch='|')
abline(v=(5:23)/4,col=8,lty=3)
abline(v=(2:5),col=6,lty=3)
(如果它仍然不是很明显,看到当您从每一组中减去Annie的数据会发生什么:head(matrix(x-Annie,nrow=40))
)
每次仅将数据左移0.25。
然而,我们从直方图中得到的印象是完全不同的:右偏斜,均匀,左偏斜和双峰。我们的印象完全取决于第一个bin起点相对于最小值的位置。
因此,不仅仅是“指数”对“非真正指数”,而是“右偏斜”与“左偏斜”或“双峰”与“均匀”,只需移动垃圾箱的位置即可。
编辑:如果您改变binwidth,您可以得到这样的事情:
在这两种情况下,这是相同的 34个观察值,只是断点不同,一个断点的binwidth为,另一个断点的binwidth为。0.8
x <- c(1.03, 1.24, 1.47, 1.52, 1.92, 1.93, 1.94, 1.95, 1.96, 1.97, 1.98,
1.99, 2.72, 2.75, 2.78, 2.81, 2.84, 2.87, 2.9, 2.93, 2.96, 2.99, 3.6,
3.64, 3.66, 3.72, 3.77, 3.88, 3.91, 4.14, 4.54, 4.77, 4.81, 5.62)
hist(x,breaks=seq(0.3,6.7,by=0.8),xlim=c(0,6.7),col="green3",freq=FALSE)
hist(x,breaks=0:8,col="aquamarine",freq=FALSE)
漂亮,是吗?
是的,这些数据是故意生成的,以实现此目的……但是这一教训很明确-您认为直方图中的内容可能并不是对数据的特别准确的印象。
直方图被广泛使用,经常很容易获得,有时是可以预期的。我们如何避免或减轻此类问题?
正如尼克·考克斯(Nick Cox)在对一个相关问题的评论中所指出的那样:经验法则始终应该是对箱宽度和箱原点变化稳健的细节很可能是真实的。易碎的细节可能是虚假的或琐碎的。
至少,您应该始终以几个不同的binwidth或bin-origins或最好同时使用两者来进行直方图绘制。
或者,在不太宽的带宽下检查内核密度估计。
降低直方图任意性的另一种方法是平均移位直方图,
(这是最新数据集上的数据),但是如果您花那么多精力,我认为您也可以使用内核密度估计。
如果我正在做直方图(尽管敏锐地意识到了这个问题,我还是使用它们),我几乎总是喜欢使用比典型程序默认值往往要多得多的bin,而且我经常喜欢用变化的bin宽度来做几个直方图(以及偶尔的来源)。如果它们在印象上相当一致,那么您就不太可能出现此问题;如果它们在不一致方面,您就知道要仔细看一下,也许可以尝试进行核密度估计,经验CDF,QQ图等类似。
尽管直方图有时可能会引起误解,但箱线图更容易出现此类问题。使用箱线图,您甚至都没有能力说“使用更多垃圾箱”。看到这篇文章中的四个非常不同的数据集,尽管其中一个数据集非常不对称,但全部具有相同的对称箱形图。
[1]:鲁宾·保罗(2014),“直方图滥用!”,
博客文章,或在OB世界中,2014年1月23日
链接 ... (替代链接)
与直方图相比,内核密度或对数图可能是更好的选择。这些方法仍然可以设置一些选项,但是它们比直方图变幻无常。也有qqplots。查看数据是否足够接近理论分布的一个很好的工具:
Buja, A., Cook, D. Hofmann, H., Lawrence, M. Lee, E.-K., Swayne, D.F and Wickham, H. (2009) Statistical Inference for exploratory data analysis and model diagnostics Phil. Trans. R. Soc. A 2009 367, 4361-4383 doi: 10.1098/rsta.2009.0120
这个想法的简短版本(有关详细信息,请继续阅读本文)是您从零分布生成数据并创建多个图,其中一个是原始数据/真实数据,其余的是从理论分布中模拟的。然后,您可以将图呈现给尚未看到原始数据的人(可能是您自己),并查看他们是否可以选择真实数据。如果他们无法识别真实数据,那么您就没有证据证明其无效。
vis.test
R的TeachingDemos软件包中的函数有助于实现此测试的形式。
这是一个简单的例子。下图中的一个是从自由度为10的分布中生成的25个点,其他八个是从均值和方差相同的正态分布中生成的。
该vis.test
函数创建了该图,然后提示用户选择他们认为不同的图,然后重复该过程两次以上(共3次)。
到目前为止,累积分布图[ MATLAB,R ](在其中绘制数据值的分数小于或等于某个值范围的部分)是查看经验数据分布的最佳方法。例如,这是在R中生成的此数据的ECDF :
这可以通过以下R输入(带有以上数据)生成:
plot(ecdf(Annie),xlim=c(min(Zoe),max(Annie)),col="red",main="ECDFs")
lines(ecdf(Brian),col="blue")
lines(ecdf(Chris),col="green")
lines(ecdf(Zoe),col="orange")
如您所见,这四个发行版在视觉上很明显是彼此的简单翻译。通常,ECDF在可视化数据的经验分布方面的好处是:
唯一的窍门是学习如何正确读取ECDF:浅的倾斜区域表示稀疏分布,陡的倾斜区域表示密集分布。但是,一旦掌握了这些知识,它们便成为查看经验数据分布的绝佳工具。
建议:直方图通常仅将x轴数据分配给发生在容器中点的位置,并忽略精度更高的x轴位置度量。这对拟合导数的影响可能很大。让我们举一个简单的例子。假设我们采用狄拉克(Dirac)三角洲的经典推导,但对其进行了修改,以使我们从柯西分布开始于任意比例的中位数位置,且比例有限(全宽为半最大值)。然后,当小数位数为零时,我们取极限。如果我们使用直方图的经典定义,并且不更改面元大小,则我们将不会捕获位置或比例。但是,如果我们在均匀宽度的容器中使用中间位置,则当比例尺相对于容器宽度较小时,如果不是比例尺,我们将始终捕获该位置。
对于数据偏斜的拟合值,使用固定的bin中点会使x轴移动该区域中的整个曲线段,我认为这与上面的问题有关。
在每个直方图类别中,并将其显示为每个bin中的平均x轴值。由于每个直方图bin的值均为8,因此所有分布看上去均一,我不得不垂直偏移它们以显示它们。该显示不是正确的答案,但并非没有信息。它正确地告诉我们,组之间存在x轴偏移。它还告诉我们,实际分布似乎略呈U形。为什么?注意,平均值之间的距离在中心距离更远,在边缘更近。因此,为了使其更好地表示,我们应该借用整个样本和每个bin边界样本的分数来使x轴上的所有平均bin值等距。要解决此问题并正确显示,需要进行一些编程。但,它可能只是制作直方图的一种方法,以便它们实际上以某种逻辑格式显示基础数据。如果我们更改覆盖数据范围的bin总数,形状仍然会改变,但是其思想是解决任意binning所产生的一些问题。
步骤2因此,让我们开始在垃圾箱之间借用,以尝试使这些工具的间距更均匀。
现在,我们可以看到直方图的形状开始出现。但是,均值之间的差异并不是完美的,因为我们只有大量样本可以在仓之间交换。为了消除y轴上整数值的限制并完成制作等距x轴平均值的过程,我们必须开始在仓之间共享样本的分数。
可以看到,在bin边界处共享值的各个部分可以提高平均值之间的距离均匀性。我设法在给定数据的情况下做到小数点后三位。但是,我不认为通常不能使平均值之间的距离完全相等,因为数据的粗糙性不允许这样做。
但是,可以做其他事情,例如使用核密度估计。
在这里,我们将安妮的数据视为使用0.1、0.2和0.4的高斯平滑度的有界核密度。其他主题将具有相同类型的移位函数,但前提是与我做的事情相同,即使用每个数据集的上下限。因此,这不再是直方图,而是PDF,它的作用与没有某些疣的直方图相同。