本文参考Cohen 19951的5.3节。
F1, 中位数,四分位距IQR等指标的统计检验
对于许多有趣的统计数据,例如剪裁平均值(Trimmed Mean),四分位间距(IQR)和F1-score,没有明确的样本分布公式。这时可以用到随机统计检验(Randomization Tests).
随机统计检验(Randomization Tests)
与传统的参数检验和bootstrap检验相比,随机统计检验可以在不参考总体参数(例如,中位数这个指标的统计分布)的情况下,判断两个样本的区别是否统计显著。下面给具体例子:
1. 举例:比较两组数据的IQR是否有显著差别
有两个班参加同一个考试。第一个班有25名学生,第二个班有20名学生。学生分数如下:
Sample 1:
48.35, 53.93, 55.48, 45.67, 52.82,49.47, 57.00, 53.61, 57.69, 51.34,44.98, 54.70, 59.32, 51.70, 50.73,46.84, 63.13, 52.50, 49.67, 54.07,44.96, 48.68, 53.94, 59.00, 50.92
Sample 2:
64.82, 51.69, 57.00, 58.17, 40.63,50.90, 48.77, 40.33, 50.76, 49.64,56.25, 65.68, 57.50, 47.45, 46.78,61.34, 53.66, 49.10, 54.49, 54.15
我们想知道样本2是否比样本1的组内差异更大(more variable, or, with larger standard deviation)。这里用四分位间距IQR来衡量组内差异。使用的python的scipy.stat.iqr
计算出Sample 1和Sample 2的IQR分别为5.23和8.11。差额是dIQR=5.23−8.11=−2.88d_{IQR}=5.23-8.11=-2.88dIQR=5.23−8.11=−2.88。为了确定这种差异偶然产生的概率,我们需要dIQRd_{IQR}dIQR的值分布。与比较两组数的均值大小是否有显著差异不同,我们不能写出dIQRd_{IQR}dIQR的解析分布(对于均值,可以将dmeand_{mean}dmean转化成Standard Normal Distribution,参考z-test)。所以需要一些其他的方法,e.g., Randomization Tests.
现在考虑假设检验:H0H_0H0:两个样本的IQR水平相同。如果H0H_0H0是正确的,那么在样本之间随机交换分数几乎不会影响dIQRd_{IQR}dIQR。这将导致以下过程:随机地对两组数进行Shuffle,以对dIQRd_{IQR}dIQR的分布进行抽样。
2. 操作步骤:
设SAS_ASA和SBS_BSB是两个大小为NAN_ANA和NBN_BNB的样本。设θ=f(SA,SB)\theta=f(S_A,S_B)θ=f(SA,SB)是根据两个样本计算的某个统计量,例如样本的IQR。设SA+B=SA+SBS_{A+B}=S_A+S_BSA+B=SA+SB,即SAS_ASA和SBS_BSB两个集合的并集。
执行KKK次:
彻底Shuffle SA+BS_{A+B}SA+B的元素将SA+BS_{A+B}SA+B的前NAN_ANA元素分配给随机伪样本Ai∗A_i^*Ai∗,并将其余的NBN_BNB个元素赋给为Bi∗B_i^*Bi∗。计算θi∗=f(Ai∗,Bi∗)\theta_i^*=f(A_i^*, B_i^*)θi∗=f(Ai∗,Bi∗),并记录结果。
在H0H_0H0假设下,θ\thetaθ与这个方法抽样出来的{θi∗}\{\theta_i^*\}{θi∗}同分布。
对于上面的例子,通过执行这些过程,我们获得了500个dIQR∗d_{IQR}^*dIQR∗的值。分布直方图如下所示。
分布的平均值为0.007825,标准差为2.478。如果Sample 2的IQR明显大于Sample 1,那么dIQR=−2.88d_{IQR}=-2.88dIQR=−2.88应该是一个绝对值异常大的负数。但是,在分布中,只有12.6%的值小于-2.88,这意味着我们不能拒绝H0H_0H0(在p<0.05p<0.05p<0.05的水平下)。为此,我们不能说Sample 2比Sample 1的IQR大得多。
from scipy.stats import iqrimport matplotlib.pyplot as pltimport numpy as nps_a = [48.35, 53.93, 55.48, 45.67,52.82,49.47, 57.00, 53.61, 57.69, 51.34,44.98, 54.70, 59.32, 51.70, 50.73,46.84, 63.13, 52.50, 49.67, 54.07,44.96, 48.68, 53.94, 59.00, 50.92]s_b = [64.82, 51.69, 57.00, 58.17, 40.63,50.90, 48.77, 40.33, 50.76, 49.64,56.25, 65.68, 57.50, 47.45, 46.78,61.34, 53.66, 49.10, 54.49, 54.15]print(iqr(s_a))print(iqr(s_b))K = 500thetas = []s_ab = np.array(s_a + s_b)for i in range(K):idx = np.random.permutation(len(s_ab))s_a_star, s_b_star = s_ab[idx[:len(s_a)]], s_ab[idx[len(s_a):]]thetas.append(iqr(s_a_star)-iqr(s_b_star)) plt.hist(thetas, bins=20)plt.show()
如果想要检验f1、中位数等,只需要更换f()f()f()function的形式就好。
3. 双样本ttt-test的随机形式
当测试两个样本的平均值时,原始样本为SAS_ASA和SBS_BSB,样本统计值为θ=xˉSA−xSBˉ\theta=\bar{x}_{S_A}-\bar{x_{S_B}}θ=xˉSA−xSBˉ。使用上面的过程,我们可以生成θi∗\theta_i^*θi∗的分布。对于双尾检验,在p<0.05p<0.05p<0.05下,我们应该检查θ\thetaθ是否落在抽样分布的2.5%上下。
4. 其他随机Test方法(Computer-Intensive Statistical Methods)
Monte Carlo Tests
从正态分布(或者某个分布)中提取样本来重构样本数据。
检查一组样本中的某些统计数据是否显著大/小(异常)。
最好知道分布情况。
bootstrap方法
在有限的样本中bootstrap。
bootstrap两个样本,其他样本与随机试验相似。
5. 其他
采样次数:比如有SA+BS_{A+B}SA+B中有nnn个样本,那理论上有2n2^n2n种shuffle方法。如果n<=20n<=20n<=20,那么直接采样2n2^n2n次,如果n>20n>20n>20,采样2202^{20}220次2。
Cohen, Paul R. Empirical methods for artificial intelligence. Vol. 139. Cambridge, MA: MIT press, 1995. ↩︎
Yeh, Alexander. “More accurate tests for the statistical significance of result differences.” Proceedings of the 18th conference on Computational linguistics-Volume 2. 2000. ↩︎
如果觉得《F1 中位数 四分位距IQR等指标的统计检验》对你有帮助,请点赞、收藏,并留下你的观点哦!