Я искал библиотечные функции для этого, но я удивлен, что не могу найти одну.
В R довольно много функций статистики, которые выполняют статистический тест, а затем выводят
таблица, содержащая буквы, обозначающие группы значимости, например, LSD.test. Пример того, как можно рассчитать 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 и мультисравнения
вероятно, используют базовую функцию для составления списка писем, но я не смог его найти.
Работая через проблему, я думаю, что это делает трюк, но это довольно уродливо ...
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
}
Это некрасиво, и я еще не сортирую вывод (сортировать легко).
Есть ли библиотечная функция для этого? Или кто-нибудь написал лучший подход для этого?
Спасибо за вашу помощь!