В одном из предыдущих сообщений я описал расчет критерия Стьюдента при помощи соответствующей функции, входящей в базовую комплектацию R - t.test(). Одно из важных условий корректного применения критерия Стьюдента состоит в том, что анализируемые выборки должны происходить из нормально распределенных генеральных совокупностей. В случаях, когда это условие не выполняется, вместо критерия Стьюдента следует использовать  его непараметрический аналог - критерий Уилкоксона (Wilcoxon rank test). Здесь следует сразу пояснить, что создатели системы R под названием "критерий Уилкоксона" (или "тест Уилкоксона") объединяют как собственно метод, предложенный Фрэнком Уилкоксоном (Frank Wilcoxon) в 1945 г., так и опубликованный несколько позднее (1947 г.) метод Манна-Уитни. Первый из этих методов обычно используется для сравнения двух связных выборок, тогда как второй предназначен для сравнения двух независимых выборок. Ниже я не буду разграничивать эти методы, придерживаясь подхода, принятого в системе R.



Одновыборочный критерий Уилкоксона

Этот вариант критерия (Wilcoxon signed rank test) служит для проверки нулевой гипотезы о том, что анализируемая выборка происходит из симметрично распределенной генеральной совокупности с центром в точке µ0. Алгоритм метода заключается в следующем:
  • µ0 отнимают от каждого выборочного значения;
  • получившиеся величины ранжируют по возрастанию, игнорируя знак;
  • ранговые номера со знаком + суммируют, получая величину V;
  • критерий V сравнивают с критическим значением для заданного уровня значимости и числа степеней свободы; альтернативный подход на этом шаге заключается в нахождении вероятности случайным образом получить значение V, равное или превышающее наблюдаемое значение, при условии истинности нулевой гипотезы.
Ниже при описании теста Уилкоксона я буду использовать примеры, рассмотреные ранее для иллюстрации t-теста Стьюдента. Это позволит нам сравнить результаты, получаемые при помощи обоих методов. В частности, обратимся к данным о суточном потреблении энергии (кДж/сутки) у 11 женщин (пример заимствован из книги Altman D. G. (1981) Practical Statistics for Medical Research, Chapman & Hall, London):

d.intake <- c(5260, 5470, 5640,
  6180, 6390, 6515,
  6805, 7515, 7515,
  8230, 8770)

Необходимо выяснить, отличается ли потребление энергии в группе обследованных женщин от рекомендованного значения 7725 кДж/сутки. Для выполнения теста Уилкоксона в системе R используется функция wilcox.test():

wilcox.test(d.intake, mu = 7725)
 
        Wilcoxon signed rank test with continuity correction
 
data:  d.intake 
V = 8, p-value = 0.0293
alternative hypothesis: true location is not equal to 7725 
 
Warning message:
In wilcox.test.default(d.intake, mu = 7725) :
  cannot compute exact p-value with ties

Видим, что рассчитанное значение критерия V = 8. Вероятность получить такое (или превышающее его) значение при условии, что нулевая гипотеза верна, не превышает 0.05 (p-value = 0.0293). Это позволяет нам отклонить нулевую гипотезу о том, что суточное потребление энергии у обследованных 11 женщин не отличается от принятой нормы. Обратите внимание на выданное программой предупреждение о том, что полученное значени вероятности Р не является точным из-за наличия в данных повторяющихся значений (Warning message... cannot compute exact p-value with ties). Проблема рассчета точных Р-значений при наличии повторяющихся наблюдений в данных характерна для статистических методов, основанных на рангах, и критерий Уилкоксона здесь, увы, не исключение (но см. функцию wilcox_test() из пакета coin). При наличии повторяющихся наблюдений Р-значение рассчитывается путем аппроксимации распредения критерия Уилкоксона нормальным распределением (см. справочный файл по функции ?wilcox.test).


Сравнение двух зависимых выборок

Понятие "зависимые", или "связные выборки" обсуждалось ранее в сообщении, посвященном критерию Стьюдента. Сейчас для нас более важен тот факт, что сравниваемые выборки происходят из ненормально распределенных генеральных совокупностей. Тем не менее, сравнение таких выборок при помощи критерия Уилкоксона происходит сходно с тем, как это делается при помощи парного критерия Стьюдента. В частности, находят разницу между всеми имеющимися парными выборочными наблюдениями с целью проверить нулевую гипотезу о том, что медиана полученных разностей равна нулю (либо какому-либо другому, отличному от нуля значению). (Важно упомянуть широко распространенное ошибочное представление о том, что критерий Уилкоксона применяется для сравнения выборочных медиан).

Используем рассмотренный ранее пример о суточном потреблении энергии, измеренном у одних и тех же 11 женщин до и после периода менструаций:

data(intake) # из пакета ISwR
attach(intake)
intake
    pre post
1  5260 3910
2  5470 4220
3  5640 3885
4  6180 5160
5  6390 5645
6  6515 4680
7  6805 5265
8  7515 5975
9  7515 6790
10 8230 6900
11 8770 7335

