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подходящей формы вместо 2Dnp.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]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)