scipy.stats.

wilcoxon#

scipy.stats.wilcoxon(x, y=None, zero_method='wilcox', коррекция=False, альтернатива='two-sided', метод='auto', *, ось=0, nan_policy='propagate', keepdims=False)[источник]#

Вычислить критерий знаковых рангов Уилкоксона.

Критерий знаковых рангов Уилкоксона проверяет нулевую гипотезу о том, что два связанных парных образца происходят из одного распределения. В частности, он проверяет, является ли распределение разностей x - y симметричен относительно нуля. Это непараметрическая версия парного T-теста.

Параметры:
xarray_like

Либо первый набор измерений (в этом случае y является вторым набором измерений), или разностями между двумя наборами измерений (в этом случае y не должна быть указана.) Должна быть одномерной.

yarray_like, необязательный

Либо второй набор измерений (если x является первым набором измерений), или не указано (если x представляет собой разности между двумя наборами измерений.) Должен быть одномерным.

Предупреждение

Когда y предоставлен, wilcoxon вычисляет тестовую статистику на основе рангов абсолютных значений d = x - y. Ошибка округления при вычитании может привести к элементам d присваиваются разные ранги, даже если они были бы связаны при точной арифметике. Вместо передачи x и y отдельно, рассмотрите вычисление разности x - y, округляя по мере необходимости, чтобы убедиться, что только действительно уникальные элементы численно различны, и передавая результат как x, оставляя y по умолчанию (None).

zero_method{"wilcox", "pratt", "zsplit"}, опционально

Существуют разные соглашения для обработки пар наблюдений с равными значениями («нулевые разности» или «нули»).

  • “wilcox”: Отбрасывает все нулевые разности (по умолчанию); см. [4].

  • “pratt”: Включает нулевые разности в процесс ранжирования, но отбрасывает ранги нулей (более консервативно); см. [3]. В этом случае нормальная аппроксимация скорректирована, как в [5].

  • "zsplit": включает нулевые разницы в процесс ранжирования и разделяет нулевой ранг между положительными и отрицательными.

коррекцияbool, необязательно

Если True, примените поправку на непрерывность, корректируя статистику рангов Уилкоксона на 0.5 в сторону среднего значения при вычислении z-статистики, если используется нормальная аппроксимация. По умолчанию False.

альтернатива{"two-sided", "greater", "less"}, опционально

Определяет альтернативную гипотезу. По умолчанию 'two-sided'. В следующем, пусть d представляют разницу между парными выборками: d = x - y если оба x и y предоставлены, или d = x в противном случае.

  • 'two-sided': распределение, лежащее в основе d не симметричен относительно нуля.

  • ‘less’: распределение, лежащее в основе d стохастически меньше распределения, симметричного относительно нуля.

  • ‘greater’: распределение, лежащее в основе d стохастически больше распределения, симметричного относительно нуля.

метод{"auto", "exact", "asymptotic"} или PermutationMethod instance, optional

Метод для вычисления p-значения, см. Примечания. По умолчанию "auto".

осьint или None, по умолчанию: 0

Если это целое число, ось входных данных, по которой вычисляется статистика. Статистика каждого среза по оси (например, строки) входных данных появится в соответствующем элементе вывода. Если None, вход будет сведён в одномерный массив перед вычислением статистики.

nan_policy{‘propagate’, ‘omit’, ‘raise’}

Определяет, как обрабатывать входные значения NaN.

  • propagate: если NaN присутствует в срезе оси (например, строке), вдоль которой вычисляется статистика, соответствующая запись вывода будет NaN.

  • omit: NaN будут пропущены при выполнении расчета. Если в срезе оси, вдоль которого вычисляется статистика, остается недостаточно данных, соответствующая запись вывода будет NaN.

  • raise: если присутствует NaN, то ValueError будет вызвано исключение.

keepdimsbool, по умолчанию: False

Если установлено значение True, оси, которые были сокращены, остаются в результате как размерности с размером один. С этой опцией результат будет корректно транслироваться относительно входного массива.

Возвращает:
Объект со следующими атрибутами.
статистикаarray_like

Если альтернатива равна "two-sided", сумма рангов разностей выше или ниже нуля, в зависимости от того, что меньше. В противном случае сумма рангов разностей выше нуля.

p-значениеarray_like

P-значение для теста зависит от альтернатива и метод.

zstatisticarray_like

Когда method = 'asymptotic', это нормализованная z-статистика:

z = (T - mn - d) / se

где T является статистика как определено выше, mn является средним значением распределения при нулевой гипотезе, d является поправкой на непрерывность, и se является стандартной ошибкой. Когда method != 'asymptotic', этот атрибут недоступен.

Смотрите также

kruskal, mannwhitneyu

Примечания

В дальнейшем пусть d представляют разницу между парными выборками: d = x - y если оба x и y предоставлены, или d = x в противном случае. Предположим, что все элементы d независимы и одинаково распределены, и все различны и ненулевые.

  • Когда len(d) достаточно велико, нулевое распределение нормированной тестовой статистики (zstatistic выше) приблизительно нормальное, и method = 'asymptotic' может использоваться для вычисления p-значения.

  • Когда len(d) мал, нормальное приближение может быть неточным, и method='exact' предпочтительнее (за счет дополнительного времени выполнения).

  • По умолчанию, method='auto', выбирает между двумя: method='exact' используется, когда len(d) <= 50, и method='asymptotic' используется в противном случае.

