根据预期分布测试随机生成的数据


17

我写了一个程序,可以生成随机数据。如果程序正常运行,则该数据应遵循特定的已知概率分布。我想运行该程序,对结果进行一些计算,并得出一个p值。

在其他人说之前:我了解假设检验无法检测程序何时正常运行。它只能以特定方式检测何时无法正确运行。(即使如此,测试还是应该在X%的时间内失败,具体取决于您选择的显着性水平...)

因此,我试图了解哪种工具合适。尤其是:

  • 我可以根据需要生成任意多的随机数据。我要做的就是让程序运行足够长的时间。因此,我不限于任何特定的样本量。

  • 我对产生p值的技术感兴趣。因此,盯着图说“是的,看起来有点线性”并不是一个有趣的选择。除非有某种方法可以将硬数字放在图形的“奇特性”上。;-)

我到目前为止所知道的:

  • 我已经看到提到了三种主要的测试,听起来可能适用:[Pearson]卡方测试,Kolmogorov-Smirnov测试和Anderson-Darling测试。

  • 卡方检验似乎适用于离散分布,而其他两个检验更适合于连续分布。(?)

  • 各种资料表明,AD测试比KS测试“更好”,但是没有进一步详细介绍。

最终,所有这些测试都可能检测出偏离指定零分布的“不同方式”。但是我还真的不知道它们之间的区别是什么...总之,我正在寻找某种一般性的描述,以说明每种类型的测试最适用的位置以及可以最好地检测到哪些类型的问题。


如果您自己编写了代码,则一旦超出了知识的限制(已嵌入到设计中),它几乎注定会失败。看一下random.org/analysis,其中列出了一些检查方法,当然还有stackoverflow.com/q/2130621/717355。从哲学上讲,如果该程序是确定性的,则无论如何都不可以是随机的;-)这绝对是一个值得研究的主题(并且不要忘了密码黑客的秘密讨论)。
菲利普·奥克利2014年

Answers:


21

这是上述3种方法的一般描述。

Chi-Squared方法的工作原理是根据分布将仓中的观察数与预计仓中的观察数进行比较。对于离散分布,垃圾箱通常是离散的可能性或它们的组合。对于连续分布,您可以选择切点来创建箱。许多实现此功能的功能会自动创建垃圾箱,但是如果您要在特定区域进行比较,则应该能够创建自己的垃圾箱。此方法的缺点是,将不会检测到仍将值放在同一bin中的理论分布和经验数据之间的差异,例如,如果在理论上应将2到3之间的数字扩展到整个范围,则将进行舍入(我们希望看到类似2.34296的值),

KS检验统计量是被比较的两个累积分布函数之间的最大距离(通常是理论值和经验值)。如果2个概率分布只有1个交点,则1减去最大距离就是2个概率分布之间的重叠区域(这有助于某些人可视化所测量的内容)。考虑在同一个图上绘制理论分布函数和EDF,然后测量两个“曲线”之间的距离,最大的差异是测试统计量,并且当null为真时,将其与值的分布进行比较。这捕获了分布形状或与另一分布相比偏移或拉伸的1个分布的差异。1个ñ。该测试取决于您知道参考分布的参数,而不是根据数据进行估计(您的情况在这里看起来不错)。如果您从相同的数据估计参数,则仍可以通过与您自己的仿真而不是标准参考分布进行比较来获得有效的测试。

Anderson-Darling检验还像KS检验一样使用CDF曲线之间的差异,但不是使用最大差异,而是使用2条曲线之间的总面积的函数(实际上是对差异进行平方,对它们进行加权,以便尾部具有更多的影响力,然后在分布范围内进行整合)。与KS相比,这给异常值提供了更大的权重,并且在存在几个小差异时(与KS强调的1个大差异相比)也赋予了更大的权重。这可能最终使测试无法胜任,以发现您认为不重要的差异(温和的四舍五入等)。像KS测试一样,它假定您没有从数据中估计参数。

这是一个图表,显示了最后2条的总体思路:

在此处输入图片说明

基于此R代码:

set.seed(1)
tmp <- rnorm(25)
edf <- approxfun( sort(tmp), (0:24)/25, method='constant', 
    yleft=0, yright=1, f=1 )

par(mfrow=c(3,1), mar=c(4,4,0,0)+.1)
curve( edf, from=-3, to=3, n=1000, col='green' )
curve( pnorm, from=-3, to=3, col='blue', add=TRUE)

tmp.x <- seq(-3, 3, length=1000)
ediff <- function(x) pnorm(x) - edf(x)
m.x <- tmp.x[ which.max( abs( ediff(tmp.x) ) ) ]
ediff( m.x )  # KS stat
segments( m.x, edf(m.x), m.x, pnorm(m.x), col='red' )  # KS stat

curve( ediff, from=-3, to=3, n=1000 )
abline(h=0, col='lightgrey')    

