在 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()
可能会起作用。但是,我什至想不出一个起点,因为必须同时考虑改变行数......
也许有人有一个好主意?