gpt4 book ai didi

r - 如何更改 R 中 Tukey 测试中的样本顺序?

转载 作者:行者123 更新时间:2023-12-02 13:21:51 28 4
gpt4 key购买 nike

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

我研究了iris数据,发现不同物种的萼片长度存在差异。这是箱线图:

enter image description here

我进行了方差分析测试,发现差异具有统计显着性。

> 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 函数中的排序来解决问题,并且只使用这个。

最佳答案

我发现现在回答这个问题有点晚了。然而,我遇到了完全相同的问题,并希望分享我的解决方案作为将来的引用。希望有一天它能帮助某人。

第一个选项

例如,可以将 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))

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

关于r - 如何更改 R 中 Tukey 测试中的样本顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29854865/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com