Написание функции для обобщения результатов dunn.test::dunn.test

В 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()может работать. Однако я не могу даже придумать отправную точку, потому что одновременно нужно учитывать изменение количества строк...

Может, у кого-то есть хорошая идея?

2 ответа

Возможно, вы могли бы изучить cldList() функция от rcompanion библиотеку, вы можете передать res результаты из вывода od dunnTest() и создайте таблицу, определяющую сравнение компактных буквенных отображений для каждой группы.

Следуя совету @TylerRuddenfort, следующий код будет работать. Первый cld создается с помощью rcompanion::cldList, а второй напрямую использует multcompView::multcompLetters. Обратите внимание, что для использования multcompLetters, пробелы должны быть удалены из имен сравнений.

Здесь я использовал FSA:dunnTestдля теста Данна (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)
Другие вопросы по тегам