如何测试我的分布是否为多峰?


21

当我绘制数据的直方图时,它有两个峰值:

直方图

这是否意味着潜在的多峰分布?我dip.test在R(library(diptest))中运行,输出为:

D = 0.0275, p-value = 0.7913

我可以得出结论,我的数据具有多模式分布?

数据

10346 13698 13894 19854 28066 26620 27066 16658  9221 13578 11483 10390 11126 13487 
15851 16116 24102 30892 25081 14067 10433 15591  8639 10345 10639 15796 14507 21289 
25444 26149 23612 19671 12447 13535 10667 11255  8442 11546 15958 21058 28088 23827 
30707 19653 12791 13463 11465 12326 12277 12769 18341 19140 24590 28277 22694 15489 
11070 11002 11579  9834  9364 15128 15147 18499 25134 32116 24475 21952 10272 15404 
13079 10633 10761 13714 16073 23335 29822 26800 31489 19780 12238 15318  9646 11786 
10906 13056 17599 22524 25057 28809 27880 19912 12319 18240 11934 10290 11304 16092 
15911 24671 31081 27716 25388 22665 10603 14409 10736  9651 12533 17546 16863 23598 
25867 31774 24216 20448 12548 15129 11687 11581

3
在直方图中使用更多垃圾箱。我建议增加大约两倍
Glen_b-恢复莫妮卡2015年

1
在此答案中提到了九种不同的测试,其中一些可能与您的情况有关。
Glen_b-恢复莫妮卡

1
如果您还没有看过本文,则它可能会对您有所帮助(也是本后续文章
Eoin 2015年

Answers:


15

@NickCox提出了一个有趣的策略(+1)。但是,由于@whuber 指出的担忧,我可能认为它本质上更具探索性。

让我提出另一种策略:您可以拟合高斯有限混合模型。请注意,这是一个很强的假设,即您的数据是从一个或多个真实法线中提取的。正如@whuber和@NickCox都在评论中指出的那样,在没有公认的理论支持的情况下对这些数据没有实质性解释的情况下,为了支持这一假设,该策略也应视为探索性的。

首先,让我们遵循@Glen_b的建议,并使用两倍于bin的数据来查看数据:

在此处输入图片说明

我们仍然看到两种模式;如果有的话,他们在这里更清楚地了解。(还请注意,内核密度线应相同,但由于bin的数量更多,因此显得更分散。)

现在让我们拟合一个高斯有限混合模型。在中R,您可以使用Mclust包执行以下操作:

library(mclust)
x.gmm = Mclust(x)
summary(x.gmm)
# ----------------------------------------------------
# Gaussian finite mixture model fitted by EM algorithm 
# ----------------------------------------------------
#   
# Mclust V (univariate, unequal variance) model with 2 components:
#   
#   log.likelihood   n df       BIC       ICL
#        -1200.874 120  5 -2425.686 -2442.719
# 
# Clustering table:
#  1  2 
# 68 52 

两个常规组件可优化BIC。为了进行比较,我们可以强制一个分量拟合并执行似然比测试:

x.gmm.1 = Mclust(x, G=1)
logLik(x.gmm.1)
# 'log Lik.' -1226.241 (df=2)
logLik(x.gmm)-logLik(x.gmm.1)
# 'log Lik.' 25.36657 (df=5)
1-pchisq(25.36657, df=3)  # [1] 1.294187e-05

这表明,如果它们来自单个真实的正态分布,那么极不可能发现像单峰这样远的数据。

有些人在这里使用参数测试感到不舒服(尽管假设成立了,但我不知道有任何问题)。一种非常广泛适用的技术是使用参数Bootstrap交叉拟合方法(我在这里描述算法)。我们可以尝试将其应用于以下数据:

x.gmm$parameters
# $mean
# 12346.98 23322.06 
# $variance$sigmasq
# [1]  4514863 24582180
x.gmm.1$parameters
# $mean
# [1] 17520.91
# $variance$sigmasq
# [1] 43989870

set.seed(7809)
B = 10000;    x2.d = vector(length=B);    x1.d = vector(length=B)
for(i in 1:B){
  x2      = c(rnorm(68, mean=12346.98, sd=sqrt( 4514863)), 
              rnorm(52, mean=23322.06, sd=sqrt(24582180)) )
  x1      = rnorm( 120, mean=17520.91, sd=sqrt(43989870))
  x2.d[i] = Mclust(x2, G=2)$loglik - Mclust(x2, G=1)$loglik
  x1.d[i] = Mclust(x1, G=2)$loglik - Mclust(x1, G=1)$loglik
}
x2.d = sort(x2.d);  x1.d = sort(x1.d)
summary(x1.d)
#     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
# -0.29070 -0.02124  0.41460  0.88760  1.36700 14.01000 
summary(x2.d)
#   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#  9.006  23.770  27.500  27.760  31.350  53.500 

在此处输入图片说明

摘要统计数据以及采样分布的内核密度图显示了一些有趣的功能。即使真正的数据生成过程只有一个分量,单分量模型的对数似然比也很少大于两个分量拟合的对数似然,而当数值较大时,对数似然很小。比较功能不同的模型拟合数据的想法是PBCM的动机之一。这两个采样分布几乎完全不重叠。只有.35%的值x2.d小于最大值x1.d值。如果在对数似然性差异大于9.7的情况下选择了两个组件模型,则会错误地选择一个组件模型的时间为.01%,两个组件模型的时间为.02%。这些是高度可辨别的。另一方面,如果您选择使用一个组件模型作为原假设,则观察到的结果足够小,以至于不会在10,000次迭代中出现在经验抽样分布中。我们可以使用3的规则(请参阅此处)在p值上设置上限,即,我们估计您的p值小于.0003。即,这是非常重要的。

p<.000001p<.001),以及底层组件(如果存在)也不能保证完全正常。如果您认为您的数据可能来自正偏分布而不是正态分布是合理的,那么这种双峰水平很可能在典型的变异范围内,这就是我怀疑底线检验的意思。


