立即注册找回密码

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

手机动态码快速登录

手机号快速注册登录

搜索

图文播报

查看: 179|回复: 4

[分享] 统计上的“置换检验”有什么用?

[复制链接]
发表于 2025-1-3 12:10 | 显示全部楼层 |阅读模式
回复

使用道具 举报

发表于 2025-1-3 12:11 | 显示全部楼层
置换检验(Permutation Test),也被称为重抽样检验或精确检验,是非参数统计方法的一种。与传统的参数统计检验(如t检验或ANOVA)相比,置换检验不依赖于对数据的特定分布假设,如正态分布。置换检验基于数据的实际观测值,通过对数据进行重排列来模拟可能的结果分布,从而对实验假设进行检验。
置换检验的主要应用如下:
1.非正态数据:当数据不满足正态分布的假设或者样本量太小而无法确定其分布特性时,置换检验是一个很好的替代方法。
2.检验假设:通过对数据进行多次重排列,我们可以模拟在零假设下的数据分布。然后,将实际观测到的统计量与这个模拟的分布进行比较,从而决定是否拒绝零假设。
3.灵活性:置换检验在设计上相对灵活,可以应用于各种各样的统计问题,包括但不限于均值比较、相关性检验和回归分析等。
4.避免Type I 错误的增加:在多重比较的情况下,传统的参数检验可能会增加第一类错误(Type I error,即错误地拒绝了真实的零假设)。使用置换检验可以在某种程度上控制这种错误的发生。
实施置换检验的步骤通常如下:
1.计算实际观测数据的统计量(例如均值差异)。
2.将所有数据进行重排列,并从中随机选择两个或多个样本。
3.基于这些重排列的样本,重新计算统计量。
4.重复上述步骤数千或数万次,从而得到在零假设下统计量的分布。
5.将实际观测到的统计量与模拟得到的统计量分布进行比较,计算p值。
总之,置换检验是一种非常有用的统计方法,特别是当数据不满足传统参数检验所需的假设时。
回复 支持 反对

使用道具 举报

发表于 2025-1-3 12:11 | 显示全部楼层
(本文首发于公众号:R语言画图,标题是:非参检验之置换检验)
01 写在前面

置换检验(Permutation test)是属于非参检验的一种方法,特别适用于总体分布未知的小样本数据。在参数方法中,对于两种实验处理条件,我们一般假设两个总体为正态且方差齐性,然后使用双尾t检验来验证两者是否存在差异。通常零假设为两个总体的均值相等,接着计算t值,将其与理论分布相比较,如果t值落在95%置信区间之外,那么就可以拒绝零假设。
置换检验的思路有些不一样,我们先来看一个例子(来自参考文章1)。小明和小黑一起参加了一个数学补习班,培训前后分别测得的成绩如下表第一行所示,那么要如何判定补习班的成效呢(即成绩是否有了显著性提高)?
前后两次的测试让人直接想到了配对t检验,不过这种方法没法绕开它的前提假设(正态和等方差),而且这里的样本数有点少得可怜(2对),这时候本文的主角出场了。首先,建立置换检验的H0假设,即两次成绩不存在显著差异;接着,计算统计检验量,这里是两个样本的均值之差,即Ms=74-72.5=1.5;最后,在H0的前提下混合4个成绩,并进行排列组合,任取2个作为前测成绩,另2个作为后测成绩,结果如下所示(2~5行)。


