我一直在寻找执行此操作的库函数,但令我惊讶的是我找不到一个。
R中有很多stats函数进行统计检验然后输出 一个表格,其中包含表示重要性组的字母,例如LSD.test。An example of how LSD's might be calculated and used to make multicomparison letters, used in a graph
还有其他人。我可以找到的所有示例都倾向于从模型对象开始工作,然后完成工作。但是,我已经有了LSD值和方法-并希望直接使用它们。我一直在寻找所有这些多重比较方法都可以用来完成这一最后步骤的通用功能,但找不到一个通用功能。
所以,这就是我想要做的...鉴于值(LSD)与平均值之间的最小差异是最小的:
lsd <- 1.0
vals <- c(2,3,3.5,4,4.2,6.0)
我想产生类似以下的输出:
2 a
3 b
3.5 bc
4 c
4.2 c
6.0 d
,其中,根据最小有效差值,跟在同一字母后面的值没有显着差异。
理想情况下,最好是可以处理无序的值列表...
vals <- c(6.0, 2, 3.5, 4.0, 4.2, 3)
产生输出:
6.0 d
2 a
3.5 bc
4.0 b
4.2 c
3 c
我一直在考虑大多数LSD.test和multicompare函数 可能正在使用基本函数将字母列表放在一起-但我找不到它。
解决问题,我认为这可以解决问题,但这非常难看...
lsd.letters <- function(vals, lsd) {
#find their order
#record their order
indx <- order(vals)
#sort their order
srt <- vals[indx]
#assign a variable of letters
lts <- letters
#create a character vector
siglets <- rep("", length(vals))#c("a",rep("", length(vals)-1))
#use a single pass through the list of means
#use the first letter a for the lowest value
itlet <- 1
for (i in c(1:(length(vals)))){
crnt <- srt[i]
clet <- lts[itlet]
#is this value within the LSD of any other value in the remaining list
ix <- which(srt[i:length(srt)] < (crnt+lsd))+i-1
for (ix2 in ix){
newletter <- 0
if (length(intersect( unlist(strsplit(siglets[i], "")), unlist(strsplit(siglets[ix2], "")))) == 0){
#If the string for this mean does not already contain a letter in common for the current step mean... assign the letter
#siglets[ix2] <- paste0(siglets[ix2],clet)
newletter <- 1
}
}
if (newletter == 1){
siglets[ix] <- paste0(siglets[ix],clet)
itlet <- itlet + 1
}
}
siglets
}
这很丑陋,我还没有对输出进行排序(排序很容易)。
是否有执行此操作的库函数?还是有人写出更好的方法来做到这一点?
感谢您的帮助!