1
这种方法的问题在于,与高斯混合进行比较的替代方法不是很合理。一个更合理的说法是该分布是某种右偏的分布,例如Gamma。几乎可以肯定的是,混合将比几乎所有单个偏斜的数据集都“适合”混合高斯
ub

你说得对,@ whuber。我试图明确指出这一点。我不确定如何做Gamma FMM,但这会更好。
gung-恢复莫妮卡

1
由于这是探索性的,因此可以想到的是尝试将原始分布转换为对称(也许使用偏移Box-Cox转换,并从少量数据分位数进行稳健估计),然后重试您的方法。当然,您本质上不会谈论“重要性” 但是对可能性的分析仍然可以揭示出来。
ub

@whuber,我这样做了,但我只是顺便提了一下。(最佳Box-Cox变换是平方根的倒数。)您得到相同的结果,但p值(仍然很高,但是)的重要性较低。
gung-恢复莫妮卡

3
我非常喜欢您应该对生成过程进行建模的想法。我的问题是,即使高斯混合效果很好,我也应该有一个实质性的解释。如果OP甚至告诉我们更多有关数据的信息,则可能会有更好的猜测。
尼克·考克斯

10

跟随@Nick的答案和评论中的想法,您可以看到平坦次要模式所需的带宽有多大:

在此处输入图片说明

将这个核密度估计值作为近端零值(最接近数据的分布,但仍与零值假设(它是来自单峰总体的样本)一致)进行模拟。在模拟的样本中,辅助模式通常看起来并不那么明显,并且您无需为了使它变平而扩展带宽。

<code>在此处输入图片描述</ code>

正式这种方法会导致西尔弗曼(1981)给出的测试,“使用内核密度估计,调查方式”,JRSS乙43,1施魏格尔和霍尔兹曼的silvermantest封装实现了该测试,也可以通过大厅和约克(所描述的校准程序2001年),“关于西尔弗曼的测试为多模态的校准”,STATISTICA报11,第515,其为保守渐近调整。在单模态无效假设下对数据执行测试会导致p值(未经校准)为0.08,经过校准为0.02。我对浸入测试还不够熟悉,无法猜测为什么会有所不同。