从表中我们看到除去第一行的原始数据,其它五行的统计检验量Mn大于1.5的有1个(第二行),那么估计的p值就等于1/5,矫正后(在抽样总体中加入一个远大于Ms的样本)的p值为(1+1)/(5+1)=1/3。很明显,p值大于0.05,因此结论是参加补习班未能显著提高成绩。置换检验就是如此操作,它不需要关于总体的任何假设,而且样本量可以非常小,因此使用起来显得很是得心应手。
配对t检验和置换检验之间的关系,让人想到皮尔逊(Pearson)相关和斯皮尔曼(Spearman)相关之间类似的关系。皮尔逊相关要求数据总体为正态、方差不能为零,且异常值对其影响很大,因此给实际分析带来了一定的局限性(假设不一定都成立,还得事后对其进行验证)。而斯皮尔曼相关是根据原始数据的排序等级进行计算求解的,如此事情就变得简单了,前面提到了几个限制统统都化解了,完美。
嗯,现在我们再来看另外一个例子来加深理解(正常点的,毕竟前面的例子仅仅是用来阐述概念的;来自参考文章2)。假设有个实验是为了验证某种生长素对拟南芥侧根数的增加是否有帮助。实验中的A组是加了生长素,其侧根数量为24 43 58 67 61 44 67 49 59 52 62 50(共12个);B组则不加,其侧根数量为42 43 65 26 33 41 19 54 42 20 17 60 37 42 55 28(共16个)。
我们假设加入的生长素不会促进拟南芥的根系发育,那么A组和B组的数据可以认为是来自同一个总体。这次我们构建的检验统计量为两组侧根数目均值之差,原始数据中A组和B组均值之差为14。跟之前的简单示例相类似,混合后共有28个数据,然后每次随机取出12个作为A组,另外16个作为B组,并记录两组数据的均值之差。
如此反复操作总共进行999次,因为重复次数足够多了,我们能够得到如下的相对稳定的分布图,它代表了抽样的总体情况


上图中除了展示999个数据分布的直方图,还画出了拟合曲线。直观上判断,原始数据两组均值之差14位于右尾,很有可能是在显著临界值附近,实际上大于14的数值有9个,计算p值(9+1)/(999+1)等于0.01,可以拒绝零假设,即实验表明加入生长素不会促进拟南芥的根系发育。
02 使用coin包

对于独立性问题coin包提供了全面的置换检验框架,它可以回答诸如不同组别之间的观测值是否独立(来自不同总体)、两个类别变量是否独立(不同水平之间存在差异)等问题,下图展示了与传统统计检验等价的、相对应的用于置换检验的coin函数(来自参考文章3)。


我们再次使用前面的拟南芥侧根数为分析对象,首先我们用传统的独立样本t检验方法来检验加入生长素是否会促进拟南芥根系的发育,这是一种需要前提假设和后续假设验证的方法,要求两样本对应的总体是正态,最好是方差也相等(R中默认假定方差不相等,并使用Welsh的修正自由度),代码和结果截图如下。
library(coin)
number <- c(24, 43, 58, 67, 61, 44, 67, 49, 59, 52, 62, 50, 42, 43, 65, 26, 33, 41, 19, 54, 42, 20, 17, 60, 37, 42, 55, 28)
# 将A重复12次、B重复16次
# coin包要求类别变量必须以因子形式编码
condition <- factor(c(rep("A",12),rep("B",16)))
mydata <- data.frame(condition, number)
# t.test(y~x, data),y为数值型,x为二分变量
# 假定方差相等,并使用合并方差估计
t.test(number~condition, daya=mydata, var.equal=TRUE)

结果显示差异是显著的(见红框中的p值)。接下来我们使用相对应的coin中的置换检验函数,此时就可以完全抛开那些前提假设了,就此毫无顾忌地上代码、看结果。
# oneway_test(y ~ A),A是分类因子,y是数值变量
# exact指出用精确的方式计算分布,即依据所有可能的排列组合,仅适用两样本情况
# 28选12,排列组合数高达三千多万,还好现在的计算资源比较廉价
oneway_test(number~condition, data=mydata, distribution="exact")

置换检验的p值与传统方法的p值差不太多,结果都很显著。以上从28个数据中取12个加16个的组合竟然已高达三千多万,实在有点让人吃惊,要是数据量再大些,所有排列组合的可能性将继续呈指数级增长,结果就不好控制而且也没必要。好在distribution参数还提供了其它的选项,如使用蒙特卡洛(MC)采样方法对抽样分布进行近似估计,设置参数为approximate(nresample=9999)即可,每次对混合的28个数据随机分成两组(一组12个、另一组16个),如此反复操作9999次,最后把实验数据放到这个近似分布中进行检验,结果图形如下。


