Hi,大家好呀!我是Tululu。
作为医学生的我,对于自己辛辛苦苦拿到的数据,最怕的一点就是它们是非正态分布的。因为一旦它们非正态,很多统计方法就不适用了。
我想很多同学都有跟我类似的经验。对于这种非正态的数据,统计课老师告诉我们可以采用一些非参数检验的方法,比如秩和检验等等。这些非参数检验虽然能解决部分问题,但是当样本量过小、存在离群点、基于理论分布设计合适的统计检验过于复杂且数学上难以处理时,传统的非参数检验也显得束手无策了。
大家不要觉得心灰意冷,虽然存在各种限制,但是所谓“道高一尺魔高一丈”,我们还是有方法处理这种情形的。这就是今天要给大家介绍的置换检验(permutation test)。
置换检验在现在的很多医学论文中屡见不鲜了,所以算不上什么新方法,但是我想很多同学也跟我一样,对它还是比较陌生的,毕竟国内各种医学统计学书上对它并无半点描述啊。
下面我就给大家介绍一下这个方法的基本原理和实现方法。
置换检验是个啥
以原假设为起点,假定二组没有差别,由此将二组样本合并,从中以无放回方式进行抽样,分别归入两个组再计算统计量,反复进行由此得到置换分布,在此基础上进行推断。
这就是置换检验的基本原理。
就这简简单单一句话,大家可能听的云里雾里的。下面我会用几个示例来继续解释。
在R语言中,可以利用coin包很轻松的实现不同情形下的置换检验。
具体函数和其功能如下图所示(其中,y 和 x 是数值变量,A 和 B 是分类因子,C 是类别型区组变量,D 和 E 是有序因子,y1 和 y2 是相匹配的数值变量。类别变量和有序变量均应转化为因子和有序因子。)
独立两样本检验
例如某医院欲研究 A、B 两种降血脂药物对家兔血清肾素血管紧张素转化酶(ACE)的影响,将家兔随机分为2组,均喂以高脂饮食,分别给予不同的降血脂药物。
一定时间后测定家兔血清 ACE 浓度(u/ml),A 组,B 组,问两组家兔血清 ACE 浓度是否相同?
数据如下所示:
下面我们对这个数据进行最简单的两样本置换检验:
在oneway_test()函数中,需要解释一下的是distribution参数,该参数用于定义数据的分布,对于零分布(null distribution),可以使用“none”定义,对于精确的分布,可以使用“exact”定义,此处我们使用的是另外一种分布,即利用approximate函数进行蒙托卡罗重抽样。最终得到的结果中显示p值为0.06,因此我们不能拒绝原假设。
我们再来看一个例子。
趋势检验
在vcd包中有一个关节炎数据集,Arthritis。包含了关节炎的治疗情况和改善情况,数据大致如下:
可以看出,有部分病人是经过了治疗的,另外部分的病人是服用的安慰剂。在Improved变量中,有三个分类,none,some和marked,分别表示没有好转,部分好转,和明显好转。
下面我们需要考查一下治疗情况和患者的关节炎改善情况是否存在线性趋势?同样使用置换检验。
这里我们使用的是lbl_test()函数。结果表明,治疗情况与患者好转情况是存在显著的线性相关趋势的,即明显好转的患者更多的是接受了治疗。
对于其他检验,大家可以对照前面的那张表进行函数选择。这么看来,置换检验是不是很简单呢。
联系客服