比率检验原理及R语言实现

总体比率的假设检验实际上是业界最常用也是最需要的检验,例如在ABtest中,检验两个实验的转化率是否有显著差异,则需要用到比率检验。本文介绍比率检验的原理,以及R语言的实现代码。

单总体比率的假设检验

前提条件:

  • 样本取自两点分布 X ∼ B ( 1 , p ) X \sim B(1,p) XB(1,p)
  • 样本量 n n n很大,能够满足 n p > 5 np>5 np>5 n ( 1 − p ) > 5 n(1-p)>5 n(1p)>5

记要检验的原假设为为 H 0 : p = p 0 H_0: p=p_0 H0:p=p0,则样本比率 p ~ \widetilde{\mathrm{p}} p 服从方差为 p ( 1 − p ) / n p(1-p)/n p(1p)/n的正态分布,对应标准化的检验统计量近似服从 N ( 0 , 1 ) N(0,1) N(0,1)

u = n ( p ~ − p 0 ) p 0 ( 1 − p 0 ) \mathrm{u}=\frac{\sqrt{\mathrm{n}}\left(\widetilde{\mathrm{p}}-\mathrm{p}_{0}\right)}{\sqrt{\mathrm{p}_0\left(1-\mathrm{p}_0\right)}} u=p0(1p0) n (p p0)

实际上,当样本量很少时,需要采用精确的比率检验,即直接使用二项分布来检验,具体实现见下文的R代码。

两个总体比率的假设检验

检验前提条件:

  • 两总体互相独立
  • 变量都取自两点分布,即两总体服从二项分布
  • 两总体且每类的样本量满足大于5的要求,从而能用正态分布来近似

那么可知:

( p ~ 1 − p ~ 2 ) − ( p 1 − p 2 ) p 1 ( 1 − p 1 ) n 1 + p 2 ( 1 − p 2 ) n 2 ≈ ( p ~ 1 − p ~ 2 ) − ( p 1 − p 2 ) p 1 ( 1 − p ~ 1 ) n 1 + p ~ 2 ( 1 − p ~ 2 ) n 2 ∼ N ( 0 , 1 ) \frac{\left(\widetilde{\mathrm{p}}_1-\widetilde{\mathrm{p}}_2\right)-\left(\mathrm{p}_1-\mathrm{p}_2\right)}{\frac{\mathrm{p}_1\left(1-\mathrm{p}_1\right)}{\mathrm{n}_1}+\frac{\mathrm{p}_2\left(1-\mathrm{p}_2\right)}{\mathrm{n}_2}} \approx \frac{\left(\widetilde{\mathrm{p}}_1-\widetilde{\mathrm{p}}_2\right)-\left(\mathrm{p}_1-\mathrm{p}_2\right)}{\frac{\mathbb{p}_1\left(1-\widetilde{\mathrm{p}}_1\right)}{\mathrm{n}_1}+\frac{\widetilde{\mathrm{p}}_2\left(1-\widetilde{\mathrm{p}}_2\right)}{\mathrm{n}_2}} \sim \mathrm{N}(0,1) n1p1(1p1)+n2p2(1p2)(p 1p 2)(p1p2)n1p1(1p 1)+n2p 2(1p 2)(p 1p 2)(p1p2)N(0,1)

因此对应的标准化检验统计量如下:

  • 1)当原假设为 H 0 : p 1 − p 2 = 0 H_0:p_1-p_2=0 H0:p1p2=0时,最佳估计量为联合两组样本的比率 p ^ = x 1 + x 2 n 1 + n 2 = p 1 n 1 + p 2 n 2 n 1 + n 2 \hat{\mathrm{p}}=\frac{\mathrm{x}_1+\mathrm{x}_2}{\mathrm{n}_1+\mathrm{n}_2}=\frac{\mathrm{p}_1 \mathrm{n}_1+\mathrm{p}_2 \mathrm{n}_2}{\mathrm{n}_1+\mathrm{n}_2} p^=n1+n2x1+x2=n1+n2p1n1+p2n2,于是检验统计量如下:

z = ( p ~ 1 − p ~ 2 ) − 0 p ^ ( 1 − p ^ ) n 1 + p ^ ( 1 − p ^ ) n 2 = ( p ~ 1 − p ~ 2 ) p ^ ( 1 − p ^ ) ( 1 n 1 + 1 n 2 ) z=\frac{\left(\widetilde{p}_1-\widetilde{p}_2\right)-0}{\frac{\hat{p}(1-\hat{p})}{n_1}+\frac{\hat{p}(1-\hat{p})}{n_2}}=\frac{\left(\tilde{p}_1-\tilde{p}_2\right)}{\hat{p}(1-\hat{p})\left(\frac{1}{n_1}+\frac{1}{n_2}\right)} z=n1p^(1p^)+n2p^(1p^)(p 1p 2)0=p^(1p^)(n11+n21)(p~1p~2)

  • 2)当原假设为 H 0 : p 1 − p 2 = d 0 ( d 0 ≠ 0 ) H_0:p_1-p_2=d_0(d_0 \neq 0) H0:p1p2=d0(d0=0)时,直接用两个样本的比率 p ~ 1 \widetilde{p}_1 p 1 p ~ 2 \widetilde{p}_2 p 2相应估计两个总体的的比率 p 1 p_1 p1 p 2 p_2 p2,于是检验统计量入下:
    z = ( p ˉ 1 − p ˉ 2 ) − d 0 p ˉ 1 ( 1 − p ˉ 1 ) n 1 + p ˉ 2 ( 1 − p ~ 2 ) n 2 z=\frac{\left(\bar{p}_1-\bar{p}_2\right)-d_0}{\frac{\bar{p}_1\left(1-\bar{p}_1\right)}{n_1}+\frac{\bar{p}_2\left(1-\widetilde{p}_2\right)}{n_2}} z=n1pˉ1(1pˉ1)+n2pˉ2(1p 2)(pˉ1pˉ2)d0

