2

在 R 中,我执行邓恩检验。我使用的函数没有按输入变量的统计显着差异对输入变量进行分组的选项。然而,这是我真正感兴趣的,所以我尝试编写自己的函数。不幸的是,我无法绕过它。也许有人可以提供帮助。

airquality以 R 自带的数据集为例。我需要的结果可能看起来像这样:

> library (tidyverse)
> ozone_summary <- airquality %>% group_by(Month) %>% dplyr::summarize(Mean = mean(Ozone, na.rm=TRUE))

# A tibble: 5 x 2
  Month  Mean
  <int> <dbl>
1     5  23.6
2     6  29.4
3     7  59.1
4     8  60.0
5     9  31.4

当我运行时dunn.test,我得到以下信息:

> dunn.test::dunn.test (airquality$Ozone, airquality$Month, method = "bh", altp = T)


Kruskal-Wallis rank sum test

data: x and group
Kruskal-Wallis chi-squared = 29.2666, df = 4, p-value = 0


                           Comparison of x by group                            
                             (Benjamini-Hochberg)                              
Col Mean-|
Row Mean |          5          6          7          8
---------+--------------------------------------------
       6 |  -0.925158
         |     0.4436
         |
       7 |  -4.419470  -2.244208
         |    0.0001*    0.0496*
         |
       8 |  -4.132813  -2.038635   0.286657
         |    0.0002*     0.0691     0.8604
         |
       9 |  -1.321202   0.002538   3.217199   2.922827
         |     0.2663     0.9980    0.0043*    0.0087*

alpha = 0.05
Reject Ho if p <= alpha

从这个结果,我推断五月不同于七月和八月,六月不同于七月(但不是八月)等等。因此,我想将显着不同的组附加到我的结果表中:

# A tibble: 5 x 3
  Month  Mean Group
  <int> <dbl> <chr>
1     5  23.6 a    
2     6  29.4 ac   
3     7  59.1 b    
4     8  60.0 bc   
5     9  31.4 a  

虽然我是手工完成的,但我想必须可以自动化这个过程。但是,我没有找到一个好的起点。我创建了一个包含所有比较的数据框:

> ozone_differences <- dunn.test::dunn.test (airquality$Ozone, airquality$Month, method = "bh", altp = T)
> ozone_differences <- data.frame ("P" = ozone_differences$altP.adjusted, "Compare" = ozone_differences$comparisons)

              P Compare
1  4.436043e-01   5 - 6
2  9.894296e-05   5 - 7
3  4.963804e-02   6 - 7
4  1.791748e-04   5 - 8
5  6.914403e-02   6 - 8
6  8.604164e-01   7 - 8
7  2.663342e-01   5 - 9
8  9.979745e-01   6 - 9
9  4.314957e-03   7 - 9
10 8.671708e-03   8 - 9

我认为遍历此数据框并使用选择变量从中选择正确字母的函数letters()可能会起作用。但是,我什至想不出一个起点,因为必须同时考虑改变行数......

也许有人有一个好主意?

4

2 回答 2

1

也许您可以cldList()rcompanion库中查看函数,您可以通过管道res输出 od 的结果dunnTest()并创建一个表来指定每组的紧凑型字母显示比较。

于 2021-10-03T08:41:14.157 回答
0

按照@TylerRuddenfort 的建议,以下代码将起作用。第一个 cld 是用 . 创建的rcompanion::cldList,第二个直接用multcompView::multcompLetters. 请注意,要使用multcompLetters,必须从比较名称中删除空格。

在这里,我使用FSA:dunnTest了 Dunn 检验(1964 年)。

一般来说,我建议在运行之前按例如中值或平均值对组进行排序,例如,dunnTest如果您打算使用 cld,以便 cld 以合理的顺序出现。

library (tidyverse)
ozone_summary <- airquality %>% group_by(Month) %>% dplyr::summarize(Mean = mean(Ozone, na.rm=TRUE))

library(FSA)

Result = dunnTest(airquality$Ozone, airquality$Month, method = "bh")$res


### Use cldList()

library(rcompanion)

cldList(P.adj ~ Comparison, data=Result)

### Use multcompView

library(multcompView)

X = Result$P.adj <= 0.05

names(X) = gsub(" ",  "",  Result$Comparison)

multcompLetters(X)
于 2021-11-26T16:38:20.043 回答