scipy.stats.

ttest_ind#

scipy.stats.ttest_ind(a, b, *, ось=0, equal_var=True, nan_policy='propagate', перестановки=None, random_state=None, альтернатива='two-sided', trim=0, метод=None, keepdims=False)[источник]#

Вычислить T-критерий для средних значений две независимые образцы оценок.

Это тест для нулевой гипотезы о том, что 2 независимые выборки имеют одинаковые средние (ожидаемые) значения. Этот тест по умолчанию предполагает, что совокупности имеют одинаковые дисперсии.

Устарело с версии 1.17.0: Использование аргумента(ов) {'keepdims', 'equal_var', 'nan_policy', 'trim', 'method', 'alternative', 'axis'} по позиции устарело; начиная с SciPy 1.17.0, они будут только ключевыми словами. Аргумент(ы) {'random_state', 'permutations'} устарели, независимо от того, переданы ли они по позиции или ключевому слову; они будут удалены в SciPy 1.17.0. Используйте method для выполнения перестановочного теста.

Параметры:
a, barray_like

Массивы должны иметь одинаковую форму, за исключением измерения, соответствующего ось (первый, по умолчанию).

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

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

equal_varbool, необязательно

Если True (по умолчанию), выполнить стандартный независимый двухвыборочный тест, который предполагает равные дисперсии популяций [1]. Если False, выполняется t-тест Уэлча, который не предполагает равную дисперсию генеральной совокупности [2].

Добавлено в версии 0.11.0.

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

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

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

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

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

перестановкинеотрицательное целое число, np.inf или None (по умолчанию), опционально

Если 0 или None (по умолчанию), использовать t-распределение для расчета p-значений. В противном случае, перестановки — это количество случайных перестановок, которые будут использоваться для оценки p-значений с помощью перестановочного теста. Если перестановки равно или превышает количество различных разбиений объединенных данных, выполняется точный тест (т.е. каждое различное разбиение используется ровно один раз). Подробности см. в примечаниях.

Устарело с версии 1.17.0: перестановки устарел и будет удален в SciPy 1.7.0. Используйте n_resamples аргумент PermutationMethod, вместо этого, и передайте экземпляр как метод аргумент.

