mannwhitneyu#
- scipy.stats.mannwhitneyu(x, y, use_continuity=True, альтернатива='two-sided', ось=0, метод='auto', *, nan_policy='propagate', keepdims=False)[источник]#
Выполнить ранговый критерий Манна-Уитни для двух независимых выборок.
Тест Манна-Уитни — это непараметрический тест нулевой гипотезы о том, что распределение, лежащее в основе выборки x совпадает с распределением, лежащим в основе выборки y. Часто используется как тест различия в расположении между распределениями.
- Параметры:
- x, yarray-like
N-мерные массивы выборок. Массивы должны быть совместимы для трансляции, кроме измерения, заданного ось.
- use_continuitybool, необязательно
Следует ли применять поправку на непрерывность (1/2). По умолчанию True, когда метод является
'asymptotic'; не имеет эффекта в противном случае.- альтернатива{‘two-sided’, ‘less’, ‘greater’}, необязательный
Определяет альтернативную гипотезу. По умолчанию ‘two-sided’. Пусть SX(u) и SY(u) являются функциями выживания распределений, лежащих в основе x и y, соответственно. Затем доступны следующие альтернативные гипотезы:
‘двусторонний’: распределения не равны, т.е. SX(u) ≠ SY(u) для по крайней мере одного u.
‘less’: распределение, лежащее в основе x стохастически меньше распределения, лежащего в основе y, т.е. SX(u) < SY(u) для всех u.
‘greater’: распределение, лежащее в основе x стохастически больше чем распределение, лежащее в основе y, т.е. SX(u) > SY(u) для всех u.
При более ограничительном наборе предположений альтернативные гипотезы могут быть выражены через местоположения распределений; см. [5] раздел 5.1.
- осьint или None, по умолчанию: 0
Если это целое число, ось входных данных, по которой вычисляется статистика. Статистика каждого среза по оси (например, строки) входных данных появится в соответствующем элементе вывода. Если
None, вход будет сведён в одномерный массив перед вычислением статистики.- метод{‘auto’, ‘asymptotic’, ‘exact’} или
PermutationMethodinstance, optional Выбирает метод, используемый для расчета p-значение. По умолчанию 'auto'. Доступны следующие опции.
'asymptotic': сравнивает стандартизированную тестовую статистику с нормальным распределением, корректируя связи.'exact': вычисляет точное p-значение путём сравнения наблюдаемого \(U\) статистика против точного распределения \(U\) статистика при нулевой гипотезе. Коррекция для связей не производится.'auto': выбирает'exact'когда размер одной из выборок меньше или равен 8 и нет совпадений; выбирает'asymptotic'в противном случае.PermutationMethodэкземпляра. В этом случае p-значение вычисляется с использованиемpermutation_testс предоставленными параметрами конфигурации и другими соответствующими настройками.
- nan_policy{‘propagate’, ‘omit’, ‘raise’}
Определяет, как обрабатывать входные значения NaN.
propagate: если NaN присутствует в срезе оси (например, строке), вдоль которой вычисляется статистика, соответствующая запись вывода будет NaN.omit: NaN будут пропущены при выполнении расчета. Если в срезе оси, вдоль которого вычисляется статистика, остается недостаточно данных, соответствующая запись вывода будет NaN.raise: если присутствует NaN, тоValueErrorбудет вызвано исключение.
- keepdimsbool, по умолчанию: False
Если установлено значение True, оси, которые были сокращены, остаются в результате как размерности с размером один. С этой опцией результат будет корректно транслироваться относительно входного массива.
- Возвращает:
- resMannwhitneyuResult
Объект, содержащий атрибуты:
- статистикаfloat
Статистика Манна-Уитни U, соответствующая выборке x. См. Примечания для статистики критерия, соответствующей выборке y.
- p-значениеfloat
Связанный p-значение для выбранного альтернатива.
Смотрите также
Примечания
Если
U1является статистикой, соответствующей выборке x, тогда статистика, соответствующая выборке y являетсяU2 = x.shape[axis] * y.shape[axis] - U1.mannwhitneyuпредназначен для независимых выборок. Для связанных / парных выборок рассмотритеscipy.stats.wilcoxon.метод
'exact'рекомендуется, когда нет связей и когда либо размер выборки меньше 8 [1]. Реализация следует алгоритму, описанному в [3]. Обратите внимание, что точный метод не скорректировано для связей, ноmannwhitneyuне будет вызывать ошибки или предупреждения при наличии связей в данных. Если есть связи и хотя бы одна выборка мала (менее ~10 наблюдений), рассмотрите передачу экземпляраPermutationMethodкак метод для выполнения перестановочного теста.Тест Манна-Уитни U — это непараметрическая версия t-критерия для независимых выборок. Когда средние значения выборок из популяций распределены нормально, рассмотрите
scipy.stats.ttest_ind.Начиная с SciPy 1.9,
np.matrixвходные данные (не рекомендуется для нового кода) преобразуются вnp.ndarrayперед выполнением вычисления. В этом случае результатом будет скаляр илиnp.ndarrayподходящей формы вместо 2Dnp.matrix. Аналогично, хотя маскированные элементы маскированных массивов игнорируются, результатом будет скаляр илиnp.ndarrayвместо маскированного массива сmask=False.Ссылки
[1]H.B. Mann и D.R. Whitney, «On a test of whether one of two random variables is stochastically larger than the other», The Annals of Mathematical Statistics, Vol. 18, pp. 50-60, 1947.
[2]Критерий Манна-Уитни, Википедия, http://en.wikipedia.org/wiki/Mann-Whitney_U_test
[3]Andreas Löffler, “Über eine Partition der nat. Zahlen und ihr Anwendung beim U-Test”, Wiss. Z. Univ. Halle, XXXII’83 pp. 87-89.
[4] (1,2,3,4,5,6,7)Рози Шир, «Статистика: 2.3 Тест Манна-Уитни», Центр поддержки обучения математике, 2004.
[5]Michael P. Fay и Michael A. Proschan. “Wilcoxon-Mann-Whitney или t-критерий? О предположениях для проверки гипотез и множественных интерпретациях правил принятия решений.” Statistics surveys, Том. 4, стр. 1-39, 2010. https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2857732/
Примеры
Мы следуем примеру из [4]: девять случайно выбранных молодых взрослых были диагностированы с диабетом II типа в указанных ниже возрастах.
>>> males = [19, 22, 16, 29, 24] >>> females = [20, 11, 17, 12]
Мы используем критерий Манна-Уитни для оценки наличия статистически значимой разницы в возрасте постановки диагноза у мужчин и женщин. Нулевая гипотеза состоит в том, что распределение возраста постановки диагноза у мужчин такое же, как у женщин. Мы решаем, что для отклонения нулевой гипотезы в пользу альтернативы о различии распределений требуется уровень доверия 95%. Поскольку количество выборок очень мало и в данных нет совпадений, мы можем сравнить наблюдаемую статистику критерия с точный распределение тестовой статистики при нулевой гипотезе.
>>> from scipy.stats import mannwhitneyu >>> U1, p = mannwhitneyu(males, females, method="exact") >>> print(U1) 17.0
mannwhitneyuвсегда сообщает статистику, связанную с первой выборкой, которая в данном случае является мужской. Это согласуется с \(U_M = 17\) сообщено в [4]. Статистика, связанная со второй статистикой может быть рассчитана:>>> nx, ny = len(males), len(females) >>> U2 = nx*ny - U1 >>> print(U2) 3.0
Это согласуется с \(U_F = 3\) сообщено в [4]. Двусторонний p-значение может быть вычислено из любой статистики, и значение, полученное с помощью
mannwhitneyuсовпадает с \(p = 0.11\) сообщено в [4].>>> print(p) 0.1111111111111111
Точное распределение тестовой статистики асимптотически нормально, поэтому пример продолжается сравнением точного p-значение против p-значение, полученное с использованием нормальной аппроксимации.
>>> _, pnorm = mannwhitneyu(males, females, method="asymptotic") >>> print(pnorm) 0.11134688653314041
Здесь
mannwhitneyuсообщённый p-значение, по-видимому, конфликтует со значением \(p = 0.09\) приведено в [4]. Причина в том, что [4] не применяет поправку на непрерывность, выполняемуюmannwhitneyu;mannwhitneyuуменьшает расстояние между тестовой статистикой и средним значением \(\mu = n_x n_y / 2\) на 0.5 для коррекции того факта, что дискретная статистика сравнивается с непрерывным распределением. Здесь, \(U\) используемая статистика меньше среднего, поэтому мы уменьшаем расстояние, добавляя 0.5 в числителе.>>> import numpy as np >>> from scipy.stats import norm >>> U = min(U1, U2) >>> N = nx + ny >>> z = (U - nx*ny/2 + 0.5) / np.sqrt(nx*ny * (N + 1)/ 12) >>> p = 2 * norm.cdf(z) # use CDF to get p-value from smaller statistic >>> print(p) 0.11134688653314041
При желании мы можем отключить поправку на непрерывность, чтобы получить результат, который согласуется с тем, что указано в [4].
>>> _, pnorm = mannwhitneyu(males, females, use_continuity=False, ... method="asymptotic") >>> print(pnorm) 0.0864107329737
Независимо от того, проводим ли мы точный или асимптотический тест, вероятность того, что тестовая статистика окажется столь же или более экстремальной случайно, превышает 5%, поэтому мы не считаем результаты статистически значимыми.
Предположим, что до просмотра данных мы выдвинули гипотезу, что женщины, как правило, диагностируются в более молодом возрасте, чем мужчины. В этом случае было бы естественно предоставить возрасты женщин в качестве первого ввода, и мы бы выполнили односторонний тест, используя
alternative = 'less': женщины диагностируются в возрасте, который стохастически меньше, чем у мужчин.>>> res = mannwhitneyu(females, males, alternative="less", method="exact") >>> print(res) MannwhitneyuResult(statistic=3.0, pvalue=0.05555555555555555)
Опять же, вероятность получить достаточно низкое значение тестовой статистики случайно при нулевой гипотезе превышает 5%, поэтому мы не отвергаем нулевую гипотезу в пользу альтернативной.
Если разумно предположить, что средние значения выборок из популяций имеют нормальное распределение, мы могли бы использовать t-тест для проведения анализа.
>>> from scipy.stats import ttest_ind >>> res = ttest_ind(females, males, alternative="less") >>> print(res) TtestResult(statistic=-2.239334696520584, pvalue=0.030068441095757924, df=7.0)
При этом предположении, p-значение было бы достаточно низким, чтобы отвергнуть нулевую гипотезу в пользу альтернативной.