Наличие "связей" (т.е. не все элементы d уникальны) или «нули» (т.е. элементы d равны нулю) изменяет нулевое распределение статистики теста, и method='exact' больше не вычисляет точное p-значение. Если method='asymptotic', z-статистика корректируется для более точного сравнения со стандартным нормальным распределением, но всё же, для конечных размеров выборки, стандартное нормальное распределение является лишь аппроксимацией истинного нулевого распределения z-статистики. Для таких ситуаций, метод параметр также принимает экземпляры PermutationMethod. В этом случае p-значение вычисляется с использованием permutation_test с предоставленными параметрами конфигурации и другими соответствующими настройками.

Наличие связок и нулей влияет на разрешение method='auto' соответственно: исчерпывающие перестановки выполняются, когда len(d) <= 13, и асимптотический метод используется в противном случае. Обратите внимание, что асимптотический метод может быть не очень точным даже для len(d) > 14; порог был выбран как компромисс между временем выполнения и точностью при ограничении, что результаты должны быть детерминированными. Рассмотрите предоставление экземпляра PermutationMethod метод вручную, выбирая n_resamples параметр для балансировки временных ограничений и требований к точности.

Также обратите внимание, что в крайнем случае, когда все элементы d равны нулю, P-значение, основанное на нормальной аппроксимации, не может быть вычислено (NaN), если zero_method='wilcox' или zero_method='pratt'.

Начиная с SciPy 1.9, np.matrix входные данные (не рекомендуется для нового кода) преобразуются в np.ndarray перед выполнением вычисления. В этом случае результатом будет скаляр или np.ndarray подходящей формы вместо 2D np.matrix. Аналогично, хотя маскированные элементы маскированных массивов игнорируются, результатом будет скаляр или np.ndarray вместо маскированного массива с mask=False.

Ссылки

[2]

Conover, W.J., Practical Nonparametric Statistics, 1971.

[3]

Пратт, Дж.В., Замечания о нулях и связях в процедурах знакового ранга Уилкоксона, Журнал Американской статистической ассоциации, Том. 54, 1959, стр. 655-667. DOI:10.1080/01621459.1959.10501526

[4] (1,2)

Уилкоксон, Ф., Индивидуальные сравнения методами ранжирования, Бюллетень биометрии, Том 1, 1945, стр. 80-83. DOI:10.2307/3001968

[5]

Cureton, E.E., The Normal Approximation to the Signed-Rank Sampling Distribution When Zero Differences are Present, Journal of the American Statistical Association, Vol. 62, 1967, pp. 1068-1069. DOI:10.1080/01621459.1967.10500917

Примеры

В [4], разница в высоте между перекрестно- и самоопыляемыми растениями кукурузы дана следующим образом:

>>> d = [6, 8, 14, 16, 23, 24, 28, 29, 41, -48, 49, 56, 60, -67, 75]

Перекрестно опыленные растения, по-видимому, выше. Чтобы проверить нулевую гипотезу об отсутствии разницы в высоте, мы можем применить двусторонний тест:

>>> from scipy.stats import wilcoxon
>>> res = wilcoxon(d)
>>> res.statistic, res.pvalue
(24.0, 0.041259765625)

Следовательно, мы отвергли бы нулевую гипотезу на уровне доверия 5%, заключив, что есть разница в высоте между группами. Чтобы подтвердить, что медиану разностей можно считать положительной, мы используем:

>>> res = wilcoxon(d, alternative='greater')
>>> res.statistic, res.pvalue
(96.0, 0.0206298828125)

Это показывает, что нулевая гипотеза о том, что медиана отрицательна, может быть отвергнута на уровне доверия 5% в пользу альтернативы, что медиана больше нуля. Приведённые p-значения точны. Использование нормальной аппроксимации даёт очень похожие значения:

>>> res = wilcoxon(d, method='asymptotic')
>>> res.statistic, res.pvalue
(24.0, 0.04088813291185591)

Обратите внимание, что статистика изменилась на 96 в одностороннем случае (сумма рангов положительных разностей), тогда как в двустороннем случае она равна 24 (минимум суммы рангов выше и ниже нуля).

В приведенном выше примере различия в высоте между парными растениями предоставлены wilcoxon напрямую. Альтернативно, wilcoxon принимает две выборки одинаковой длины, вычисляет разности между парными элементами, затем выполняет тест. Рассмотрим выборки x и y:

>>> import numpy as np
>>> x = np.array([0.5, 0.825, 0.375, 0.5])
>>> y = np.array([0.525, 0.775, 0.325, 0.55])
>>> res = wilcoxon(x, y, alternative='greater')
>>> res
WilcoxonResult(statistic=5.0, pvalue=0.5625)

Обратите внимание, что если бы мы вычислили разности вручную, тест дал бы другие результаты:

>>> d = [-0.025, 0.05, 0.05, -0.05]
>>> ref = wilcoxon(d, alternative='greater')
>>> ref
WilcoxonResult(statistic=6.0, pvalue=0.5)

Существенная разница обусловлена ошибкой округления в результатах x-y:

>>> d - (x-y)
array([2.08166817e-17, 6.93889390e-17, 1.38777878e-17, 4.16333634e-17])

Хотя мы ожидали, что все элементы (x-y)[1:] иметь одинаковую величину 0.05, они имеют немного разные величины на практике, и поэтому им присваиваются разные ранги в тесте. Перед выполнением теста рассчитайте d и корректируя его по мере необходимости, чтобы гарантировать, что теоретически идентичные значения не становятся численно различными. Например:

>>> d2 = np.around(x - y, decimals=3)
>>> wilcoxon(d2, alternative='greater')
WilcoxonResult(statistic=6.0, pvalue=0.5)