wilcox_test возвращает неверное значение U для MWU

#r #statistics

#r #Статистика

Вопрос:

когда я использую wilcox.test для запуска непараметрического теста Манна Уитни U, возвращаемое значение W является большим из двух значений U. Мне это кажется странным, поскольку тест MWU использует меньшее из двух значений U в качестве статистики теста, поэтому я хотел бы увидеть это значение для отчета о данных. Ниже приведен пример. Если я запускаю код в R, значение W указано в 214.

 wilcox.test(disp ~ am, data = mtcars)
  

Но если я вычислю это с помощью другой программы или веб-сайта (мне нравится этот калькулятор: https://www.socscistatistics.com/tests/mannwhitney /), я получаю, что два значения U равны 33 и 214. Затем мы используем 33 для проверки критического значения и сообщаем об этом значении.

Существует ли какой-либо пакет, который вычисляет MWU более удобным для пользователя способом, где он показывает правильное / меньшее значение U в качестве статистики теста? Я попробовал версию rstatix, и она делает то же самое. Кроме того, кто-нибудь знает, почему это будет поведение по умолчанию? Это кажется нелогичным.

Ответ №1:

Если у вас есть данные в широком формате, используйте wilcox.test формат с двумя аргументами, а не формат формулы. Переключение аргументов предоставит два U значения.

Поворот mtcars на широкий:

 library(dplyr)
library(magrittr)

mtcars_wide<- mtcars %>%
  pivot_wider(names_from = "am", values_from = "disp", names_prefix = "am_")
  

Используйте формат с двумя аргументами для wilcox.test , чтобы получить каждый U :

 mtcars_wide %$% wilcox.test(am_0, am_1, data = .)$statistic # 214

mtcars_wide %$% wilcox.test(am_1, am_0, data = .)$statistic # 33
  

Примечание: Не имеет значения, как вы перемещаете данные в широкий формат — я использую пакеты tidyverse, но они не нужны. Дело в том, что вы можете получить каждое U из них, поменяв местами имена столбцов при запуске теста.

Комментарии:

1. Я думаю, также может стоить отметить, что ни одно из значений U не является «правильным»; stats::wilcox.test.default показывает, что R соответствующим образом обрабатывает разные хвосты: p <- if (STATISTIC > (n.x * n.y/2)) pwilcox(STATISTIC - 1, n.x, n.y, lower.tail = FALSE) else pwilcox(STATISTIC, n.x, n.y)

Ответ №2:

Обратите wilcox.test внимание, что функция в пакете статистики не следует тому же соглашению, t.test что и и меняет знак тестовой статистики на основе знака сгруппированных различий. Он вычисляет другую оценку статистики теста с тем же уровнем значимости. Знак статистики V теста всегда будет положительным, поскольку он представляет собой сумму положительных рангов со знаком.

Рассмотрите возможность ручного изменения порядка уровней коэффициентов, если вам нужно другое число mtcars пример

 wilcox.test(disp ~ am, data = mtcars)


#>  Wilcoxon rank sum test with continuity correction
#> 
#> data:  disp by am
#> W = 214, p-value = 0.0005493
#> alternative hypothesis: true location shift is not equal to 0

mtcars$am <- factor(mtcars$am, levels = c(1,0))
wilcox.test(disp ~ am, data = mtcars)


#>  Wilcoxon rank sum test with continuity correction
#> 
#> data:  disp by am
#> W = 33, p-value = 0.0005493
#> alternative hypothesis: true location shift is not equal to 0