Получить существенно разные группы из теста Данна в R
В R я сравниваю группы с dunn.test. Вот некоторые примеры данных, где "тип" - это переменная группировки:
my_table <- data.frame ("type" = c (rep ("low", 5), rep ("mid", 5), rep ("high", 5)),
"var_A" = rnorm (15),
"var_B" = c (rnorm (5), rnorm (5, 4, 0.1), rnorm (5, 12, 2))
)
Я хочу сравнить переменные var_A
а также var_B
среди трех групп с dunn.test ()
, который выдает следующие результаты:
library (dunn.test)
dunn.test (my_table$var_A, my_table$type)
> Kruskal-Wallis rank sum test
>
> data: x and group
> Kruskal-Wallis chi-squared = 6.08, df = 2, p-value = 0.05
>
>
> Comparison of x by group
> (No adjustment)
> Col Mean-|
> Row Mean | high low
> ---------+----------------------
> low | 0.919238
> | 0.1790
> |
> mid | 0.989949 0.070710
> | 0.1611 0.4718
>
> alpha = 0.05
> Reject Ho if p <= alpha/2
а также
dunn.test (my_table$var_B, my_table$type)
> Kruskal-Wallis rank sum test
>
> data: x and group
> Kruskal-Wallis chi-squared = 12.5, df = 2, p-value = 0
>
>
> Comparison of x by group
> (No adjustment)
> Col Mean-|
> Row Mean | high low
> ---------+----------------------
> low | 3.535533
> | 0.0002*
> |
> mid | 1.767766 -1.767766
> | 0.0385 0.0385
>
> alpha = 0.05
> Reject Ho if p <= alpha/2
Я понимаю, что для var_A я не вижу каких-либо существенных различий между тремя группами. Для var_B группы "низкий" и "высокий" существенно различаются. При представлении результатов я мог бы выбрать таблицу как
library (tidyverse)
data.frame ("low" = my_table %>%
filter (type == "low") %>%
select (c ("var_A", "var_B")) %>%
sapply (mean) %>%
round (digits = 2),
"mid" = my_table %>%
filter (type == "mid") %>%
select (c ("var_A", "var_B")) %>%
sapply (mean) %>%
round (digits = 2),
"high" = my_table %>%
filter (type == "high") %>%
select (c ("var_A", "var_B")) %>%
sapply (mean) %>%
round (digits = 2 )
)
> low mid high
> var_A 0.14 -0.10 0.74
> var_B -0.41 3.97 11.44
Чего я хотел бы добиться, так это добавить символы для обозначения результатов dunn.test
, Это может выглядеть примерно так
> low mid high
> var_A 0.14 a -0.10 a 0.74 a
> var_B -0.41 a 3.97 ab 11.44 b
Итак, мой длинный, но короткий вопрос: как я могу сказать dunn.test
функция для вывода группирующих символов (например, "a", "ab" или "b"). Или есть обходной путь для получения желаемых персонажей?
0 ответов
Может быть, функция Крускала () в agricolae пакете может получить то, что вы ищете. Среди выходных данных есть "группы", которые содержат буквы, соответствующие группе. Детали пакета говорят, что post-hoc проводится с использованием ЛСД Фишера, а не теста Данна. Но может включать аргумент p.adj для корректировки множественных сравнений
library(tidyverse)
library(agricolae)
library(reshape2)
my_table <- data.frame ("type" = c (rep ("low", 5), rep ("mid", 5), rep ("high", 5)),
"var_A" = rnorm (15),
"var_B" = c (rnorm (5), rnorm (5, 4, 0.1), rnorm (5, 12, 2))
)
# melt in order to use lapply
my_MeltedTable = melt(my_table, id.vars='type')
# apply kruskal(value,type) across two levels of variable (var_A and var_B)
results = lapply(split(my_MeltedTable[,c("type", "value")], my_MeltedTable$variable),
function(x) kruskal(x$value, x$type, p.adj="bon"))
# the grouping information you'd like will be found in
results$var_A$group
results$var_B$group
Возможно, это способ вытащить то, что вам нужно, из lapply(), но я не знаю, как это сделать, вот как я получил требуемую таблицу:
# create empty df for results
resTable <- data.frame(matrix(ncol = 6, nrow = 2))
# results$means contains means of variable per group
# assign col names from row names in results
colnames(resTable) = row.names(results$var_A$means)
# pull out means for var_A & round to 2 digits & transpose as are rows
resTable[1,1:3] = round(digits = 2, t(results$var_A$means[,1]))
# pull out means for var_B & round to 2 digits & transpose
resTable[2,1:3] = round(digits = 2, t(results$var_B$means[,1]))
# results$group contains letters denoting of variable per group
resTable[1,4:6] = t(results$var_A$group[,2]) # pull out stat grouping for varA
resTable[2,4:6] = t(results$var_B$group[,2]) # pull out stat grouping for varB
resTable = resTable[,c(2,5,3,6,1,4)] # re-order cols
rownames(resTable) = c("var_A", "var_B") # name rows
colnames(resTable) = c("low", " ","med", " ", "high","") # name cols
И после всей этой многословности!
low med high
var_A 0.12 a 0.40 a -0.76 a
var_B -0.45 b 3.99 c 11.46 a