谈谈 Python 中的 McNemar 检验(三)

前两个文章主要讲的是 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 检验算法的具体介绍,供有兴趣的朋友参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值