在R中,我将组与dunn.test进行比较。以下是一些示例数据,其中"type“是分组变量:
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))
)
我想用dunn.test ()
比较三组中的变量var_A
和var_B
,结果如下:
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")。或者,是否有解决方法来获得所需的字符?
发布于 2019-12-06 19:57:35
也许agricolae包中的kruskal()函数可能会得到您想要的结果。在输出中有‘group’,它包含与group对应的字母。包细节显示post-hoc是使用Fishers LSD完成的,而不是Dunn test。但可以包含用于多个比较调整的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
https://stackoverflow.com/questions/57613685
复制相似问题