R代码:

  # kernel density estimate for x using Sheather-Jones method to estimate b/w:
density(x, kernel="gaussian", bw="SJ") -> dens.SJ
  # tweak b/w until mode just disappears:
density(x, kernel="gaussian", bw=3160) -> prox.null
  # fill matrix with simulated samples from the proximal null:
x.sim <- matrix(NA, nrow=length(x), ncol=10)
for (i in 1:10){
  x.sim[ ,i] <- rnorm(length(x), sample(x, size=length(x), replace=T), prox.null$bw)
}
  # perform Silverman test without Hall-York calibration:
require(silvermantest)
silverman.test(x, k=1, M=10000, adjust=F)
  # perform Silverman test with Hall-York calibration:
silverman.test(x, k=1, M=10000, adjust=T)

+1。有趣!这里使用什么内核?正如我模糊地记得,为什么将高斯核用于这种方法的正式变体有一些微妙的原因。
尼克·考克斯

@Nick:高斯内核,但是我不记得是否有令人信服的理由。每个模拟样本都经过重新缩放,并且对原始测试的保守偏见进行了纠正-我认为是由Storey提出的。
Scortchi-恢复莫妮卡

@NickCox:对不起,根本不是楼层。
Scortchi-恢复莫妮卡

@Scortchi,我稍微调整了您的文本和代码。我希望你不要介意。+1。另外,您使用可怕的向右箭头分配运算符吗?哦,人类...
龚–恢复莫妮卡

2
确实并没有好坏之分,但是编程中的惯例是在左侧声明变量,并在右侧指定赋值。许多人被吓坏了->; 我很困惑。
gung-恢复莫妮卡

7

需要担心的事情包括:

  1. 数据集的大小。它不是很小,也不是很大。

  2. 您所看到的对直方图原点和箱宽度的依赖性。仅凭一种选择,您(和我们)就不会敏感。

  3. 在密度估计中,您看到的内容与内核类型和宽度以及任何其他选择的相关性。仅凭一种选择,您(和我们)就不会敏感。

在其他地方,我曾尝试性地提出,模式的可信度通过实质性的解释以及在其他相同大小的数据集中辨别相同模态的能力得到支持(但未确立)。(越大越好。...)

我们无法在此处评论任何一个。重复性的一个小技巧是比较您使用相同大小的引导程序样本得到的结果。这是使用Stata进行令牌实验的结果,但是您所看到的是任意限制为Stata的默认值,这些默认值被记录为拔掉了。我得到了原始数据的密度估计值,以及来自同一数据的24个引导程序样本的密度估计值。

我认为经验丰富的分析师会从您的图表中以任何方式猜测(几乎没有更多)。左手模式具有高度可重复性,而右手模式显然更脆弱。

请注意,这是不可避免的:由于在右侧模式下的数据较少,因此它不会总是出现在引导程序样本中。但这也是关键。

在此处输入图片说明

请注意,上面的第3点保持不变。但是结果介于单峰和双峰之间。

对于那些感兴趣的人,这是代码:

clear 
set scheme s1color 
set seed 2803 

mat data = (10346, 13698, 13894, 19854, 28066, 26620, 27066, 16658, 9221, 13578, 11483, 10390, 11126, 13487, 15851, 16116, 24102, 30892, 25081, 14067, 10433, 15591, 8639, 10345, 10639, 15796, 14507, 21289, 25444, 26149, 23612, 19671, 12447, 13535, 10667, 11255, 8442, 11546, 15958, 21058, 28088, 23827, 30707, 19653, 12791, 13463, 11465, 12326, 12277, 12769, 18341, 19140, 24590, 28277, 22694, 15489, 11070, 11002, 11579, 9834, 9364, 15128, 15147, 18499, 25134, 32116, 24475, 21952, 10272, 15404, 13079, 10633, 10761, 13714, 16073, 23335, 29822, 26800, 31489, 19780, 12238, 15318, 9646, 11786, 10906, 13056, 17599, 22524, 25057, 28809, 27880, 19912, 12319, 18240, 11934, 10290, 11304, 16092, 15911, 24671, 31081, 27716, 25388, 22665, 10603, 14409, 10736, 9651, 12533, 17546, 16863, 23598, 25867, 31774, 24216, 20448, 12548, 15129, 11687, 11581)
set obs `=colsof(data)' 
gen data = data[1,_n] 

gen index = . 

quietly forval j = 1/24 { 
    replace index = ceil(120 * runiform()) 
    gen data`j' = data[index]
    kdensity data`j' , nograph at(data) gen(xx`j' d`j') 
} 

