置换检验(Permutation test)

置换检验

置换检验,是Fisher提出的一种基于大量计算(computationally intensive),利用样本数据的随机排列(置换检验的核心思想,故名Permutation test),进行统计推断的方法。因其对总体分布自由,特别适合用于总体分布未知的小样本数据,以及一些常规方法难以使用的假设检验情况。

原理

在零假设成立情况下,根据研究目的构造一个检验统计量(如均值,方差等),对样本进行随机抽样并根据排列组合进行随机分组,每次分组均可以计算得到一个检验统计量,由于排列组合次数较多,因此可以得到许多检验统计量,模拟检验统计量的分布,然后求出该分布中出现观察样本的均值(原始均值)及更极端样本的概率p,通过和显著性α比较,做出统计推断。

步骤

  1. 提出原假设,如A组(m个元素)和B组(n个元素)没有差异;
  2. 计算统计量,如两组的均值之差μ0=μA−mu_B$;
  3. 将所有样本随机排序并根据A和B组的数目随机分组,计算统计量μ;
  4. 重复步骤3,直到所有排列组合计算统计量完毕,统计量个数为mu1 μm个;
  5. 最后将步骤4得到的所有统计量按照从小到大排列后构成分布,观察步骤2计算得到的观察样本μ0落在该分布的位置(如95%的置信区间:一倍方差内),并计算小于该观察值的所有统计量的数目占所有统计量数目的比例p,若p落在置信区间内(双侧检验)则接收原假设,否则拒绝;
  6. 如果第3步骤是将所有可能性都计算了的话,则是精确检验;如果只取了计算了部分组合,则是近似结果,这时一般用蒙特卡罗模拟(Monte Carlo simulation)的方法进行置换检验;
  7. 置换检验和参数检验都计算了统计量,但是前者是跟置换观测数据后获得的经验分布进行比较,后者则是跟理论分布进行比较。

优点

  1. 不需要知道基础数据的分布;
  2. 能处理多种类型数据;
  3. 方法简单且相对容易解释;
  4. 适合不满足传统分析方法的条件的数据,如小样本数据等。

实例

  • permutation test 原理实现过程
  1. 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)
  2. group <- factor(c(rep("A",12), rep("B",16)))
  3. data <- data.frame(group, a)
  4. mu_sob <- mean(data[group=="A",2]) - mean(data[group=="B",2])
  5.  
  6.  
  7. find.mean <- function(x){
  8. mean(x[group=="A",2]) - mean(x[group=="B",2])
  9. }
  10.  
  11. results <- data.frame(value=replicate(999, find.mean(data.frame(group,sample(data[,2])))))
  12. p.value <- length(results[results > mu_sob]) / 1000
  13.  
  14. confidence_interval <- function(vector, interval) {
  15. vec_sd <- sd(vector)
  16. n <- length(vector)
  17. vec_mean <- mean(vector)
  18. error <- qt((interval 1)/2, df = n - 1) * vec_sd / sqrt(n)
  19. result <- c("lower" = vec_mean - error, "upper" = vec_mean error)
  20. return(result)
  21. }
  22. ci_95 <- confidence_interval(results$value, 0.95)
  23.  
  24.  
  25. ggplot(results, aes(x=value))
  26. geom_histogram(aes(y=..density..), colour="black", fill="white")
  27. geom_density(alpha=.8, color="red", size=.8)
  28. geom_vline(xintercept=mu_sob, linetype="dashed", color="blue", size=1)
  29. scale_x_continuous(breaks = c(-15,-10,-5,0,5,10,14,15),
  30. labels = c(-15,-10,-5,0,5,10,14,15),
  31. expand = c(0, 0))
  32. annotate("text", x=14, y=0.04, label="Observed Mean Value line")
  33. labs(x="Mean_A minus Mean_B", y = "Density of difference in Mean")
  34. theme_classic()

置换检验(Permutation test)

  • 使用coin包实现上述分析过程
    1. Input = ("
    2. Individual Hand Length
    3. A Left 17.5
    4. B Left 18.4
    5. C Left 16.2
    6. D Left 14.5
    7. E Left 13.5
    8. F Left 18.9
    9. G Left 19.5
    10. H Left 21.1
    11. I Left 17.8
    12. J Left 16.8
    13. K Left 18.4
    14. L Left 17.3
    15. M Left 18.9
    16. N Left 16.4
    17. O Left 17.5
    18. P Left 15.0
    19. A Right 17.6
    20. B Right 18.5
    21. C Right 15.9
    22. D Right 14.9
    23. E Right 13.7
    24. F Right 18.9
    25. G Right 19.5
    26. H Right 21.5
    27. I Right 18.5
    28. J Right 17.1
    29. K Right 18.9
    30. L Right 17.5
    31. M Right 19.5
    32. N Right 16.5
    33. O Right 17.4
    34. P Right 15.6
    35. ")
    36.  
    37. Data = read.table(textConnection(Input),header=TRUE)
    38.  
    39. library(coin)
    40. # Permutation test of independence
    41. independence_test(Length ~ Hand, data = Data)
    42.  
    43. #Asymptotic General Independence Test
    44. #Z = -0.34768, p-value = 0.7281
    45.  
    46.  
    47. # Permutation test of symmetry 适用repeated data
    48. symmetry_test(Length ~ Hand | Individual, data = Data)
    49.  
    50. #Asymptotic General Symmetry Test
    51. #Z = -2.6348, p-value = 0.008418

引用

  1. Permutation test
  2. 置换检验

发表评论

匿名网友

拖动滑块以完成验证
加载失败