美文网首页python学生信
Permutation test(置换检验)以及在R中的应用

Permutation test(置换检验)以及在R中的应用

作者: STACK_ZHAO | 来源:发表于2018-07-17 21:34 被阅读0次

    Permutation test 可以称作是置换检验,Fisher于20世纪30年代提出的一种基于大量计算(computationally intensive),利用样本数据的全(或随机)排列,进行统计推断的方法,因其对总体分布自由,应用较为广泛,特别适用于总体分布未知的小样本资料,以及某些难以用常规方法分析资料的假设检验问题。在具体使用上它和Bootstrap Methods类似,通过对样本进行顺序上的置换,重新计算统计检验量,构造经验分布,然后在此基础上求出P-value进行推断。

    总体上其实就是重新采样增加小样本的整体样本量,然后看其的概率分布来预测假设是否成立。这个基于t-test的,类似于与t-test,但是我觉的在样本量非常少的情况下,用置换检验可以更好的说明问题。这个p-value主要是sobs值在置换经验中均值的分布概率,最终也是利用p-value的值来判断假设是否成立的,看p值的大小,p值小于0.05时,是说明拒绝H0,大于0.05.则是说明服从0假设。


    下面说一下,置换检验在R中应用。

    1.先举R中带的例子。


    排列测试在实验研究中特别相关,我们常常对治疗组之间无差异的拒绝零假设感兴趣。在这些情况下,置换检验很好的地代表了我们的推理过程,因为我们的零假设是两个治疗组在结果上没有差异(即,结果是独立于治疗分配而观察到的)。当我们在测试期间置换结果值时,因此我们看到我们可能具有的所有可能的替代治疗分配排列以及我们观察到的数据的平均差异(相对于我们可以看到的结果是独立的所有差异的治疗任务的位置)。虽然排列测试要求我们看到数据的所有可能排列(可能变得非常大),通过简单地进行大量的重采样,我们可以轻松地进行“近似置换测试”。在期望中,该过程应该近似于排列分布。假设我们的研究中有20个单位那么他的排列的数量是:

    > factorial(20)

    [1] 2.432902e+18

    这个时候,数字完全超出了我们合理计算的数字,但是我们可以从该排列分布中随机抽样以获得近似排列分布,只需运行大量重新采样即可。让我们看一下使用一些组成数据的例子:

    > set.seed(1)

    > n <- 100tr <- rbinom(100, 1, 0.5)

    > y <- 1 + tr + rnorm(n, 0, 3)

    > diff(by(y, tr, mean))   #得到差异的结果 1.341

    > s <- sample(tr, length(tr), FALSE)

    > diff(by(y, s, mean))  #-0.2612

    当我们重新取样而无需替换再次重新计算差异:为-0.2612

    在这里,我们使用置换处理向量s计算差异并找到非常小的差异而不是用tr。如果我们重复这个过程很多次,我们可以建立我们的近似置换分布(即均值差的采样分布)。我们将使用replicatedo重复我们的排列过程。结果将是每个排列(即我们的分布)的差异向量:

    dist <- replicate(2000,diff(by(y, sample(tr, length(tr), FALSE), mean)))

    hist(dist, xlim = c(-3, 3), col = "black", breaks = 100)####绘制直方图

    abline(v = diff(by(y, tr, mean)), col = "blue", lwd = 2)###画差异值的直线位置

    然后我们可以用hist函数看一下这个分布然后画一个直方图来看它的差异

    通过看这个结果,看到我们的0假设是被拒绝的,也就是说治疗组之间是有差异的。

    然后我们可以量化这个结果,也就是生成一个p-value值,通过p-value来更直观的观测结果:

    > sum(dist > diff(by(y, tr, mean)))/2000 # one-tailed test 单边检测## 0.009

    > sum(abs(dist) > abs(diff(by(y, tr, mean))))/2000 # two-tailed test 双边检测##0.018

    单边检验和双边检验的结果是不同的,但是这个结果差异不可能是由于改变治疗与结果无关的变量集中可观测变量相关的。

    2:在R中我们不可能每次都要构造自己的置换检验的分布集,R那我们可以这用coin包中的independence_test函数,但是一个问题是实际问题考虑的可能只是单侧的置换检验的结果:下面是这个函数针对于上述例子的应用。

    library(coin)

    independence_test(y ~ tr, alternative = "greater") # one-tailed

    independence_test(y ~ tr) # two-tailed    # two-tailed,默认就是

    结果显示### ## Asymptotic General Independence Test

    ## ## data: y by tr

    ## Z = 2.315, p-value = 0.01029

    ## alternative hypothesis: greater

    对于这个函数的应用,它的具体的参数及应用如下


    independence_test(asat ~ group, data = asat,

                      ## exact null distribution

                      distribution = "exact",

                      ## one-sided test

                      alternative = "greater",

                      ## apply normal scores to asat$asat

                      ytrafo = function(data)

                          trafo(data, numeric_trafo = normal_trafo),

                      ## indicator matrix of 1st level of asat$group

                      xtrafo = function(data)

                          trafo(data, factor_trafo = function(x)

                              matrix(x == levels(x)[1], ncol = 1)))


    除此之外,还可以用oneway_test做,效果类似。

    但是oneway_test计算的默认是双侧的P值,这时的计算最好是用Deducer包中的perm.t.test函数

    这个函数的可以很简单的设置是单边的还是双边的,简单的例子使用如下

    library(Deducer)

    x<-c(20,34,67,53,12,13,55,89)

    y<-c(23,45,12,56,23,67,22,66)

    perm.t.test(x,y,alternative = "greater",midp = TRUE,B = 1000) #进行1000次置换检验

    下面简单介绍下perm.t.test的 参数

    如下所示

    perm.t.test(x,y,statistic=c("t","mean"),alternative=c("two.sided", "less", "greater"), midp=TRUE, B=10000)

    Arguments

    x  第一个参数向量(数字类型)

    y   第二个参数向量(数字类型)

    statistic 统计用的标准,t或者均值

    alternative 进行统计排列的方式,主要有三种,如上面所示

    midp 确定p-value是否应用

    B    进行随机置换取样的次数

    这就是置换检验在R中的简单介绍

    相关文章

      网友评论

        本文标题:Permutation test(置换检验)以及在R中的应用

        本文链接:https://www.haomeiwen.com/subject/mziceftx.html