如何在R中的引导循环中包含事后测试

时间:2013-11-30 11:51:31

标签: r statistics posthoc statistics-bootstrap

指向相关问题(How to randomly draw from subsets of data and bootstrap a statistic test in R)的链接提供了一个很好的示例,说明如何从数据框中随机抽取的数据子样本进行统计测试。作为这个问题的扩展,我想知道如何对统计测试的bootstrap迭代进行事后测试,其中找到组之间的显着差异。

假设我有三年采样的植物(Y1,Y2,Y3)。我想知道使用Kruskal-Wallis检验,不同年份植物的中位数长度是否显着不同。如果他们这样做(即p值<0.05),我希望知道使用Wilcoxon秩和检验的哪些年份显示出显着差异。由于我的数据框中有一些植物,在某一年内进行了多次测量,我将在每年内为这些植物随机抽取一行,用于每次统计测试迭代以防止伪复制。该过程将重复10次。

示例数据:

structure(list(Plant = c(1L, 2L, 3L, 4L, 5L, 6L, 6L, 7L, 8L, 
9L, 10L, 10L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 18L, 
19L, 20L, 21L), Year = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L
), Length = c(110L, 99L, 124L, 154L, 112L, 129L, 93L, 132L, 178L, 
206L, 177L, 257L, 173L, 222L, 167L, 192L, 354L, 299L, 265L, 301L, 
341L, 316L, 289L, 267L, 250L)), .Names = c("Plant", "Year", "Length"
), class = "data.frame", row.names = c(NA, -25L))

   Plant Year Length
1      1    1    110
2      2    1     99
3      3    1    124
4      4    1    154
5      5    1    112
6      6    1    129
7      6    1     93    etc….

我的问题是如何在引导重复中执行事后测试(然后在存在显着差异的情况下将每个测试统计,p值和参数值保存在矩阵/数据帧中)。我已经尝试了下面的代码,但我得到的是一个输出矩阵,其长度与迭代次数相同,但不应该是这种情况。

library(plyr)

# function to draw sample for each iteration, perform the KW test and perform post-hoc tests when differences are significant
myrandomph <- function(P,Q){
  ss <- ddply(P, .(Plant), function(x) { y <- x[sample(nrow(x), 1) ,] })
  kw <- kruskal.test(ss$Length, ss$Year)

  if(kw$p.value < 0.05){ 
    w1 <- wilcox.test(ss$Length[ss$Year =="1"], ss$Length[ss$Year =="2"], paired=FALSE)
    return(c(stat = w1$statistic, p = w1$p.value))
    w2 <- wilcox.test(ss$Length[ss$Year =="1"], ss$Length[ss$Year =="3"], paired=FALSE)
    return(c(stat = w2$statistic, p = w2$p.value))
    w3 <- wilcox.test(ss$Length[ss$Year =="2"], ss$Length[ss$Year =="3"], paired=FALSE)
    return(c(stat = w3$statistic, p = w3$p.value))
  }else{  
  return(c(stat = kw$statistic, p = kw$p.value, df = kw$parameter)) }
}

# repeat myrandomph 10 times
test_results <- do.call( rbind, replicate(10, myrandomph(df), simplify=FALSE ) )
colnames(test_results) <- c("Statistic", "P.value", "Parameter")

在Kruskal-Wallis测试很重要的情况下,我想得到一个带有KW测试输出的数据帧行,以及一个用于事后测试的每个测试输出的行(即具有统计值的列) ,一个带有p值的列,以及指定运行了哪个事后测试的行标签:w1,w2或w3)。如果Kruskal-Wallis检验不显着,我希望只返回KW统计数据,p值和参数。任何建议将不胜感激!

0 个答案:

没有答案