R语言实现

除了直接用代码写上面的公式,实际上可以直接使用现成的检验函数:chisq.testprop.test,这两个函数默认都会加Yates 校正(修正小样本的影响,具体见文末),但要得到和上文公式一样的结果,则注意限制correct = F

  • 检验单总体比率是否等于特定的值:
    • prop.test,大样本才适用的近似检验
      • 不加Yates 校正和上文公式结果的平方一致(小样本一般都需要加Yates 校正)
    • binom.test,精确的比率检验,即直接使用二项分布检验是否是该比率
  • 检验两总体比率是否相等:
    • chisq.test,大样本才适应的近似检验
      • 不加Yates 校正和上文公式结果的平方一致(小样本一般都需要加Yates 校正)
      • 正态分布平方,服从自由度为1的卡方分布
      • 注意卡方检验的传参:是两个样本分别取0和1的数量(而不是取1的量和整体量n)
    • Fisher 精确检验,适用于小样本量(此处暂无示例)

单总体比率检验

x=60
n=2000
p_real=x/n
p0=0.02
u=sqrt(n)*(p_real-p0)/sqrt(p0*(1-p0))
u^2
# 不加校正,得到和u^2一致的结果
prop.test(x, n,p0, correct = F)

# > u^2
# [1] 10.20408
# > prop.test(x, n,p0, correct = F)$statistic
# X-squared 
# 10.20408 

实际上单比率检验,推荐直接使用精确的二项分布的假设检验即可。可以看到p值远小于0.05,因此拒绝比率是 p 0 p_0 p0 的原假设,认为改总体比率不为 p 0 p_0 p0

# > binom.test(x, n, p0)
# Exact binomial test
# 
# data:  x and n
# number of successes = 60, number of trials =
#     2000, p-value = 0.002974
# alternative hypothesis: true probability of success is not equal to 0.02
# 95 percent confidence interval:
#     0.02296955 0.03844886
# sample estimates:
#     probability of success 
# 0.03 

两总体比率相等的假设检验

# 检验的样本如下:
a=19;b=22;c=52;d=39
pA=a/(a+c);pB=b/(b+d)
nA=a+c;nB=b+d

# 借助chisq.test检验两总体比率是否一致
a1 <- rbind(c(nA*(1-pA),nA*pA), c(nB*(1-pB), nB*pB))
# 此处为了保持一致未加Yates 校正,但实际应用最好设置 correct=T
chisq.test(a1,correct=F)

# 直接计算统计量,和上面卡方检验的X-squared一致,都是 1.326693
p_fit=(a+b)/(a+b+c+d)
z2=(pA-pB)/sqrt((1/nA+1/nB)*p_fit*(1-p_fit))
z2^2
# > chisq.test(a1,correct=F)
# 
# Pearson's Chi-squared test
# 
# data:  a1
# X-squared = 1.3267, df = 1, p-value = 0.2494
# 
# > z2^2
# [1] 1.326693

可以看到p值大于0.05,认为无法拒绝原假设,即 p 1 = p 2 p_1=p_2 p1=p2

注意只是在这次样本里找不到拒绝的理由,不代表这两个比率就一定相等了

Yates 校正

小样本情况时Yates 校正后的卡方统计量可信度更高(大样本时对其影响很微弱),因此我们最常用加了Yates 校正后的比率检验,对应Yates 校正实际上是对卡方分布的统计量的修正,取平方之前将正偏差(观测-期望)减0.5,负偏差时加0.5,对应公式如下:

X 2 ( ( n 1 − 1 ) ∗ ( n 2 − 1 ) ) = ∑ i = 1 n 1 ∑ j = 1 n 2 ( ∣ O i j − E i j ∣ − 0.5 ) 2 E i j \mathrm{X}^2((n_1-1)*(n_2-1)) = \sum_{i=1}^{n_1}\sum_{j=1}^{n_2} \frac{\left(\left|O_{ij}-E_{ij}\right|-0.5\right)^2}{\mathrm{E}_{\mathrm{ij}}} X2((n11)(n21))=i=1n1j=1n2Eij(OijEij0.5)2

Tips

本文为博主从自己的github主页复制迁移至此,原文链接在博客 https://hetal-cq.github.io/

你可能感兴趣的:(统计基础,统计学,fisher精确检验,r语言)