我正在实施各种算法来估计用于直方图的最佳箱数。我正在实施的大多数都在维基百科“直方图”页面的“箱数和宽度”部分中进行了描述*。
我被 Doane 的公式所困扰:
1 + log(n) + log(1 + kurtosis(data) * sqrt(n / 6.))
n
数据大小在哪里。
问题是当峰度为负时,n >> 1
因为 的参数log
变为负。
*(该页面自发布以来已更改,链接已编辑为指向发布时的页面)
我正在实施各种算法来估计用于直方图的最佳箱数。我正在实施的大多数都在维基百科“直方图”页面的“箱数和宽度”部分中进行了描述*。
我被 Doane 的公式所困扰:
1 + log(n) + log(1 + kurtosis(data) * sqrt(n / 6.))
n
数据大小在哪里。
问题是当峰度为负时,n >> 1
因为 的参数log
变为负。
*(该页面自发布以来已更改,链接已编辑为指向发布时的页面)
当我调查维基百科页面时,这个答案发生了重大变化。我基本上保留了答案,但添加了它们,所以目前这形成了理解的进展;最后一部分是最好的信息所在。
简短的回答:维基百科页面(在发布问题时) - 以及似乎相同的 OP 公式 - 完全是错误的,至少有三个不同的原因。我将留下我最初的讨论(假设 OP 和 Wikipedia 是正确的),因为这解释了一些问题。稍后进行更好的讨论。简短的建议:忘记 Doane。如果您必须使用它,请使用 Wikipedia现在所说的(我已修复)。
我认为公式必须指的是过度峰度;我这样做的原因是它修改了正常数据的公式以解释非正常数据,因此您希望它能够以正常方式重现未修改的公式。如果您使用过多的峰度,它会这样做。
然而,这确实会引发一个问题,即日志中的术语在大样本时可能会变为负数(实际上,有可能是在很小的时候)。我建议不要将它与负超峰度一起使用(无论如何,我永远不会在单峰之外使用它;一旦事情变得多峰,您想将超峰度想法应用于每种模式,而不是平滑它们!),尽管有轻微的情况(过度峰度刚好小于 0)和适度的样本量,这不会是一个大问题。
我还建议,在任何情况下,即使它按预期工作,它也会在大样本量下提供太少的垃圾箱。
您可以找到这篇论文(由普通 CVer Rob Hyndman撰写):
http://www.robjhyndman.com/papers/sturges.pdf
有些兴趣。如果 Sturges 的论点是错误的,Doane 的公式也有同样的问题……正如 Rob 在论文中明确指出的那样。
在那篇论文中(以及在这个答案中),他对 Freedman-Diaconis 规则表示赞同。在论文中,他还指出了 Matt Wand 提到的方法(他指的是工作论文,该论文似乎没有在线,但如果您可以访问后续论文,则可以使用):
http://www.jstor.org/discover/10.2307/2684697
[编辑:实际上工作文件的链接在citeseer 页面上]
该方法涉及近似估计特定功能以获得近似最优的(根据均方积分平方误差,MISE)用于估计基础密度的箱宽度。虽然这些工作得很好,并且通常比 Sturges 或 Doane 提供更多的垃圾箱,但有时我仍然更喜欢使用更多的垃圾箱,尽管这通常是一个非常好的第一次尝试。
坦率地说,我不知道为什么 Wand 的方法(或者至少是 Freedman-Diaconis 规则)并不是几乎所有地方的默认方法。
R 至少提供了对 bin 数量的 Freedman-Diaconis 计算:
nclass.FD(rnorm(100))
[1] 11
nclass.FD(runif(100))
[1] 6
nclass.FD(rt(100,1))
[1] 71
看?nclass.FD
就我个人而言,至少在前两种情况下,垃圾箱太少了;尽管它可能比最佳值更嘈杂,但我会将两者都加倍。作为变大,我认为它在大多数情况下都做得很好。
编辑2:
我决定调查@PeterFlom 正确表达困惑的偏度与峰度问题。
我刚刚看了与 wiso 相关的 Doane 论文(我以前读过它……但那是差不多 30 年前的事了)——它根本没有提到峰度,只提到了偏度。
多恩的实际公式是:
在哪里是添加的 bin 数量,是第三时刻偏度。[实际上,Doane 按照当时相当普遍的用法,使用对于带符号的(!) 3rd moment skewness (这种特别不具启发性的符号滥用的起源已经很老了,我不打算追究它,只是说幸运的是它现在出现的频率要低得多)。]
现在在正常情况下,
(虽然这个近似值很差,直到远远超过100;Doane 使用第一种形式)。
但是,似乎在此过程中有人试图使其适应峰度(例如,在我撰写此维基百科时,它以峰度表示,我认为他们没有编造出来)-但有明确的理由相信这个公式是完全错误的(请注意,使用的标准误差是我上面给出的偏度 se 的最终近似值)。我想我已经在维基百科以外的几个地方看到过这种峰度的使用,但除了没有出现在 Doane 的论文中之外,它也没有出现在 Scott 的论文中,也没有出现在我指向的 Hyndman 论文中,也没有出现在 Wand 的论文中。然而,它似乎确实来自某个地方(即我确信它不是维基百科的原创),因为 Doane 没有近似于. 看起来它在它结束之前已经玩了好几次了;如果有人追踪它,我会很感兴趣。
在我看来,Doane 的论点应该很高兴地扩展到峰态,但必须使用正确的标准错误。
然而,由于多恩依赖斯特奇斯,而斯特奇斯的说法似乎有缺陷,或许整个企业注定要失败。无论如何,我已经在维基百科上编辑了直方图讨论页面,并指出了错误。
---
编辑 3:我已经更正了维基百科页面(但我冒昧地采用了偏度的绝对值,否则 Doane 的原始公式不能用于左偏分布 - 显然对于箱数的符号偏度无关紧要)。严格来说,我应该以原始(错误)形式呈现公式,然后解释为什么它没有意义,但我认为这是有问题的,原因有几个——尤其是人们会倾向于只复制公式而忽略解释。我相信它实际上涵盖了 Doane 的初衷。无论如何,它比原来的废话有了很大的改进。(请任何可以访问原始论文的人,看看它以及如何已定义并检查我在 Wikipedia 上的更改以确保它是合理的 - 至少有三件事是错误的 - 峰度、标准错误和错误的日志基数,加上 Doane 自己的小错误。)
根据二阶和四阶矩定义的峰度度量永远不会是负数(参见),那么log(1+...)>0
.
此数量在kurtosis()
R 库的命令中实现moments
。另外,使用命令hist()
可以指定中断次数如下
library(moments)
n <- 250
data <- rnorm(n)
# Sturges formula log_2(n) + 1
hist(data,breaks = "Sturges")
# Doane's formula
Doane <- 1 + log(n) + log(1 + kurtosis(data) * sqrt(n / 6.))
hist(data,breaks = Doane)
命令中使用的公式kurtosis()
很简单mean((data - mean(data))^4)/mean((data - mean(data))^2)^2
。
现在,如果您想研究什么是“最佳”公式,那么您将需要一个标准。考虑到这已经在统计文献中被广泛讨论。