在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 :(得分:1)
也许agricolae包中的kruskal()函数可以满足您的需求。在输出中是“组”,其中包含与组相对应的字母。软件包详细信息表明,事后验证是使用Fishers LSD完成的,而不是Dunn测试。但可以包含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