Написание функции для обобщения результатов 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)