ediff2 <- function(x) (pnorm(x) - edf(x))^2/( pnorm(x)*(1-pnorm(x)) )*dnorm(x)
curve( ediff2, from=-3, to=3, n=1000 )
abline(h=0)

上方的图表显示了来自标准法线的样品的EDF与标准法线的CDF的对比,并用线表示KS统计。中间的图显示了两条曲线之间的差异(您可以看到KS统计数据发生的位置)。然后底部是加权差的平方,AD测试基于该曲线下的面积(假设我正确无误)。

其他测试则查看qqplot中的相关性,查看qqplot中的斜率,根据矩比较均值,var和其他统计量。


+1,这是对实际问题的一个很好的答案(与我的不同)。如果您愿意创建一个描述,则贯穿第3款中部的描述只是为了举例说明。
gung-恢复莫妮卡

这是一个非常好的答案。只是为了确保我完全理解:KS测试返回CDF和EDF之间的最大偏差,而AD返回两条曲线之间的总[加权]面积?
MathchiticalOrchid'5

@MathematicalOrchid,通常是正确的,AD将距离平方,然后权重,然后积分,因此它与该区域有些不同(尽管为了理解,将其视为一个区域可能还可以,并且要简单得多)。
格雷格·斯诺

1
我希望,如果您的理论分布具有点质量(给定点处CDF的垂直跳变),而您的数据的实际分布具有几乎但不完全相同的位置处的点质量,则KS检验可能会更好进行AD测试。但是这种情况可能有点人为。KS测试确实允许单面测试,而AD总是两面测试,因此这是另一个区别(只是不常见)。
格雷格·斯诺

2
我不喜欢@MathematicalOrchid表征,即KS统计仅取决于“一个极端”。CDF中“一个点”的位置(通常在分布的中间)取决于集合中其他点的值,因此不像该语言向幼稚的听众暗示的那样孤立或孤立。
DWin

12

+1可以写出清晰而详细的问题。我希望我的回答不会太令人沮丧。我认为,假设检验不适用于您的情况。当答案可能为是或否,但您不知道哪个时,空假设重要性检验是合理的做法。(不幸的是,它实际上没有告诉您哪个,但这是一个不同的问题。)就您而言,我想知道您的算法是否不错。但是,众所周知(肯定),没有计算机程序可以从任何概率分布中生成真正的随机数据。首先是正确的,因为所有计算机都是有限状态机,因此只能产生伪随机数。此外(除了缺乏真正的随机性之外),生成的值不可能完美地遵循任何连续分布。有几种方法可以理解这一点,但也许最简单的方法是在数字行中存在“空白”,这对于任何连续的随机变量而言都不是正确的。此外,这些间隙并非都完全相等地宽或彼此完全等距。在从事伪随机数生成研究的计算机科学家中,游戏的名称是改进算法,以使差距更小,更均匀,周期更长(并且可以更快地生成更多值)。无论如何,这些事实表明,假设检验是确定算法是否正确遵循“特定的已知概率分布”的错误方法,因为不是。(抱歉。)

相反,更合适的框架是确定数据与理论分布的接近程度。为此,我建议您重新考虑图,特别是qq-plotspp-plots1个-β[R=1个

另一方面,关于评估算法的质量,您可能需要相对于其他标准pRNG计时。

希望这可以帮助。


并不是我所要求的,但仍然很有见识。我以“不连续”为前提,您基本上是指计算机没有实现无限精度算术?
MathematicalOrchid

这是其中很大一部分,但不是整个问题。这是一个非常复杂的话题。
gung-恢复莫妮卡

1
@gung第一段的某些想法SnowsPenultimateNormalityTestTeachingDemosR 的程序包中的函数中实现。我同意@gung的观点,即着眼于衡量接近度,而不是关注p值。为此,在qq图中使用相关性的一个问题是,如果您的数据具有正确的形状,但均值,方差等不同,那么您仍然可以获得非常高的相关性。一种替代方法是使用KS统计量或AD统计量作为与理论差异的度量。
格雷格·斯诺

@gung,谢谢您的回答。您能否详细说明一下“已正确转换了数据以进行绘图,并已从相关的理论分布中计算出相应的值,您可以将它们关联起来”?已经计算了pp或qq绘图的数据,下一步将如何获得您提到的r分数?这是一些著名的测试吗?你能给个参考吗?谢谢!
伊万2015年

1

我还没有完全阅读所有答案,但是我确实看到它们非常彻底和准确。冒着我重复长答案中埋藏的某些东西的风险,我只想说v =卡方检验可用于连续数据。它可能不是最好的测试,并且像许多测试一样,它依赖于渐近理论,因此在带有稀疏细胞的小样本中可能不准确(这也取决于分仓的方式)。与KS测试相比,Anderson-Darling在测试正态性方面更强大,但对于其他连续分布,KS可能更好。Lillefors有一个针对指数分布的测试。

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.