Сравнить два периода по потреблению энергии при помощи критерия Уилкоксона можно следующим образом (обратите внимание на использование аргумента paired = TRUE):

wilcox.test(pre, post, paired = TRUE)
 
 Wilcoxon signed rank test with continuity correction
 
data:  pre and post 
V = 66, p-value = 0.00384
alternative hypothesis: true location shift is not equal to 0 
 
Warning message:
In wilcox.test.default(pre, post, paired = T) :
  cannot compute exact p-value with ties

Как видим, рассчитанное программой P-значение оказалось меньше 0.05, что позволяет нам сделать заключение о наличии статистически значимой разницы в потреблении энергии у исследованных женщин до и после менструации. (Для сравнения: Р-значение, полученное при помощи критерия Стьюдента было << 0.001). Мы можем оценить доверительный интервал, в котором с определенной вероятностью находится истинная величина эффекта, воспользовавшись аргументом conf.int (вероятность задается при помощи аргумента conf.level; по умолчанию рассчитывается 95%-ный доверительный интервал):

wilcox.test(pre, post, paired = TRUE, conf.int = TRUE)
 
 Wilcoxon signed rank test with continuity correction
 
data:  pre and post 
V = 66, p-value = 0.00384
alternative hypothesis: true location shift is not equal to 0 
95 percent confidence interval:
 1037.5 1582.5 
sample estimates:
(pseudo)median 
      1341.332 
 
Warning messages:
1: In wilcox.test.default(pre, post, paired = TRUE, conf.int = TRUE) :
  cannot compute exact p-value with ties
2: In wilcox.test.default(pre, post, paired = TRUE, conf.int = TRUE) :
  cannot compute exact confidence interval with ties

Видим, что истинная разница уровней потребленной энергии с вероятностью 95% находится в интервале от 1037.5 до 1581.5 кДж/сутки (для сравнения: при использовании критерия Стьюдента этот интервал составил 1074.1 - 1566.8 кДж/сутки). Опять-таки, из-за наличия повторяющихся наблюдений, рассчет точных доверительных пределов оказался невозможным (см. пункт 2 в списке предупреждений Warning messages). Псевдомедиана ((pseudo)median) индивидуальных разниц между парными значениями потребления энергии была оценена в 1341.3 кДж/сутки. (Псевдомедианой распределения F называют медиану распределения (u + v) / 2, где u и v являются независимыми переменными, каждая из которых имеет распределение F. Если распределение F симметрично, псевдомедиана и медиана совпадают. Подробнее см. ?wilcox.test).


Сравнение двух независимых выборок

Если сравниваемые выборки являются независимыми (paired = FALSE), то мы имеем дело с критерием Уилкоксона, который в англоязычной литературе называют Wilcoxon rank sum test (как было отмечено выше, этот метод называют также методом Манна-Уитни). Проверяемая с его помощью нулевая гипотеза состоит в том, что центры распределений, из которых происходят сравниваемые выборки, смещены относительно друг друга на величину µ (например, µ = 0). Алгоритм метода состоит в следующем:
  • Все имеющиеся значения ранжируют, игнорируя их знак;
  • Ранги значений, принадлежащих к первой группе, суммируют, получая величину W;
  • Полученное W сравнивают со значением, которое можно было бы ожидать при верной нулевой гипотезе и имеющемся числе степеней свободы; альтернативный подход - находят вероятность случайным образом получить значение W, равное или превышающее наблюдаемое значение (при условии истинности нулевой гипотезы).
Используем рассмотренный раннее пример о суточном расходе энергии (expend) у худощавых женщин (lean) и женщих с избыточным весом (obese):
data(energy) # из пакета ISwR
attach(energy)
str(energy)
'data.frame': 22 obs. of  2 variables:
 $ expend : num  9.21 7.53 7.48 8.08 8.09 ...
 $ stature: Factor w/ 2 levels "lean","obese": 2 1 1 1 1 1 1 1 1 1 ...

Проверим гипотезу об отсутствии разницы в потреблении энергии у женщих из этих двух групп при помощи критерия Уилкоксона для независимых выборок:

wilcox.test(expend ~ stature, paired = FALSE)
 
 Wilcoxon rank sum test with continuity correction
 
data:  expend by stature 
W = 12, p-value = 0.002122
alternative hypothesis: true location shift is not equal to 0 
 
