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"} или
PermutationMethodinstance, 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', этот атрибут недоступен.
Смотрите также
Примечания
В дальнейшем пусть
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подходящей формы вместо 2Dnp.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)