不一致的正态性检验:Kolmogorov-Smirnov vs Shapiro-Wilk

机器算法验证 假设检验 正态分布 Python kolmogorov-smirnov 测试
2022-03-27 22:02:42

我目前正在研究我编写的 MC 模拟产生的一些数据——我希望这些值是正态分布的。自然地,我绘制了一个直方图,它看起来很合理(我猜?):

[左上:直方图dist.pdf(),右上:累积直方图dist.cdf(),下:QQ图,datavs dist]

然后我决定通过一些统计测试来更深入地研究这个问题。(请注意dist = stats.norm(loc=np.mean(data), scale=np.std(data))。)我所做的和得到的输出如下:

  1. Kolmogorov-Smirnov 检验:

    scipy.stats.kstest(data, 'norm', args=(data_avg, data_sig))
    KstestResult(statistic=0.050096921447209564, pvalue=0.20206939857573536)
    
  2. 夏皮罗-威尔克测试:

    scipy.stats.shapiro(dat)
    (0.9810476899147034, 1.3054057490080595e-05)
    # where the first value is the test statistic and the second one is the p-value.
    
  3. QQ图:

    stats.probplot(dat, dist=dist)
    

我的结论是:

  • 通过查看直方图和累积直方图,我肯定会假设一个正态分布

  • 在查看 QQ 情节后也是如此(它会变得更好吗?)

  • KS 测试说:“是的,这是一个正态分布”

我的困惑是:SW 检验表明它不是正态分布的(p 值远小于显着性alpha=0.05,并且初始假设是正态分布)。没看懂,有没有人有更好的解释?我在某个时候搞砸了吗?

2个回答

分布与正态分布的不同之处有无数种。没有任何测试可以捕获所有这些。因此,每个测试在检查分布是否与正常值匹配的方式上有所不同。例如,KS 检验着眼于经验累积分布函数与正态的理论累积分布函数最大差异的分位数。这通常位于分布中间的某个地方,这不是我们通常关心的不匹配的地方。SW 测试侧重于尾部,这是我们通常关心的分布是否相似的地方。因此,通常首选 SW。此外,如果您使用从样本中估计的分布参数,则 KW 检验无效(请参阅:Shapiro-Wilk 正态性检验和 Kolmogorov-Smirnov 正态性检验有什么区别?)。您应该在这里使用 SW。

但是通常建议使用绘图而不建议进行测试(请参阅:正态性测试是否“基本上无用”?)。您可以从所有绘图中看到,相对于真正的法线,您有一个重的右尾和一个轻的左尾。也就是说,你有一点右偏。

您不能根据结果挑选正态性检验。在这种情况下,您要么在进行的任何测试中拒绝,要么根本不使用它们。KS 测试不是很强大,它不是一个“专门的”正态性测试。如果有的话,在这种情况下,SW 可能更值得信赖。

对我来说,你的 QQ 情节有肥右尾巴或向左倾斜的迹象,或两者兼而有之。我建议使用Tukey 的工具来研究尾巴的肥胖程度。它会告诉你一个分布有多像正态分布或柯西分布。