random_state{None, int, numpy.random.Generator,

numpy.random.RandomState, опционально

Если seed равно None (или np.random), numpy.random.RandomState используется синглтон. Если seed является int, новый RandomState используется экземпляр, инициализированный с seed. Если seed уже является Generator или RandomState экземпляр, тогда этот экземпляр используется.

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

Устарело с версии 1.17.0: random_state устарел и будет удален в SciPy 1.7.0. Используйте rng аргумент PermutationMethod, вместо этого, и передайте экземпляр как метод аргумент.

альтернатива{‘two-sided’, ‘less’, ‘greater’}, необязательный

Определяет альтернативную гипотезу. Доступны следующие варианты (по умолчанию 'two-sided'):

  • «two-sided»: средние распределений, лежащих в основе выборок, не равны.

  • 'less': среднее распределения, лежащего в основе первой выборки, меньше среднего распределения, лежащего в основе второй выборки.

  • ‘greater’: среднее распределения, лежащего в основе первой выборки, больше среднего распределения, лежащего в основе второй выборки.

trimfloat, опционально

Если ненулевое, выполняет усечённый (Юэна) t-тест. Определяет долю элементов, которые будут обрезаны с каждого конца входных выборок. Если 0 (по умолчанию), элементы не будут обрезаны ни с одной стороны. Количество обрезанных элементов с каждого хвоста - это целая часть от доли обрезки, умноженной на количество элементов. Допустимый диапазон [0, .5).

методResamplingMethod, опционально

Определяет метод, используемый для вычисления p-значения. Если метод является экземпляром PermutationMethod/MonteCarloMethod, p-значение вычисляется с использованием scipy.stats.permutation_test/scipy.stats.monte_carlo_test с предоставленными параметрами конфигурации и другими соответствующими настройками. В противном случае p-значение вычисляется путём сравнения тестовой статистики с теоретическим t-распределением.

Добавлено в версии 1.15.0.

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

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

Возвращает:
результатTtestResult

Объект со следующими атрибутами:

статистикаfloat или ndarray

t-статистика.

p-значениеfloat или ndarray

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

dffloat или ndarray

Количество степеней свободы, используемое при вычислении t-статистики. Это всегда NaN для перестановочного t-теста.

Добавлено в версии 1.11.0.

Объект также имеет следующий метод:

confidence_interval(confidence_level=0.95)

Вычисляет доверительный интервал для разницы средних значений генеральной совокупности для заданного уровня доверия. Доверительный интервал возвращается в namedtuple с полями low и high. Когда выполняется перестановочный t-тест, доверительный интервал не вычисляется, и поля low и high содержат NaN.

Добавлено в версии 1.11.0.

Примечания

Предположим, мы наблюдаем две независимые выборки, например, длины лепестков цветов, и мы рассматриваем, были ли две выборки взяты из одной и той же популяции (например, одного и того же вида цветов или двух видов со схожими характеристиками лепестков) или из двух разных популяций.

t-тест количественно оценивает разницу между средними арифметическими двух выборок. P-значение количественно оценивает вероятность наблюдения таких или более экстремальных значений в предположении, что нулевая гипотеза, что выборки взяты из популяций с одинаковыми средними значениями популяций, верна. P-значение больше выбранного порога (например, 5% или 1%) указывает, что наше наблюдение не так маловероятно, чтобы произойти случайно. Поэтому, мы не отвергаем нулевую гипотезу о равенстве средних популяций. Если p-значение меньше нашего порога, то у нас есть доказательства против нулевой гипотезы о равенстве средних популяций.

По умолчанию p-значение определяется путем сравнения t-статистики наблюдаемых данных с теоретическим t-распределением.

(В следующем обратите внимание, что аргумент перестановки сам по себе устарел, но почти идентичный тест может быть выполнен созданием экземпляра scipy.stats.PermutationMethod с n_resamples=permutuations и передача его как метод аргумент.) Когда 1 < permutations < binom(n, k), где

  • k это количество наблюдений в a,

  • n является общим числом наблюдений в a и b, и

  • binom(n, k) это биномиальный коэффициент (n выбрать k),

данные объединяются (конкатенируются), случайным образом назначаются либо группе a или b, и рассчитывается t-статистика. Этот процесс выполняется повторно (был удален из основного пространства имен. Используйте раз), генерируя распределение t-статистики при нулевой гипотезе, и t-статистика наблюдаемых данных сравнивается с этим распределением для определения p-значения. В частности, сообщаемое p-значение — это «достигнутый уровень значимости» (ASL), как определено в 4.4 [3]. Обратите внимание, что существуют другие способы оценки p-значений с использованием рандомизированных перестановочных тестов; для других вариантов см. более общий permutation_test.

Когда permutations >= binom(n, k), выполняется точный тест: данные разделяются между группами каждым возможным способом ровно один раз.

Перестановочный тест может быть вычислительно затратным и не обязательно более точным, чем аналитический тест, но он не делает строгих предположений о форме базового распределения.

Использование обрезки обычно называют обрезанным t-критерием. Иногда называемый t-критерием Юэна, это расширение t-критерия Уэлча, с разницей в использовании винсоризованных средних при вычислении дисперсии и обрезанного размера выборки при вычислении статистики. Обрезка рекомендуется, если базовое распределение имеет длинный хвост или загрязнено выбросами [4].

Статистика вычисляется как (np.mean(a) - np.mean(b))/se, где se является стандартной ошибкой. Следовательно, статистика будет положительной, когда выборочное среднее a больше, чем выборочное среднее b и отрицательное, когда выборочное среднее a меньше, чем выборочное среднее b.

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

ttest_ind имеет экспериментальную поддержку совместимых с Python Array API Standard бэкендов в дополнение к NumPy. Пожалуйста, рассмотрите тестирование этих функций, установив переменную окружения SCIPY_ARRAY_API=1 и предоставление массивов CuPy, PyTorch, JAX или Dask в качестве аргументов массива. Поддерживаются следующие комбинации бэкенда и устройства (или других возможностей).

Библиотека

CPU

GPU

NumPy

н/д

CuPy

н/д

PyTorch

JAX

Dask

н/д

См. Поддержка стандарта array API для получения дополнительной информации.

Ссылки

[3]
  1. Efron и T. Hastie. Computer Age Statistical Inference. (2016).

[4]

Yuen, Karen K. “The Two-Sample Trimmed t for Unequal Population Variances.” Biometrika, vol. 61, no. 1, 1974, pp. 165-170. JSTOR, www.jstor.org/stable/2334299. Accessed 30 Mar. 2021.

[5]

Yuen, Karen K., and W. J. Dixon. “The Approximate Behaviour and Performance of the Two-Sample Trimmed t.” Biometrika, vol. 60, no. 2, 1973, pp. 369-374. JSTOR, www.jstor.org/stable/2334550. Accessed 30 Mar. 2021.

Примеры

>>> import numpy as np
>>> from scipy import stats
>>> rng = np.random.default_rng()

Тест с выборкой с одинаковыми средними:

>>> rvs1 = stats.norm.rvs(loc=5, scale=10, size=500, random_state=rng)
>>> rvs2 = stats.norm.rvs(loc=5, scale=10, size=500, random_state=rng)
>>> stats.ttest_ind(rvs1, rvs2)
TtestResult(statistic=-0.4390847099199348,
            pvalue=0.6606952038870015,
            df=998.0)
>>> stats.ttest_ind(rvs1, rvs2, equal_var=False)
TtestResult(statistic=-0.4390847099199348,
            pvalue=0.6606952553131064,
            df=997.4602304121448)

ttest_ind занижает p для неравных дисперсий:

>>> rvs3 = stats.norm.rvs(loc=5, scale=20, size=500, random_state=rng)
>>> stats.ttest_ind(rvs1, rvs3)
TtestResult(statistic=-1.6370984482905417,
            pvalue=0.1019251574705033,
            df=998.0)
>>> stats.ttest_ind(rvs1, rvs3, equal_var=False)
TtestResult(statistic=-1.637098448290542,
            pvalue=0.10202110497954867,
            df=765.1098655246868)

Когда n1 != n2, t-статистика с равной дисперсией больше не равна t-статистике с неравной дисперсией:

>>> rvs4 = stats.norm.rvs(loc=5, scale=20, size=100, random_state=rng)
>>> stats.ttest_ind(rvs1, rvs4)
TtestResult(statistic=-1.9481646859513422,
            pvalue=0.05186270935842703,
            df=598.0)
>>> stats.ttest_ind(rvs1, rvs4, equal_var=False)
TtestResult(statistic=-1.3146566100751664,
            pvalue=0.1913495266513811,
            df=110.41349083985212)

T-тест с разными средними, дисперсией и n:

>>> rvs5 = stats.norm.rvs(loc=8, scale=20, size=100, random_state=rng)
>>> stats.ttest_ind(rvs1, rvs5)
TtestResult(statistic=-2.8415950600298774,
            pvalue=0.0046418707568707885,
            df=598.0)
>>> stats.ttest_ind(rvs1, rvs5, equal_var=False)
TtestResult(statistic=-1.8686598649188084,
            pvalue=0.06434714193919686,
            df=109.32167496550137)

Возьмем эти две выборки, одна из которых имеет экстремальный хвост.

>>> a = (56, 128.6, 12, 123.8, 64.34, 78, 763.3)
>>> b = (1.1, 2.9, 4.2)

Используйте trim ключевое слово для выполнения усечённого (Юэна) t-теста. Например, используя 20% усечение, trim=.2, тест уменьшит влияние одного (np.floor(trim*len(a))) элемент из каждого хвоста выборки a. Это не будет влиять на выборку b потому что np.floor(trim*len(b)) равен 0.

>>> stats.ttest_ind(a, b, trim=.2)
TtestResult(statistic=3.4463884028073513,
            pvalue=0.01369338726499547,
            df=6.0)