假设我想查看我的数据是否是基于直方图的指数(即向右倾斜)。
根据我对数据进行分组或分类的方式,我可以获得截然不同的直方图。
一组直方图将使数据看起来是指数的。另一组将使数据看起来不是指数级的。如何从直方图中确定分布?
假设我想查看我的数据是否是基于直方图的指数(即向右倾斜)。
根据我对数据进行分组或分类的方式,我可以获得截然不同的直方图。
一组直方图将使数据看起来是指数的。另一组将使数据看起来不是指数级的。如何从直方图中确定分布?
虽然直方图通常很方便,有时也很有用,但它们可能会产生误导。它们的外观会随着 bin 边界位置的变化而发生很大变化。
这个问题早已为人所知*,尽管可能没有它应有的那么广泛——你很少在初级讨论中看到它(尽管有例外)。
* 例如,Paul Rubin[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。
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)
漂亮,嗯?
是的,这些数据是故意生成的……但教训很清楚——你认为你在直方图中看到的可能不是对数据的特别准确的印象。
直方图被广泛使用,通常很容易获得并且有时是预期的。我们可以做些什么来避免或减轻这些问题?
正如尼克考克斯在对相关问题的评论中指出的那样:经验法则始终应该是,对箱宽度和箱来源变化具有鲁棒性的细节很可能是真实的;对此类脆弱的细节很可能是虚假的或琐碎的。
至少,您应该始终在几个不同的 binwidth 或 bin-origins 处制作直方图,或者最好两者兼而有之。
或者,在不太宽的带宽下检查内核密度估计。
另一种减少直方图任意性的方法是平均移位直方图,
(这是最新数据集上的一个),但如果你努力做到这一点,我认为你不妨使用内核密度估计。
如果我正在做一个直方图(尽管我非常清楚这个问题,我还是使用它们),我几乎总是喜欢使用比典型程序默认设置更多的 bin,而且我经常喜欢做几个不同 bin 宽度的直方图(以及,偶尔,起源)。如果它们在印象中相当一致,您不太可能遇到这个问题,如果它们不一致,您知道要更仔细地查看,也许可以尝试核密度估计、经验 CDF、QQ 图或其他东西相似的。
虽然直方图有时可能会产生误导,但箱线图更容易出现此类问题;使用箱线图,您甚至无法说“使用更多垃圾箱”。请参阅这篇文章中的四个非常不同的数据集,它们都具有相同的对称箱线图,即使其中一个数据集非常倾斜。
[1]:Rubin, Paul (2014)“直方图滥用!”,
博客文章,或者在 OB 世界中,2014 年 1 月 23 日
链接... (替代链接)
累积分布图 [ MATLAB , R ] - 绘制小于或等于某个值范围的数据值的分数 - 是迄今为止查看经验数据分布的最佳方式。例如,这里是这个数据的 ECDF ,在 R 中生成:
这可以通过以下 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:浅倾斜区域意味着稀疏分布,陡峭倾斜区域意味着密集分布。但是,一旦您掌握了阅读它们的窍门,它们就会成为查看经验数据分布的绝佳工具。
与直方图相比,核密度或对数样条图可能是更好的选择。仍然可以使用这些方法设置一些选项,但它们不像直方图那样变化无常。还有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 个点,另外 8 个是从具有相同均值和方差的正态分布生成的。
该vis.test
函数创建了这个图,然后提示用户选择他们认为不同的图,然后再重复该过程 2 次(总共 3 次)。
建议:直方图通常仅将 x 轴数据指定为已出现在 bin 中点的数据,并省略更准确的 x 轴位置测量。这对拟合导数的影响可能非常大。让我们举一个简单的例子。假设我们采用 Dirac delta 的经典推导,但对其进行修改,以便我们从某个具有有限尺度(全宽半最大值)的任意中间位置的柯西分布开始。然后我们在比例变为零时取极限。如果我们使用直方图的经典定义并且不更改 bin 大小,我们将不会捕获位置或比例。但是,如果我们在固定宽度的偶数箱内使用中间位置,我们将始终捕获该位置,如果不是当比例尺相对于箱宽较小时的比例尺。
对于数据偏斜的拟合值,使用固定的 bin 中点将 x 轴移动该区域中的整个曲线段,我认为这与上述问题有关。
第 1 步这是一个几乎解决方案。我用在每个直方图类别中,并将这些显示为每个 bin 的平均 x 轴值。由于每个直方图 bin 的值为 8,因此分布看起来都很均匀,我不得不垂直偏移它们以显示它们。显示的不是正确答案,但也不是没有信息。它正确地告诉我们组之间存在 x 轴偏移。它还告诉我们,实际分布似乎略呈 U 形。为什么?请注意,平均值之间的距离在中心更远,在边缘更近。因此,为了使其更好地表示,我们应该借用每个 bin 边界样本的整个样本和小数数量,以使 x 轴上的所有平均 bin 值等距。解决这个问题并正确显示它需要一些编程。但,它可能只是一种制作直方图的方法,以便它们以某种逻辑格式实际显示基础数据。如果我们改变覆盖数据范围的 bin 总数,形状仍然会改变,但这个想法是为了解决任意 binning 产生的一些问题。
第 2 步因此,让我们开始在 bin 之间借用,以尝试使均值间隔更均匀。
现在,我们可以看到直方图的形状开始出现。但是均值之间的差异并不完美,因为我们只有整数个样本可以在 bin 之间交换。为了消除 y 轴上整数值的限制并完成制作等距 x 轴平均值的过程,我们必须开始在 bin 之间共享样本的分数。
可以看出,在 bin 边界处共享值的部分可以提高平均值之间距离的均匀性。我设法用给定的数据做到了小数点后三位。但是,我不认为,一般来说,不能使平均值之间的距离完全相等,因为数据的粗糙度不允许这样做。
但是,可以做其他事情,例如使用核密度估计。
在这里,我们将 Annie 的数据视为使用 0.1、0.2 和 0.4 的高斯平滑的有界核密度。其他受试者将具有相同类型的转换功能,前提是其中一个与我做的事情相同,即使用每个数据集的下限和上限。因此,这不再是直方图,而是 PDF,它的作用与没有一些缺陷的直方图相同。