首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从R中的dunn检验中得到明显不同的组

从R中的dunn检验中得到明显不同的组
EN

Stack Overflow用户
提问于 2019-08-23 00:33:56
回答 1查看 698关注 0票数 1

在R中,我将组与dunn.test进行比较。以下是一些示例数据,其中"type“是分组变量:

代码语言:javascript
运行
复制
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_Avar_B,结果如下:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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来说,“低”和“高”组有很大的不同。在显示结果时,我可以选择下面这样的表

代码语言:javascript
运行
复制
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的结果。这可能看起来像这样

代码语言:javascript
运行
复制
>               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")。或者,是否有解决方法来获得所需的字符?

EN

回答 1

Stack Overflow用户

发布于 2019-12-06 19:57:35

也许agricolae包中的kruskal()函数可能会得到您想要的结果。在输出中有‘group’,它包含与group对应的字母。包细节显示post-hoc是使用Fishers LSD完成的,而不是Dunn test。但可以包含用于多个比较调整的p.adj参数

代码语言:javascript
运行
复制
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()中提取所需内容的一种方法,但我不知道如何获取所需的表:

代码语言:javascript
运行
复制
# 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

在所有的长篇大论之后!

代码语言:javascript
运行
复制
        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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57613685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档