问题简介
药瓶里有四片药,记为 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。假设在摇匀后,每片药被倒出的概率相等。现在我有一个方法,似乎能准确地通过倒药把它们分开;我成功了几次,然后我想知道这个方法是真的有效还是只是凭运气。具体地,有两个问题:
- 通过这个方法连续成功多少次能在显著度 α \alpha α下说明不是凭运气
- 通过这个方法在大量实验中成功多大比例能在显著度 α \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)(∣x−32(x+y)∣−1)2+31(x+y)(∣y−31(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 n→∞limny≈0.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