kdensity data, nograph at(data) gen(xx d) 

local xstuff xtitle(data/1000) xla(10000 "10" 20000 "20" 30000 "30") sort 
local ystuff ysc(r(0 .0001)) yla(none) `ystuff'   

local i = 1 
local colour "orange" 
foreach v of var d d? d?? { 
    line `v' data, lc(`colour') `xstuff'  `ystuff' name(g`i', replace) 
    local colour "gs8" 
    local G `G' g`i' 
    local ++i 
} 

graph combine `G' 

+1我喜欢您的自举方法:图表集可帮助所有人更好地理解数据。我想知道这些图对Stata估计带宽的方式是否敏感。我怀疑它可能会导致功率不足的测试,因为它的估计可能基于单峰假设,从而导致相对较宽的带宽。甚至稍微窄一些的带宽估计也可能使第二种模式在所有自举样本中更加突出。
ub

2
@whuber谢谢!像往常一样,您会无误地专注于我们需要担心的弱点,我同意。随着内核带宽的增加,单峰性的出现趋于不可避免。相反,小带宽通常仅表示不可重复和/或琐碎的虚假模式。权衡确实是微妙的。我认为这种方法的主要优点是“如果我们摇晃一下就可以复制吗?” 我经常担心软件用户愿意复制默认结果而不进行反思。
尼克·考克斯

2
有一些系统的方法可以解决此问题,这些方法基于逐渐更改带宽并随着带宽变化跟踪模式的出现和消失。本质上,可信模式会持续存在,而低于可信度的模式则不会。这是一种可爱的方法,但是有时会在铲子起作用时触发隧道构造函数。例如,如果您旋转直方图选择,并且次级模式太容易消失(或移动),请不要相信它。
尼克·考克斯

2

LP非参数模式识别

LP非参数模式识别(算法名称LPMode,本文的参考文献在下面给出)

MaxEnt模式[图中的红色三角形]:12783.36和24654.28。

L2模式[图中的绿色三角形]:13054.70和24111.61。

有趣的是要注意模态形状,尤其是第二个模态形状显示出明显的偏斜度(传统高斯混合模型可能会在此处失效)。

Mukhopadhyay,S.(2016)大规模模式识别和数据驱动科学。 https://arxiv.org/abs/1509.06428


1
您能否详细说明并提供一些背景信息来介绍和解释这些方法?链接到这篇论文很好,但是我们希望这里的答案是独立的,尤其是当链接失效时。
gung-恢复莫妮卡

上下文是原始问题:是否存在多模式性?如果是这样的话。与新方法的相关性来自这样一个事实,即以非参数方式进行颠簸搜寻是很难建模的问题。
深穆克吉

@gung要求您扩大答案。例如,结果来自没有公开版本的论文中解释的方法。
尼克·考克斯

2
不,我的意思是“ LP非参数模式识别”?什么是“ MaxEnt”?等等。用几句话,这是如何工作的?为什么/何时可能比其他方法更好?等等,我知道您已链接到解释它们的论文,但是最好在此处添加几句话来介绍它们,特别是如果该链接无效的话,即使这样也无法使将来的读者了解它们是否想追求这种方法。
gung-恢复莫妮卡

2
@DeepMukherjee,您当然不需要重写文章中的整个论文。只需添加几句话,说明它是什么以及它如何工作。
gung-恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.