置换检验与参数检验
在这里我假定读者对常用的参数检验方法都比较熟悉,因此将重点放在介绍置换检验以及两者之间的比较。
置换检验通常用来判断不同的样本是否来自于同一个总体。置换检验的一大特点是并不假定整体的分布,因此使用时并无前置条件,这是与传统参数检验一个最显著的区别。
置换检验的基本流程是,将各组别的数据集中洗混,然后重新分配到各组,观测此时的统计量,然后重复上述过程若干次,得到统计量的一个分布,再将从原始数据中观测到的统计量与这个分布做比较,进而用大于或小于观测值的模拟值出现的频率来替代概率,进而对零假设做出推断。
下面这个视频有非常详细的演示,可以参考:
为什么需要置换检验
一开始我觉得很难理解置换检验,一方面它与传统的统计检验方式完全不同,依靠的不是公式,而是随机模拟。另一方面,也很难一下子领会到置换检验超远传统检验方式的价值。不过有句话说得好,"You buy data with assumptions",我认为要想深刻理解两者的区别,就要从零假设出发分析。
对于参数检验,以两独立样本t检验为例,t检验假设检验的总体服从正态分布,而参数t的实际意义是标准化后的均值差异,其零假设H0 是两组样本的均值相同。 由于两样本均服从正态分布,零假设的实际含义就变为两组样本服从相同的分布。根据观测的t值,对零假设作出判断。t检验的规范相对严格,一旦不满足前置假设,那么t检验参考的t值表就是不准确的,会影响结果的可信性。
而置换检验首先不假定总体的分布,其次也并不明确指定观测的统计量。置换检验的基本思想是,如果观察的条件对不同组别没有影响的话,那么将这些数据洗混也不会对观测量产生影响,因为这些数据来自同一总体,观测量的差异完全出于随机。在这种情况下,零假设H0可以宽泛的表述为两组样本没有差异。
置换检验观测的统计量由实验者确定,既可以是两组样本的均值,也可以计算t值,除此之外也可以是中位数,方差,相关系数等等。确定观测量后,零假设自然随之变化,比如,观测量为两组样本的均值差,零假设则为两组样本均值没有差异。
由此可以看出,传统的统计分析,其使用条件和零假设都控制的更精确,例如t检验只比较均值,方差分析比较的是组间均值的变异。而置换检验更是一种较为普适的方法,并不回答特定的问题
置换检验的优势?
这里我们用置换检验来比较两组数据的均值,进而与t检验进行比较,来观察置换检验的优劣短长。
如果用置换检验的方法比较均值,观测量有若干选择,第一种是观测量采用t值。这里即使不假定分布也可以使用t值,原因是:1.t值本身的含义是标准化的均值,并不依附于分布。2. 置换检验对t的显著性进行判断所依据的是模拟的分布,而并非t值表。 因此,如果观测到的t值在分布中出现的频率小于0.05, 即可以拒绝原假设,认为两组数据的均值有差异。但相比于t检验,该零假设并不能推广到两样本均服从同样的正态分布。第二种是观测量选择均值差,对均值差的分布进行模拟,同样能够回答零假设的问题,如下图所示
通过对均值比较这一问题的比较,可以发现,虽然置换检验与t检验都能回答同一个问题,但是t检验的前置条件,使得其得出的结论包含了更多的信息,而置换检验则只回答了零假设的问题。不过,这也表示,在我们并不关心总体分布的情况下,置换检验同样能够回答参数检验所回答的问题,并且使用条件的限制更加小。
置换检验的过程所测量的是,依据现有的数据,观测量的出现是不是小概率事件,进而对零假设做出判断。与传统的统计检验相比,两者在结论上差异不大,但传统方法包含了更多的信息,如t检验正态分布,方差齐性等等。所以二者在实际使用中不能完全等同。
自助抽样法
自助抽样法与置换检验很相似,这里简单的介绍一下。二者都依赖随机化方法,但是两者进行随机的方式不同,因而检验结果的实际意义与置换检验也不相同,但理论上两者自助抽样方法应用比较广泛,在统计学范围内,主要也用于比较不同样本是否来自同一个总体,通过计算观测量的置信区间来进行判断。置换检验的重抽样方式是无放回抽取,而自助抽样则是有放回抽取。即根据已有数据生成新的数据集,每一条数据都可能出现0次,1次或者多次。根据重抽样的样本重新计算统计量,然后重复若干次。根据这n次统计量给出估计的置信区间。如果是两组样本的话,则分别对这两组样本进行统计量的置信区间估计,最后再比较两个置信区间是否有重叠。如果没有,则说明并不来自于同个总体,如果有,则说明有可能来源于同一个总体。
蒙特卡罗方法
Monte Carlo 就像Markov 一样,这个名字涉及到很多内容,而在这里主要是指蒙特卡洛方法,也叫蒙特卡洛模拟,名字听上去很厉害,实际上大家在中学就接触过了,就是用撒豆子的方法来估计圆周率。
蒙特卡罗模拟是用模拟出的频率近似替代概率的方法,其依据是大数定理。初识时,有可能会将它与置换检验、自助抽样搞混。但蒙特卡洛方法与前面提到的检验差别很大,不能用来检验零假设。不过在自助抽样和置换检验中都有应用到蒙特卡洛方法。以置换检验为例,将数据洗混重新分配,全部的可能性是总样本量n 的全排列数目 。如果样本量为20,那么全部可能的排列就有2.432902e+18种, 即使借助计算机也需要很多时间。而依据蒙特卡洛方法的思想,实际操作中只进行若干次的排列即可,很多程序的默认值会设定为5000次,即通过5000次的模拟,来代替全排列,再进行置换检验(有点类似样本之于总体,但是指导思想并不相同)这样做大大提高了检验的效率。
置换检验的使用
任何的参数检验都可以进行对应的置换检验。例如FIsher 确切概率法就是两个二分变量关联时使用置换检验的例子
置换检验使用的观测量,既可以是相应参数检验的参数值,也可以是与零假设对应的其他值。比如,两独立样本t检验的参数t,是标准化后的均值差,再使用置换检验时,既可以实用t作为观测量,也可以直接将两样本的均值差作为观测量
使用场景
置换检验属于是非参数检验的一种,因此,在数据不满足正态分布的条件下可以考虑。
相比于其他非参数检验,置换检验还有一个优势,适用于小样本。常用的非参数检验,如秩和检验,通常以牺牲敏感性为代价,对数据进行检验,因此如果样本量相对较小,容易发生二类错误。而置换检验在总样本量为6的情况下,全排列数为720,能够为观测量提供相对其他方法更可靠的检验。
Python 实现
对一个总样本量为10 的数据集进行置换检验,观测的统计量选择t值。
零假设为两组数据 均值无差异
# 以下两组数据进行标准的t检验 import numpy as np from scipy import stats np.random.seed(1) s1 = np.array([40, 57, 45, 55, 58]) s2 = np.array([57, 64, 55, 62, 65]) obt, obp = stats.ttest_ind(s1,s2) # (-3.2807584544083412, 0.006570881890872575)
进行5000次monte carlo 模拟的置换检验
# do a mote carlo simulation since total permutation # for 10 numbers is too large n_reps = 5000 # Monte carlo Simulation times perm_t = np.zeros(n_reps) # Store the simulated t value for i in range(n_reps): permute = np.random.permutation(np.append(s1,s2)) # Permute the data s1_p = permute[:len(s1)] ; s2_p = permute[len(s1):] # regrouping perm_t[i] = stats.ttest_ind(s1_p,s2_p)[0] # perform t test and store t value
可视化模拟的t值分布
import seaborn as sns from matplotlib import pyplot as plt sns.displot(perm_t, kind ='hist') plt.plot(obt,0, 'bo') plt.annotate('Obeserved',ha = 'center', va = 'bottom', xytext = (obt+0.1, 200), xy = (obt, 0), arrowprops = { 'facecolor' : 'red', 'shrink' : 0.05 } ) plt.xlabel("t value")
计算p值,并于t检验的比较
p = np.count_nonzero(perm_t < obt)/len(perm_t) p, obp # (0.0022, 0.006570881890872575)
p值在时是显著的,因此拒绝零假设,认为两组数据均值存在差异
Summary
- Permutation and Bootstrap can be regarded as supplements to traditional statistical methods or computer-based non-parametric tests, while Monte Carlo is a simulation process
- These three methods relied on computing power
- As I said before, Permutation and Bootstrap can be seen as non-parametric tests, so they did not assume the distribution of the samples, i.e. did not rely on parameters. This makes them useful when you can not use parameter tests or you are dealing with very small datasets
- Permutation and Bootstrap both use the regenerated dataset to try to simulate all possible outcomes and then make their inferences
- The most fundamental difference between permutation and bootstrap is that the permutation test permute the original data (that is, random sampling without replacement), and then calculate statistic value; while the bootstrap method is random sampling the original data with replacement (that is, the same The data may appear multiple times, or it may not appear once), then calculate the statistic values
- Based on this difference, the two methods answer different questions. The permutation test answers the significance of the statistic value at a certain test level; while the bootstrap method calculates all possible outcomes of the statistic value and then estimate the confidence interval of the statistic value
- The Monte Carlo method is to generate simulated samples using a computer simulation random process, and then use the simulated samples to calculate the frequency to approximate the substitute probability.
- The Monte Carlo method is based on the law of large numbers
- The Monte Carlo method can be used in permutation tests to avoid calculating full permutations through a specific number of simulations, thereby saving computing power and time
- 置换检验和自助样法可以视作对传统统计方法的一种补充,也可以说是以大量运算为基础的一种非参数检验。而蒙特卡洛方法则是一种模拟。
- 这三种方法都依赖计算机的算力,所以尽管这些方法很早就提出了,但直到计算机快速发展后才得到广泛应用
- 正如前面所说,置换检验与自助样法都可以视作非参数检验,也就是说它们并不假定数据的分布形式,不依赖于参数。因此,在无法确定样本服从正态分布或者样本量过小无法等原因导致无法应用参数检验时,这两种方法变的很有帮助。
- 置换检验与自助样法都通过某种方式来重新生成样本,进而模拟可能出现的结果,进而作出推断
- 置换检验与自助样法最根本的区别在于,置换检验是对数据进行重新排列组合(即无放回随机抽取)后,计算统计量;而重抽样法是对数据进行放回抽取(即同一数据可能出现多次,也可能一次不出现)后,计算统计量
- 根据二者在抽样方法上的不同,二者回答的问题也不相同,置换检验回答的是,统计量在某一检验水平下的显著性;而自助样法计算的是统计量在现有数据下可能出现的值,最终对统计量的置信区间进行估计
- 蒙特卡洛方法是借助计算机模拟随机过程生成模拟的样本,进而利用模拟出的样本计算频率来近似替代概率。
- 蒙特卡洛方法的原理是大数定理
- 蒙特卡洛方法可以用在置换检验,通过特定次数的模拟来避免计算全排列,进而节约算力和时间