这里没有设定随机数种子,例如set.seed(2089),因此每次运行的结果会有些许的差异。另外,传统的单因素方差分析对应的coin函数也是同一个,一样的使用方法,只是结果不是显示Two-Sample而是K-Sample(用于高维采样),检验统计量由Z值变为卡方值。
03 使用lmPerm包

lmPerm包中提供的函数专门用来做回归分析和方差分析的置换检验,例如lmp()和aovp()函数分别对应传统的lm()和aov()函数。置换检验的函数名只是在原先名称之后加了个p,而且额外增加的参数主要是perm,选项值Exact跟coin包中的定义一模一样,根据所有可能的排列组合进行精确检验,不过默认当观测数大于10时自动会转成Prob选项;Prob选项随机不断抽样,直到满足特定的条件,如估计p值的估计标准误小于0.1*p,同时最大迭代次数也受maxIter参数限制;如果为空(“”)则生成F检验概率。
我们以一元线性回归模型(Yi=β0+β1Xi+εi)来举例说明置换操作是如何进行的。检验的对象是β1,零假设H0为β1=0。具体操作步骤如下(参考文章4):
第一步,使用最小二乘法对参数β0和β1进行估计,得到的预测值和残差,然后构建β1的F型统计量T=(n-2)SSR/SSE,这里SSR指回归平方和、SSE指残差平方和;
第二步,对残差集合进行随机置换得到新的排序,并带入方程根据原有Xi得到新的Yi;
第三步,基于Xi和新的Yi重新拟合回归方程,得到新的β0和新的β1,并计算新的T值;
第四步,重复步骤2和3,直到满足迭代停止条件或达到限制次数,得到T值的集合;
第五步,计算近似p值,即T值集合中大于原始T值的数目除以总数。
现在我们来看一个具体例子。本公号的第一篇推文是回归诊断之正态性——画QQ图,在其中使用了R基础安装中的数据集women,包含15位年龄在30~39岁之间女性的身高和体重信息,现在我们使用lmp()函数来代替lm()函数进行拟合分析,结果如下图。


如果使用lm()函数来分析,其结果是类似的,只是这里的Iter列额外显示了迭代次数。
参考文章

回复 支持 反对

使用道具 举报

发表于 2025-1-3 12:12 | 显示全部楼层
Permutation Test 置换检验
显著性检验通常可以告诉我们一个观测值是否是有效的,例如检测两组样本均值差异的假设检验可以告诉我们这两组样本的均值是否相等(或者那个均值更大)。我们在实验中经常会因为各种问题(时间、经费、人力、物力)得到一些小样本结果,如果我们想知道这些小样本结果的总体是什么样子的,就需要用到置换检验
Permutation test 置换检验是Fisher于20世纪30年代提出的一种基于大量计算(computationally intensive),利用样本数据的全(或随机)排列,进行统计推断的方法,因其对总体分布自由,应用较为广泛,特别适用于总体分布未知的小样本资料,以及某些难以用常规方法分析资料的假设检验问题。在具体使用上它和Bootstrap Methods类似,通过对样本进行顺序上的置换,重新计算统计检验量,构造经验分布,然后在此基础上求出P-value进行推断。
下面通过一个简单例子来介绍Permutation test的思想。
假设我们设计了一个实验来验证加入某种生长素后拟南芥的侧根数量会明显增加。A组是加入某种生长素后,拟南芥的侧根数量;B是不加生长素时,拟南芥的侧根数量(均为假定值)。
A组侧根数量(共12个数据):24 43 58 67 61 44 67 49 59 52 62 50
B组侧根数量(共16个数据):42 43 65 26 33 41 19 54 42 20 17 60 37 42 55 28
我们来用假设检验的方法来判断生长素是否起作用。我们的零假设为:加入的生长素不会促进拟南芥的根系发育。在这个检验中,若零假设成立,那么A组数据的分布和B组数据的分布是一样的,也就是服从同个分布。
接下来构造检验统计量——A组侧根数目的均值同B组侧根数目的均值之差。
statistic:= mean(Xa)-mean(Xb)
对于观测值有 Sobs:=mean(Xa)-mean(Xb)=(24+43+58+67+61+44+67+49+59+52+62+50)/12-(42+43+65+26+33+41+19+54+42+20+17+60+37+42+55+28)/16=14
我们可以通过Sobs在置换分布(permutation distribution)中的位置来得到它的P-value。
Permutation test的具体步骤是:
1.将A、B两组数据合并到一个集合中,从中挑选出12个作为A组的数据(X'a),剩下的作为B组的数据(X'b)。
Gourp:=24 43 58 67 61 44 67 49 59 52 62 50 42 43 65 26 33 41 19 54 42 20 17 60 37 42 55 28
挑选出 X'a:=43 17 44 62 60 26 28 61 50 43 33 19
X'b:=55 41 42 65 59 24 54 52 42 49 37 67 67 20 42 58
2.计算并记录第一步中A组同B组的均值之差。Sper:=mean(X'a)-mean(X'b)= -7.875
3.对前两步重复999次(重复次数越多,得到的背景分布越”稳定“)
这样我们得到有999个置换排列求得的999个Sper结果,这999个Sper结果能代表拟南芥小样本实验的抽样总体情况。




