【问题标题】:How to change an order of samples in Tukey's test in R?如何在 R 中更改 Tukey 测试中的样本顺序?
【发布时间】:2015-04-24 18:25:39
【问题描述】:

问题: 我想了解如何更改 Tukey 在 R 中的测试计算平均值并分配相应字母的样本顺序。非常简单的例子如下。

我玩过iris数据,发现不同物种之间的Sepal.Length存在差异。这是箱线图:

我进行了 ANOVA 测试,发现差异具有统计学意义。

> fit <- lm(Sepal.Length ~ Species, data = iris)
> summary(aov(fit))

             Df Sum Sq Mean Sq F value Pr(>F)    
Species       2  63.21  31.606   119.3 <2e-16 ***
Residuals   147  38.96   0.265                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

然后我进行了 Tukey 的测试,得到了以下结果:

> library(agricolae)
> HSD.test(fit, "Species", group=T, console=T)

Study: fit ~ "Species"

HSD Test for Sepal.Length 

Mean Square Error:  0.2650082 

Species,  means

           Sepal.Length       std  r Min Max
setosa            5.006 0.3524897 50 4.3 5.8
versicolor        5.936 0.5161711 50 4.9 7.0
virginica         6.588 0.6358796 50 4.9 7.9

alpha: 0.05 ; Df Error: 147 
Critical Value of Studentized Range: 3.348424 

Honestly Significant Difference: 0.2437727 

Means with the same letter are not significantly different.

Groups, Treatments and means
a    virginica       6.588 
b    versicolor      5.936 
c    setosa          5.006

HSD.test 函数根据组表将意思按降序排序,然后分配字母。因此,“virginica”具有最大的平均值,因此它是表中的第一个。

问题: 有什么方法可以更改字母的默认排序和分配? 我可以按均值升序对样本进行排序,然后分配字母吗? 预期输出如下:

a setosa     5.006
b versicolor 5.936
c virginica  6.588

可能的解决方案:在 multcomp 包中,有两个函数可以协同工作:

1 - glht 做 Tukey 的测试

> an <- aov(fit)
> library(multcomp)
> glht(an, linfct = mcp(Species = "Tukey"))

         General Linear Hypotheses

    Multiple Comparisons of Means: Tukey Contrasts


    Linear Hypotheses:
                                Estimate
    versicolor - setosa == 0       0.930
    virginica - setosa == 0        1.582
    virginica - versicolor == 0    0.652

2 - cld 可以根据iris$Species 因子的级别为我提供分配给Species 的字母

> cld(glht(an, linfct = mcp(Species = "Tukey")))
    setosa versicolor  virginica 
       "a"        "b"        "c" 

不幸的是,glht 函数没有显示另一个对创建条形图有用和需要的数据(均值、标准、p 值)。当然,我可以单独使用其他特殊功能,或者同时使用HSD.testcld。但我更愿意解决HSD.test 函数中的方法排序问题,并且只使用这个。

【问题讨论】:

  • 即使您无法在帖子中添加图片,我相信您也可以在图片分享网站上添加图片链接。
  • 谢谢你,eirikdaude。这是数据的箱线图:i.stack.imgur.com/Zb44o.jpg
  • stats 包中的 TukeyHSD() 将让您使用 ordered=TRUE 升序排列,但不分配字母...

标签: r anova posthoc


【解决方案1】:

我注意到回答这个问题有点晚了。但是,我遇到了完全相同的问题,并希望分享我的解决方案作为将来的参考。希望有一天它对某人有所帮助。

第一个选项

例如,可以将multcompLetters()TukeyHSD() 的结果一起使用。但是,这不允许对结果进行任意排序,也不是那么容易使用。

第二个选项

因为我需要一个任意顺序,所以我编写了自己的函数,它接受从HSD.test 返回的字母向量,并以一种结果很好的方式交换字母。意思是字母表中最先出现的字母。

library(agricolae)
reorder<-function(inV){
  collapsed <- paste(inV,sep="",collapse = "")
  u <- unique(strsplit(collapsed,"")[[1]])
  if(length(u)<2){
    return(inV)
  }
  u <- u[order(u)]
  m <- matrix(nrow=NROW(inV),ncol=length(u))
  m[]<-F
  for(i in 1:length(inV)){
    s <- strsplit(inV[i],"")[[1]]
    index <- match(s,u)
    m[i,index] <- T
  }
  for(i in 1:(length(u)-1)){
    firstColT <- match(T,m[,i])[1] #first row with true in current column
    firstT <- match(T,rowSums(m[,i:length(u)] > 0))[1] #first row with true in rest
    if(firstT < firstColT){
      colT <- match(T,m[firstT,i:length(u)])[1]
      colT <- colT + i - 1 #correct index for leftout columns in match
      tmp <- m[,colT]
      m[,colT] <- m[,i]
      m[,i] <- tmp
    }
  }
  res <- vector(mode = "character", length=length(trt))
  for(i in 1:length(inV)){
    l <- u[m[i,]]
    res[i] <- paste(l,sep="",collapse = "")
  }
  return(res)
}

fit <- lm(Sepal.Length ~ Species, data = iris)
a <- HSD.test(fit, "Species", group=T, console=F)$groups
a <- a[rev(rownames(a)),] #order the result the way you want
a$M <- reorder(as.character(a$M))

对于这个例子来说,这有点矫枉过正,但它也应该适用于更复杂的情况。

【讨论】:

    【解决方案2】:

    也可以使用 multcompLetters() 和 TukeyHSD() 来解决。您应该更改参数“reversed”

    library(multcompView)
    
    fit <- aov(Sepal.Length ~ Species, data = iris)
    
    tukey<-TukeyHSD(fit, ordered = T)
    tukey_1<-multcompLetters2(Sepal.Length ~ Species,
                              tukey$Species[,"p adj"],
                              iris,reversed = T)
    tukey_2<-multcompLetters2(Sepal.Length ~ Species,
                              tukey$Species[,"p adj"],
                              iris,reversed = F)
    tukey_1
    tukey_2
    tapply(iris$Sepal.Length, iris$Species, mean)
    

    【讨论】:

      【解决方案3】:

      首先,感谢您提供的功能。这就是我要找的。但我认为有一个错误

      res <- vector(mode = "character", length=length(trt)), 
      

      应该是

      res <- vector(mode = "character", length=length("trt")) 
      

      【讨论】:

        猜你喜欢
        • 2020-07-02
        • 1970-01-01
        • 2017-04-01
        • 2020-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多