测试统计软件


10

哪些技术/方法可用于测试统计软件?我对使用最大似然进行参数估计的程序特别感兴趣。

将结果与其他程序或已发布资源中的结果进行比较并不总是可能的,因为在我编写自己的程序的大多数时候,这是因为所需的计算尚未在现有系统中实现。

我并不是在坚持可以保证正确性的方法。我会对可以捕获部分错误的技术感到满意。

Answers:


8

一种有用的技术是蒙特卡洛测试。如果有两种算法执行相同的操作,则将两者都实现,将它们提供给随机数据,然后检查它们(在对数字模糊性的允许范围内)产生相同的答案。我之前已经做过几次:

  • 我编写了Kendall的Tau B的实现,但是效率很高,但很难实现。为了测试它,我编写了一个简陋的50行实现,运行在。 O N 2O(N log N)O(N2)

  • 我写了一些代码来做岭回归。进行此操作的最佳算法取决于您是否处于或情况,因此无论如何我都需要两种算法。 p > nn>pp>n

在这两种情况下,我都使用D编程语言实现了相对知名的技术(尚无实现),因此我还对照R检验了一些结果。尽管如此,蒙特卡洛测试捕获了我永远不会捕获的错误。 。

断言另一个好的测试。您可能不确切知道计算的正确结果是什么,但这并不意味着您不能在计算的各个阶段执行健全性检查。实际上,如果您的代码中包含很多这些内容并且都通过了,那么该代码通常是正确的。

编辑:第三种方法是将算法数据(合成的或真实的)馈送到您至少大致知道正确答案是什么的位置(即使您不确定确切答案是什么),并通过检查查看答案是否合理。例如,您可能不确切知道参数的估计值是什么,但是您可能知道哪些参数应该是“大”,哪些参数应该是“小”。


5

不知道这是否真的是您的问题的答案,但至少是切线相关的。

我在Maple中维护Statistics软件包。难以测试代码的一个有趣示例是根据不同的分布生成随机样本。很容易测试没有错误发生,但是要确定所生成的样本是否“足够”符合所请求的分布则比较棘手。由于Maple同时具有符号和数字功能,因此您可以使用一些符号功能来测试(纯数字)样本生成:

  1. 我们已经实施了几种类型的统计假设检验,其中一种是适合卡方的模型检验 -根据给定概率分布的逆CDF确定的仓中样本数的卡方检验。因此,例如,为了测试柯西分布样本的生成,我运行了类似

    with(Statistics):
    infolevel[Statistics] := 1:
    distribution := CauchyDistribution(2, 3):
    sample := Sample(distribution, 10^6):
    ChiSquareSuitableModelTest(sample, distribution, 'bins' = 100, 'level' = 0.001);
    

    因为我可以生成任意数量的样本,所以可以使非常小。α

  2. 对于具有有限矩的分布,我一方面计算了多个样本矩,另一方面,我象征性地计算了相应的分布矩及其标准误差。因此,例如beta分布:

    with(Statistics):
    distribution := BetaDistribution(2, 3):
    distributionMoments := Moment~(distribution, [seq(1 .. 10)]);
    standardErrors := StandardError[10^6]~(Moment, distribution, [seq(1..10)]);
    evalf(distributionMoments /~ standardErrors);
    

    这显示了递减的数字列表,最后一个是255.1085766。因此,即使是第十个矩,对于大小的样本,该矩的值也大于样本矩标准误差值的250倍。这意味着我可以实施一个或多或少如下运行的测试:106

    with(Statistics):
    sample := Sample(BetaDistribution(2, 3), 10^6):
    sampleMoments := map2(Moment, sample, [seq(1 .. 10)]);
    distributionMoments := [2/5, 1/5, 4/35, 1/14, 1/21, 1/30, 4/165, 1/55, 2/143, 1/91];
    standardErrors := 
      [1/5000, 1/70000*154^(1/2), 1/210000*894^(1/2), 1/770000*7755^(1/2), 
       1/54600*26^(1/2), 1/210000*266^(1/2), 7/5610000*2771^(1/2), 
       1/1567500*7809^(1/2), 3/5005000*6685^(1/2), 1/9209200*157366^(1/2)];
    deviations := abs~(sampleMoments - distributionMoments) /~ standardErrors;
    

    这些数字在distributionMomentsstandardErrors来自上面的第一次运行。现在,如果样本生成正确,则偏差数应该相对较小。我假设它们大致呈正态分布(虽然不是真的,但是足够接近-请记住,这些是样本矩的缩放版本,而不是样本本身),因此,例如,我可以标记出偏差为大于4-对应于一个样本矩,它比分布矩偏离标准误差的四倍以上。如果样本生成良好,这几乎不可能随机发生。另一方面,如果前10个采样矩与分布矩相匹配,且误差小于0.5%,则我们可以很好地近似分布。

这两种方法都起作用的关键在于,样本生成代码和符号代码几乎完全脱节。如果两者之间存在重叠,则该重叠中的错误可能会在样本生成及其验证中均显示出来,因此不会被捕获。


感谢您的回答。我“接受”另一个答案,因为我只能选择一个,这似乎稍微适合我的当前情况。但是您的回答也很有帮助。
Jyotirmoy Bhattacharya


2

StataCorp总裁William Gould在这篇Stata Journal文章中提供了很多细节。1这是一篇有关统计软件质量控制的非常有趣的文章。

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.