monte_carlo_test#
- scipy.stats.monte_carlo_test(данные, rvs, статистика, *, векторизованный=None, n_resamples=9999, batch=None, альтернатива='two-sided', ось=0)[источник]#
Выполнить тест гипотезы методом Монте-Карло.
данные содержит выборку или последовательность одной или нескольких выборок. rvs определяет распределение(я) выборки(ок) в данные при нулевой гипотезе. Значение статистика для заданного данные сравнивается с нулевым распределением Монте-Карло: значение статистики для каждого из n_resamples наборы выборок, сгенерированные с использованием rvs. Это даёт p-значение, вероятность наблюдения такого экстремального значения тестовой статистики при нулевой гипотезе.
- Параметры:
- данныеarray-like или последовательность array-like
Массив или последовательность массивов наблюдений.
- rvsвызываемый объект или кортеж вызываемых объектов
Вызываемый объект или последовательность вызываемых объектов, генерирующих случайные величины при нулевой гипотезе. Каждый элемент rvs должен быть вызываемым объектом, который принимает аргумент ключевого слова
size(например,rvs(size=(m, n))) и возвращает N-мерный массив выборки такой формы. Если rvs является последовательностью, количество вызываемых объектов в rvs должно соответствовать количеству образцов в данные, т.е.len(rvs) == len(data). Если rvs является единым вызываемым объектом, данные рассматривается как единый образец.- статистикаcallable
Статистика, для которой вычисляется p-значение проверки гипотезы. статистика должен быть вызываемым объектом, принимающим выборку (например,
statistic(sample)) илиlen(rvs)отдельные выборки (например,statistic(samples1, sample2)if rvs содержит два вызываемых объекта и данные содержит две выборки) и возвращает результирующую статистику. Если векторизованный установленTrue, статистика также должен принимать аргумент-ключевое слово ось и векторизован для вычисления статистики вдоль предоставленной ось выборок в данные.- векторизованныйbool, необязательно
Если векторизованный установлен
False, статистика не будет передан именованный аргумент ось и ожидается, что она вычисляет статистику только для одномерных выборок. ЕслиTrue, статистика будет передан аргумент ключевого слова ось и ожидается, что он вычислит статистику вдоль ось при передаче ND-массивов выборки. ЕслиNone(по умолчанию), векторизованный будет установленоTrueifaxisявляется параметром статистика. Использование векторизованной статистики обычно сокращает время вычислений.- n_resamplesint, по умолчанию: 9999
Количество выборок, взятых из каждого вызываемого объекта rvs. Эквивалентно, количество статистических значений при нулевой гипотезе, используемое как распределение нулевой гипотезы Монте-Карло.
- batchint, необязательный
Количество выборок Монте-Карло для обработки в каждом вызове статистика. Использование памяти составляет O( batch *
sample.size[axis]). По умолчанию равноNone, в этом случае batch равно n_resamples.- альтернатива{‘two-sided’, ‘less’, ‘greater’}
Альтернативная гипотеза, для которой рассчитывается p-значение. Для каждой альтернативы p-значение определяется следующим образом.
'greater': процент нулевого распределения, который больше или равен наблюдаемому значению тестовой статистики.'less': процент нулевого распределения, который меньше или равен наблюдаемому значению статистики критерия.'two-sided': удвоенное меньшее из p-значений выше.
- осьint, по умолчанию: 0
Ось данные (или каждый образец в данные) по которому рассчитывается статистика.
- Возвращает:
- resMonteCarloTestResult
Объект с атрибутами:
- статистикаfloat или ndarray
Тестовая статистика наблюдаемого данные.
- p-значениеfloat или ndarray
P-значение для данной альтернативы.
- null_distributionndarray
Значения тестовой статистики, сгенерированные при нулевой гипотезе.
Предупреждение
P-значение рассчитывается путем подсчета элементов нулевого распределения, которые являются такими же или более экстремальными, чем наблюдаемое значение статистики. Из-за использования арифметики с конечной точностью некоторые статистические функции возвращают численно различные значения, когда теоретические значения были бы точно равны. В некоторых случаях это может привести к большой ошибке в рассчитанном p-значении.
monte_carlo_testзащищает от этого, рассматривая элементы в нулевом распределении, которые «близки» (в пределах относительного допуска в 100 раз больше эпсилон с плавающей запятой для неточных типов данных) к наблюдаемому значению тестовой статистики, как равные наблюдаемому значению тестовой статистики. Однако пользователю рекомендуется проверить нулевое распределение, чтобы оценить, подходит ли этот метод сравнения, и если нет, рассчитать p-значение вручную.
Ссылки
[1]B. Phipson и G. K. Smyth. "Permutation P-values Should Never Be Zero: Calculating Exact P-values When Permutations Are Randomly Drawn." Statistical Applications in Genetics and Molecular Biology 9.1 (2010).
Примеры
Предположим, мы хотим проверить, была ли небольшая выборка взята из нормального распределения. Мы решаем использовать асимметрию выборки в качестве тестовой статистики и будем считать p-значение 0.05 статистически значимым.
>>> import numpy as np >>> from scipy import stats >>> def statistic(x, axis): ... return stats.skew(x, axis)
После сбора данных мы вычисляем наблюдаемое значение тестовой статистики.
>>> rng = np.random.default_rng() >>> x = stats.skewnorm.rvs(a=1, size=50, random_state=rng) >>> statistic(x, axis=0) 0.12457412450240658
Чтобы определить вероятность наблюдения такого экстремального значения асимметрии случайно, если выборка была взята из нормального распределения, мы можем выполнить тест Монте-Карло. Тест будет случайным образом извлекать множество выборок из их нормального распределения, вычислять асимметрию каждой выборки и сравнивать нашу исходную асимметрию с этим распределением для определения приблизительного p-значения.
>>> from scipy.stats import monte_carlo_test >>> # because our statistic is vectorized, we pass `vectorized=True` >>> rvs = lambda size: stats.norm.rvs(size=size, random_state=rng) >>> res = monte_carlo_test(x, rvs, statistic, vectorized=True) >>> print(res.statistic) 0.12457412450240658 >>> print(res.pvalue) 0.7012
Вероятность получения тестовой статистики, меньшей или равной наблюдаемому значению при нулевой гипотезе, составляет ~70%. Это больше нашего выбранного порога в 5%, поэтому мы не можем считать это значимым свидетельством против нулевой гипотезы.
Обратите внимание, что это p-значение по сути совпадает с
scipy.stats.skewtest, который опирается на асимптотическое распределение тестовой статистики, основанной на выборочной асимметрии.>>> stats.skewtest(x).pvalue 0.6892046027110614
Эта асимптотическая аппроксимация недействительна для малых размеров выборки, но
monte_carlo_testможет использоваться с выборками любого размера.>>> x = stats.skewnorm.rvs(a=1, size=7, random_state=rng) >>> # stats.skewtest(x) would produce an error due to small sample >>> res = monte_carlo_test(x, rvs, statistic, vectorized=True)
Распределение Монте-Карло тестовой статистики предоставлено для дальнейшего исследования.
>>> import matplotlib.pyplot as plt >>> fig, ax = plt.subplots() >>> ax.hist(res.null_distribution, bins=50) >>> ax.set_title("Monte Carlo distribution of test statistic") >>> ax.set_xlabel("Value of Statistic") >>> ax.set_ylabel("Frequency") >>> plt.show()