如何更改Tukey'中的样本顺序;s在R的测试?
问题: 我想了解如何更改Tukey的R检验计算平均值并分配相应字母的样本顺序。下面是一个非常简单的例子 我研究了虹膜数据,发现不同物种的萼片长度存在差异。以下是方框图: 我进行了方差分析测试,发现差异有统计学意义如何更改Tukey'中的样本顺序;s在R的测试?,r,anova,posthoc,R,Anova,Posthoc,问题: 我想了解如何更改Tukey的R检验计算平均值并分配相应字母的样本顺序。下面是一个非常简单的例子 我研究了虹膜数据,发现不同物种的萼片长度存在差异。以下是方框图: 我进行了方差分析测试,发现差异有统计学意义 > fit <- lm(Sepal.Length ~ Species, data = iris) > summary(aov(fit)) Df Sum Sq Mean Sq F value Pr(>F) Species
> 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
根据组表,HSD.test函数将平均值按降序排序,然后分配字母。因此,“维吉尼亚”的平均值最大,因此在表中名列第一
问题:
有没有办法更改字母的默认排序和分配?
我可以按平均数的升序对样本进行排序,然后分配字母吗。
预期产出如下:
> 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
a setosa 5.006
b versicolor 5.936
c virginica 6.588
可能的解决方案:在package 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
不幸的是,
glht
函数没有显示创建条形图(平均值、标准值、p值)所需的有用数据。当然,我可以用另一个特殊函数单独完成,也可以同时使用HSD.test
和cld
。但我更愿意解决HSD中均值排序的问题。测试函数,只使用这一个。我注意到回答这个问题有点晚了。然而,我遇到了完全相同的问题,我想分享我的解决方案,作为将来的参考。希望有一天它能帮助某人
第一购股权
例如,可以使用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))
库(agricolae)
重新排序首先,感谢这个函数。这就是我要找的。但我认为这是一个错误
res <- vector(mode = "character", length=length(trt)),
res也可以使用multcompLetters()和TukeyHSD()进行求解。您应该更改参数“反转”
库(multcompView)
即使你不能在帖子中添加图片,我相信你也可以在图片共享网站上添加图片链接。谢谢你,eirikdaude。下面是数据的方框图:stats
包中的TukeyHSD()
将使用ordered=TRUE
获得升序平均值,但不分配字母。。。
res <- vector(mode = "character", length=length(trt)),
res <- vector(mode = "character", length=length("trt"))
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)