前两个文章主要讲的是 McNemar 的原理,文章参考如下:
谈谈 Python 中的 McNemar 检验(一)-CSDN博客
谈谈 Python 中的 McNemar 检验(二)-CSDN博客
这一篇主要说一说 McNemar 的具体算法。
引用上面第一篇文章里的例子,关键是看数据 b 和 c。在第二篇文章里的例子,主要是将模型2的结果比模型1大的个数定义为b,而将模型2的结果比模型1小的个数定义为c,其实二个例子的原理是相同的,都是在比较 b 和 c。
下面,开始将具体算法。
首先,对b和c取较小值,定义为 m=min(b,c)
其次,无论你使用的是 游程模块 还是 列联表模块的 McNemar,算法都是一样的。即 m 服从参数为 (b+c, 0.5)的二项分布的,并由此得到m对应的p值。这是因为,当两个模型无差异时,m应该接近(b+c)的一半,因此用二项分布做检验。其实,m就是代码结果中的统计量值。在第二篇文章中的m=2也就是输出的统计量值。
需要提到的一点是,在我们的代码中使用了一个参数 exact=True,它的目的就是使用严格的二项分布的意思。我们可以选择 exact=False,但这样做的话,算法中将用 卡方分布 代替 二项分布(卡方分布对二项分布在数据量较多时的一种近似)。而且,如果选择 exact=True时即使用二项分布,后面那个correction= True或者False其实就不起作用了。 correction= True的作用是当我们选择卡方分布时让我们选择是否对卡方做连续性修正用的。
卡方分布下的统计量不再是 m=min(b,c),而变为 s = [ abs(b - c) - correction ] ^2 / (b+c),其中参数correction=True时取1,参数correction=False时取0。然后,s服从自由度为1的卡方分布,从而得到对应的p值。
以上是对 McNemar 检验算法的具体介绍,供有兴趣的朋友参考。