Warning message:
In wilcox.test.default(x = c(7.53, 7.48, 8.08, 8.09, 10.15, 8.4,  :
  cannot compute exact p-value with ties

Согласно полученному Р-значению (p-value = 0.002122), потребление энергии у женщин из рассамтриваемых весовых групп статистически значимо различается. Отвергая нулевую гипотезу о равенстве потребляемой энергии, мы рискуем ошибиться с вероятностью лишь около 0.2%.

Важно отметить одно из ограничений критерия Уилкоксона для двух выборок (зависимых или независимых): если общее количество наблюдений не превышает 6, то обнаружить разницу между выборками с уровнем ошибки в 5% просто невозможно (Dalgaard 2008).


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

И. Дзеверин написал(а)…
Правильно ли я понимаю, что значение статистик V и W в этой программе зависит от порядка аргументов? Например, для статистики Уилкоксона в используемом здесь примере
wilcox.test(pre,post,paired=TRUE) дает V=66, а
wilcox.test(post,pre,paired=TRUE) дает V=0.
На значимость результата это не влияет, но может создавать путаницу. Большинство статистических программ приводит большее значение статистики Уилкоксона, старые учебники (например, учебник Лакина) рекомендуют приводить меньшее. А тут мы не знаем заранее, какое значение будет больше, а какое - меньше. Возможно, имеет смысл вычислять оба значения?
Sergey Mastitsky написал(а)…
Хорошее наблюдение и вопрос - спасибо!

Все дело в том, как в R рассчитывается статистика V: суммируются ранги разниц, имеющих положительный знак. Если посмотреть внимательнее на конкретный рассмотренный в сообщении пример, то можно выяснить следующее:

pre - post
[1] 1350 1250 1755 1020 745 1835 1540 1540 725 1330 1435

в то время как

post - pre
[1] -1350 -1250 -1755 -1020 -745 -1835 -1540 -1540 -725 -1330
[11] -1435

Соответственно, если мы выполним тест в виде wilcox.test(pre, post, paired = TRUE), то получим V, отличное о нуля, поскольку имеются разницы с положительным знаком (фактически, все они положительны). Если же мы поменяемя аргументы местами - wilcox.test(post, pre, paired = TRUE) - то все разницы окажутся отрицательными, и V-статистика будет равна 0.

В обоих случаях Р-значение оказывается одинаковым, поскольку программа по сути проверяет, отличается ли найденный интервал значений V (здесь 0:66) от теоретически ожидаемого. Если найденный интервал входит в теоретически ожидаемый, следует вывод о том, что нулевая гипотеза верна.
И. Дзеверин написал(а)…
Спасибо за разъяснение.
Причины расхождения в значениях V и W для меня понятны - они явно следуют из вычислительного алгоритма, как и то, что уровень значимости будет одинаковым. Меня больше интересовал другой вопрос - как представлять результаты вычислений.
Например, допустим, что несколько исследователей независимо анализирует потребление энергии так, как в вышеприведенном примере, с тем, чтобы потом сопоставить результаты. Если нет никакой предварительной договоренности, примерно половина из них будет вычислять (pre - post), а другая половина - (post - pre). В итоге, на выходе значения p-level будут сопоставимы, а вот значения V - едва ли. Возможно, стоило бы выводить в результатах весь найденный интервал (в исходном примере - 0:66)?

Хочу поблагодарить Вас за блог, который Вы ведете. Вырисовывается отличный сборник рекомендаций для начинающих пользователей. Изложение очень четкое, логичное, изучение приводимых алгоритмов действительно помогает в работе.
Sergey Mastitsky написал(а)…
Спасибо за добрые слова о блоге! Я очень рад, что кому-то он помогает.

По поводу представления результатов анализа. У меня относительно мало опыта работы с русскоязычными научными изданиями, и я слабо представляю их требования к представлению результатов подобных тестов. В англоязычных журналах обычно бывает достаточно привести вывод, сделанный по результам выполнения теста, и подтвердить его уровнем Р. Например: "Установлена статистически значимая разница в потреблении энергии в исследованных группах (Р = 0.002, Wilcoxon test)". При условии, что в разделе "Материалы и методы" указаны объемы исследованных групп, этого будет вполне достаточно.

В случаях же, когда все-таки есть необходимость привести конкретное значение той или иной статистики, я бы просто описал (в разделе "Материалы и методы"), как именно эта статистика была рассчитана.
И. Дзеверин написал(а)…
Спасибо!
О представлении результатов статистических тестов в нашей литературе промолчу.
Анонимный написал(а)…
Скажите, пожалуйста, можно ли применять Т-критерий для поиска различий внутри семейных пар?
Sergey Mastitsky написал(а)…
На этот вопрос невозможно дать ответ, не имея дополнительной информации. Что именно вы собираетесь сравнивать? Как были получены данные и каковы их свойства? Подробная статья о t-критерии здесь: http://r-analytics.blogspot.de/2012/03/t.html
Unknown написал(а)…
Скажите, пожалуйста, можно ли использовать критерий Манна-Уитни на больших выборках, при условии, что разница в количестве наблюдений в первой и второй выборке велика (784 и 6204), или же лучше обратиться к параметрическим аналогам?
Unknown написал(а)…
Не могли бы Вы просто перевести на русский слово "ties"? (Особенно в сочетании с "hadling" или "handle"...) Интересует в связи с переводом словосочетания "Efron's tie handling". Спасибо!
Никонов Александр написал(а)…
Большое спасибо за блог! на дворе 2016, а он до сих пор помогает бедным студентам ) Сергей, Вы - спаситель)
Анонимный написал(а)…
2018 год! Помогает до сих пор. Благодарю.
Новые Старые