如上图所示,我们的观测值 Sobs=14 在抽样总体右尾附近,说明在零假设条件下这个数值是很少出现的。在permutation得到的抽样总体中大于14的数值有9个,所以估计的P-value是9/999=0.01
最后还可以进一步精确P-value结果(做一个抽样总体校正),在抽样总体中加入一个远大于观测值 Sobs=14的样本,最终的P-value=(9+1)/(999+1)=0.01。(为什么这样做是一个校正呢?自己思考:))结果表明我们的原假设不成立,加入生长素起到了促使拟南芥的根系发育的作用。
参考资料:
1. http://bcs.whfreeman.com/ips5e/content/cat_080/pdf/moore14.pdf
2. http://jpkc.njmu.edu.cn/course/tongjixue/file/jxzy/tjjz02.htm
3. http://www.r-bloggers.com/lang/chinese/541
附录:R语言求解上例的代码




a<-c(24,43,58,67,61,44,67,49,59,52,62,50,42,43,65,26,33,41,19,54,42,20,17,60,37,42,55,28)
group<-factor(c(rep("A",12),rep("B",16)))
data<-data.frame(group,a)
find.mean<-function(x){
mean(x[group=="A",2])-mean(x[group=="B",2])
}
results<-replicate(999,find.mean(data.frame(group,sample(data[,2]))))
p.value<-length(results[results>mean(data[group=="A",2])-mean(data[group=="B",2])])/1000
hist(results,breaks=20,prob=TRUE)
lines(density(results))
网上搬的,侵删:
Permutation Test 置换检验(转) - CSDN博客
回复 支持 反对

使用道具 举报

发表于 2025-1-3 12:13 | 显示全部楼层
显著性检验通常可以告诉我们一个观测值是否是有效的,例如检测两组样本均值差异的假设检验可以告诉我们这两组样本的均值是否相等(或者那个均值更大)。我们在实验中经常会因为各种问题(时间、经费、人力、物力)得到一些小样本结果,如果我们想知道这些小样本结果的总体是什么样子的,就需要用到置换检验。
Permutation test 置换检验是Fisher于20世纪30年代提出的一种基于大量计算(computationally intensive),利用样本数据的全(或随机)排列,进行统计推断的方法,因其对总体分布自由,应用较为广泛,特别适用于总体分布未知的小样本资料,以及某些难以用常规方法分析资料的假设检验问题。在具体使用上它和Bootstrap Methods类似,通过对样本进行顺序上的置换,重新计算统计检验量,构造经验分布,然后在此基础上求出P-value进行推断。
Permutation Test 置换检验
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册 微信登录 手机动态码快速登录

本版积分规则

关闭

官方推荐 上一条 /3 下一条

快速回复 返回列表 客服中心 搜索 官方QQ群 洽谈合作
快速回复返回顶部 返回列表