我正在实现各种算法,以估计用于直方图的最佳bin数量。我要实现的大多数方法在Wikipedia“直方图”页面上的“ 箱数和宽度 ” *部分中进行了描述。
我对Doane的公式感到困惑:
1 + log(n) + log(1 + kurtosis(data) * sqrt(n / 6.))
n
数据大小在哪里。
问题是峰度为负,并且n >> 1
因为的参数log
变为负。
*(该页面自发布以来已更改,链接已编辑为指向发布时的页面)
我正在实现各种算法,以估计用于直方图的最佳bin数量。我要实现的大多数方法在Wikipedia“直方图”页面上的“ 箱数和宽度 ” *部分中进行了描述。
我对Doane的公式感到困惑:
1 + log(n) + log(1 + kurtosis(data) * sqrt(n / 6.))
n
数据大小在哪里。
问题是峰度为负,并且n >> 1
因为的参数log
变为负。
*(该页面自发布以来已更改,链接已编辑为指向发布时的页面)
Answers:
当我调查维基百科页面时,此答案已发生重大变化。我基本上没有回答,而是添加了答案,因此目前形成了理解的进步;最后部分是最好的信息所在。
简短的答案:维基百科页面-和OP的公式,似乎是相同的-完全是错误的,至少出于三个不同的原因。我将保留最初的讨论(假定OP和Wikipedia正确),因为这可以解释一些问题。稍后将进行更好的讨论。简短建议:忘记多恩。如果必须使用它,请使用维基百科现在所说的(我已修复)。
我认为公式必须涉及过多峰度;我这样做的原因是,它修改了普通数据的公式以解决非普通数据的问题,因此您希望它能够在普通情况下重现未修改的公式。如果您使用过量峰度,则可以做到这一点。
但是,这确实提出了一个问题,即日志中的项对于大样本会变为负数(实际上,在非常小的处可能为)。我建议不要将其与负过量峰度一起使用(无论如何我绝不会将其用于单峰;一旦事情变得多峰,您希望将过量峰度思想应用于每种模式,而不是对它们进行平滑处理!),尽管有轻度情况(峰度仅小于0)和适中的样本量将不是一个大问题。
我还建议在任何情况下,即使按预期方式工作,在大样本量情况下也将提供过多的垃圾箱。
您可能会找到本文(由常规CVer Rob Hyndman撰写):
http://www.robjhyndman.com/papers/sturges.pdf
有些兴趣。如果斯特吉斯的论点是错误的,那么多恩的公式也有同样的问题……就像罗布在论文中清楚指出的那样。
在那篇论文中(以及在这个答案中),他对Freedman-Diaconis规则表示赞同。在论文中,他还指出了Matt Wand提到的方法(他指的是似乎并不在线的工作论文,但是如果您可以访问,则可以使用后续论文):
http://www.jstor.org/discover/10.2307/2684697
[编辑:引文页面上实际上是工作文件的链接]
该方法涉及近似估计特定功能,以便获得近似最佳(根据平均积分平方误差,MISE)箱宽度,以估计底层密度。虽然这些文件效果很好,并且通常提供比Sturges或Doane更多的垃圾箱,但有时我还是更喜欢使用更多的垃圾箱,尽管通常这是一个很好的尝试。
坦白说,我不知道为什么魔杖的方法(或者至少是弗雷德曼·迪亚科尼斯的法则)并不是到处都是默认的。
R至少提供了Freedman-Diaconis计算箱数的方法:
nclass.FD(rnorm(100))
[1] 11
nclass.FD(runif(100))
[1] 6
nclass.FD(rt(100,1))
[1] 71
看到 ?nclass.FD
就我个人而言,至少在前两个案例中,垃圾箱太少了。尽管这可能会比最佳选择更吵闹,但我还是将两者加倍。随着n变大,我认为在大多数情况下它会做得很好。
编辑2:
我决定调查@PeterFlom正确表示困惑的偏度与峰度问题。
我只是看了与Doane相关的wiso论文(我之前读过它,但是那是在30年前了),它根本没有提到峰度,而只是歪斜。
Doane的实际公式为:
其中是添加的仓位数量,是第三矩偏斜度。[实际上,Doane在相当普遍的时间用法之后,使用作为带符号(!)的第3瞬间偏斜(这种特别统一的符号滥用的根源已经很老了,我不打算继续讨论。它,只是说幸运的是现在它出现的频率大大降低了。]
现在正常时,
(尽管直到n远远超过100为止,近似值才很差; Doane使用第一种形式)
但是,似乎一路上有人尝试使其适应峰度(例如,在我撰写此Wikipedia时就其峰度而言,但我不认为他们是由峰度构成的)-但是有明显的原因认为该公式完全是错误的(请注意,使用的标准误差是我上面给出的偏度的se的最终近似值)。我想我在Wikipedia以外的其他地方也看到过峰度的使用,但是除了不在Doane的论文中,Scott的论文,我所指向的Hyndman论文,Wand的论文中也没有出现过峰度。但是,它似乎确实来自某个地方(即,我确定它不是维基百科的原始内容),因为Doane并不近似于。好像已经播放了好几次才结束。如果有人追踪,我将很感兴趣。
在我看来,Doane的论点应该愉快地扩展到峰度,但是必须使用正确的标准误差。
但是,由于Doane依赖于Sturges,并且Sturges的论点似乎存在缺陷,因此整个企业可能注定了失败。无论如何,我都在Wikipedia上编辑了“直方图”讨论页面,并注意到了该错误。
---
编辑3:我已更正了Wikipedia页面(但是我采取了偏度绝对值的自由方式,否则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
。
现在,如果您想研究什么是``最佳''公式,那么您将需要一个标准。考虑到统计文献中对此进行了详尽的讨论。
log(n,2)
代替来对此进行简单地纠正log(n)
。但是,维基百科条目以及其他来源表明应为log
。