倒药的数学 卡方检验

本文探讨了一个倒药的问题,通过卡方检验来判断一种方法是否比随机选择更有效地将药片分开。介绍了卡方检验的基本原理,并使用Python计算临界值,得出至少连续成功5次才能在显著性水平α=0.05下证明方法的有效性。此外,发现长期来看,只要成功率超过0.41,即可说明方法并非纯靠运气。
摘要由CSDN通过智能技术生成

问题简介

药瓶里有四片药,记为 A , B , C , D A,B,C,D A,B,C,D。现在我想把 A , B A,B A,B C , D C,D C,D分开,因此只需倒出 A , B A,B A,B C , D C,D C,D。假设在摇匀后,每片药被倒出的概率相等。现在我有一个方法,似乎能准确地通过倒药把它们分开;我成功了几次,然后我想知道这个方法是真的有效还是只是凭运气。具体地,有两个问题:

  1. 通过这个方法连续成功多少次能在显著度 α \alpha α下说明不是凭运气
  2. 通过这个方法在大量实验中成功多大比例能在显著度 α \alpha α下说明不是凭运气

卡方检验

卡方检验是解决这两个问题的有力工具,因为由[1]可知,卡方检验可用于根据样本数据推断总体分布与期望分布是否有显著差异。

设置原假设 H 0 H_0 H0为:我的方法与随机发生没有显著差别。那么备择假设 H 1 H_1 H1为:我的方法显著地优于或劣于随机发生。我们设置显著度 α = 0.05 \alpha=0.05 α=0.05

首先来定义什么叫随机发生。由问题简介可知,成功分药的概率为 2 / ( 4 2 ) = 1 / 3 2/\binom{4}{2}=1/3 2/(24)=1/3,那么不成功分药的概率为 2 / 3 2/3 2/3。然后我们定义 x x x为用我的方法失败的次数, y y y为用我的方法成功的次数。由此我们可以列出以下表格:

失败成功
我的方法 x x x y y y
随机发生 2 3 ( x + y ) \frac{2}{3}(x+y) 32(x+y) 1 3 ( x + y ) \frac{1}{3}(x+y) 31(x+y)

卡方检验的计算公式为

χ 2 = ( ∣ x − 2 3 ( x + y ) ∣ − 1 ) 2 2 3 ( x + y ) + ( ∣ y − 1 3 ( x + y ) ∣ − 1 ) 2 1 3 ( x + y ) \chi^2 = \frac{(|x-\frac{2}{3}(x+y)|-1)^2}{\frac{2}{3}(x+y)}+\frac{(|y-\frac{1}{3}(x+y)|-1)^2}{\frac{1}{3}(x+y)} χ2=32(x+y)(x32(x+y)1)2+31(x+y)(y31(x+y)1)2

其中分子平方中的减一项是在 x , y x,y x,y很小时的连续性校正。

χ 2 \chi^2 χ2大于临界值时我们可以拒绝 H 0 H_0 H0 [2]。由于此问题自由度为 1 1 1(上文表格行数减一乘以列数减一),根据上文设定的 α \alpha α查表得临界值为 3.84 3.84 3.84。因此我们只需判断是否 χ 2 > 3.84 \chi^2>3.84 χ2>3.84

顺便提一下Python计算临界值的方法为:

#import scipy.stats

# 临界值
# alpha为显著度,df为自由度
th = scipy.stats.chi2.ppf(q=1-alpha, df=1)

实验

Python代码:

def chi2(x, y):
    return ((abs(2 / 3 * (x + y) - x) - 1)**2 / (2 / 3 * (x + y)) +
            (abs(1 / 3 * (x + y) - y) - 1)**2 / (1 / 3 * (x + y)))

def calc_Y(X):
    Y = []
    for x in X:
        for y in range(1, 1000000):
            v1 = chi2(x, y)
            v2 = chi2(x, y + 1)
            if v1 > 3.84 and v2 > v1:
                Y.append(y)
                break
    return Y

import numpy as np
X = np.arange(100)
Y = np.asarray(calc_Y(X))
table = np.stack((X, Y), axis=1)
print(table)

代码中的1000000只要是一个足够大的数即可。计算chi2(x, y) > 3.84仅能拒绝 H 0 H_0 H0,但不能判断我的方法是否优于随机,因为还有可能劣于随机,因此还要计算chi2(x, y+1)并检查此值是否大于chi2(x,y)。这样计算出的y为能使我的方法在给定失败数的情况下优于随机的最小成功数。

输出:

[[ 0  5]
 [ 1  6]
 [ 2  7]
 [ 3  8]
 [ 4  9]
 [ 5 10]
 [ 6 11]
 [ 7 11]
 [ 8 12]
 [ 9 13]
 [10 14]
 [11 14]
 [12 15]
 [13 16]
 [14 17]
 [15 17]
 [16 18]
 [17 19]
 [18 19]
 [19 20]
 [20 21]
 [21 21]
 [22 22]
 [23 23]
 [24 23]
 [25 24]
 [26 25]
 [27 25]
 [28 26]
 [29 27]
 [30 27]
 [31 28]
 [32 29]
 [33 29]
 [34 30]
 [35 31]
 [36 31]
 [37 32]
 [38 33]
 [39 33]
 [40 34]
 [41 35]
 [42 35]
 [43 36]
 [44 36]
 [45 37]
 [46 38]
 [47 38]
 [48 39]
 [49 39]
 [50 40]
 [51 41]
 [52 41]
 [53 42]
 [54 43]
 [55 43]
 [56 44]
 [57 44]
 [58 45]
 [59 46]
 [60 46]
 [61 47]
 [62 47]
 [63 48]
 [64 49]
 [65 49]
 [66 50]
 [67 50]
 [68 51]
 [69 52]
 [70 52]
 [71 53]
 [72 53]
 [73 54]
 [74 55]
 [75 55]
 [76 56]
 [77 56]
 [78 57]
 [79 58]
 [80 58]
 [81 59]
 [82 59]
 [83 60]
 [84 61]
 [85 61]
 [86 62]
 [87 62]
 [88 63]
 [89 64]
 [90 64]
 [91 65]
 [92 65]
 [93 66]
 [94 67]
 [95 67]
 [96 68]
 [97 68]
 [98 69]
 [99 69]]

输出的第一行解决了问题一,即至少要连续成功 5 5 5次才能说明我的方法显著优于随机。输出的最后一行说明:

lim ⁡ n → ∞ y n ≈ 0.41 \lim_{n \rightarrow \infty} \frac{y}{n} \approx 0.41 nlimny0.41

其中 n = x + y n=x+y n=x+y。即在大量实验中只要我的方法成功率大于 0.41 0.41 0.41就能说明我的方法真的有效而不是凭运气。这里有一点反直觉的事,成功数目不必大于失败数目,这是由于随机发生的成功率小于 1 / 2 1/2 1/2


参考文献

[1] https://zhuanlan.zhihu.com/p/128905132
[2] https://zhuanlan.zhihu.com/p/143636925

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值