quantile_test#
- scipy.stats.quantile_test(x, *, q=0, p=0.5, альтернатива='two-sided')[источник]#
Выполнить квантильный тест и вычислить доверительный интервал квантиля.
Эта функция проверяет нулевую гипотезу о том, что q является значением квантиля, связанного с вероятностью p генеральной совокупности, лежащей в основе выборки x. Например, с параметрами по умолчанию он проверяет, что медиана популяции, лежащей в основе x равен нулю. Функция возвращает объект, включающий тестовую статистику, p-значение и метод вычисления доверительного интервала вокруг квантиля.
- Параметры:
- xarray_like
Одномерная выборка.
- qfloat, по умолчанию: 0
Гипотетическое значение квантиля.
- pfloat, по умолчанию: 0.5
Вероятность, связанная с квантилем; т.е. доля населения меньше чем q является p. Должно быть строго между 0 и 1.
- альтернатива{‘two-sided’, ‘less’, ‘greater’}, необязательный
Определяет альтернативную гипотезу. Доступны следующие варианты (по умолчанию 'two-sided'):
‘two-sided’: квантиль, связанный с вероятностью p не является q.
'less': квантиль, связанный с вероятностью p меньше, чем q.
‘greater’: квантиль, связанный с вероятностью p больше, чем q.
- Возвращает:
- результатQuantileTestResult
Объект со следующими атрибутами:
- статистикаfloat
Одна из двух тестовых статистик, которые могут использоваться в квантильном тесте. Первая тестовая статистика,
T1, это доля выборок в x которые меньше или равны гипотетическому квантилю q. Вторая тестовая статистика,T2, это доля выборок в x которые строго меньше гипотетического квантиля q.Когда
alternative = 'greater',T1используется для вычисления p-значения иstatisticустановлено вT1.Когда
alternative = 'less',T2используется для вычисления p-значения иstatisticустановлено вT2.Когда
alternative = 'two-sided', обаT1иT2рассматриваются, и используется тот, который приводит к наименьшему p-значению.- statistic_typeint
Либо 1 или 2 в зависимости от того, какой из
T1илиT2был использован для вычисления p-значения.- p-значениеfloat
P-значение, связанное с заданной альтернативой.
Объект также имеет следующий метод:
- confidence_interval(confidence_level=0.95)
Вычисляет доверительный интервал вокруг популяционного квантиля, связанного с вероятностью p. Доверительный интервал возвращается в
namedtupleс полями низкий и высокий. Значения nan когда недостаточно наблюдений для вычисления доверительного интервала с требуемой доверительной вероятностью.
Примечания
Этот тест и его метод вычисления доверительных интервалов являются непараметрическими. Они справедливы тогда и только тогда, когда наблюдения независимы и одинаково распределены.
Реализация теста следует Коноверу [1]. Рассматриваются две тестовые статистики.
T1: Количество наблюдений в x меньше или равно q.T1 = (x <= q).sum()T2: Количество наблюдений в x строго меньше q.T2 = (x < q).sum()Использование двух тестовых статистик необходимо для обработки возможности того, что x был сгенерирован из дискретного или смешанного распределения.
Нулевая гипотеза для теста:
H0: \(p^{\mathrm{th}}\) квантиль популяции равен q.
и нулевое распределение для каждой тестовой статистики \(\mathrm{binom}\left(n, p\right)\). Когда
alternative='less', альтернативная гипотеза:H1: \(p^{\mathrm{th}}\) квантиль популяции меньше, чем q.
и p-значение — это вероятность того, что биномиальная случайная величина
\[Y \sim \mathrm{binom}\left(n, p\right)\]больше или равно наблюдаемому значению
T2.Когда
alternative='greater', альтернативная гипотеза:H1: \(p^{\mathrm{th}}\) квантиль совокупности больше, чем q
и p-значение — это вероятность того, что биномиальная случайная величина Y меньше или равна наблюдаемому значению
T1.Когда
alternative='two-sided', альтернативная гипотеза:H1: q не является \(p^{\mathrm{th}}\) квантиль популяции.
и p-значение равно удвоенному меньшему из p-значений для
'less'и'greater'случаях. Оба этих p-значения могут превышать 0.5 для одних и тех же данных, поэтому значение ограничивается интервалом \([0, 1]\).Подход к доверительным интервалам приписывается Томпсону [2] и позже доказано, что применимо к любому набору независимых одинаково распределенных выборок [3]. Вычисление основано на наблюдении, что вероятность квантиля \(q\) быть больше любых наблюдений \(x_m (1\leq m \leq N)\) может быть вычислен как
\[\mathbb{P}(x_m \leq q) = 1 - \sum_{k=0}^{m-1} \binom{N}{k} q^k(1-q)^{N-k}\]По умолчанию доверительные интервалы вычисляются для уровня доверия 95%. Распространённая интерпретация 95% доверительных интервалов заключается в том, что если независимые одинаково распределённые выборки многократно извлекаются из одной и той же совокупности и каждый раз формируются доверительные интервалы, то доверительный интервал будет содержать истинное значение указанного квантиля примерно в 95% испытаний.
Похожая функция доступна в пакете R QuantileNPCI [4]. Основание то же самое, но оно вычисляет границы доверительного интервала путем интерполяции между выборочными значениями, тогда как эта функция использует только выборочные значения в качестве границ. Таким образом,
quantile_test.confidence_intervalвозвращает более консервативные интервалы (т.е. большие).Тот же расчёт доверительных интервалов для квантилей включён в пакет confintr [5].
Двусторонние доверительные интервалы не гарантированно оптимальны; т.е., может существовать более узкий интервал, который может содержать квантиль интереса с вероятностью большей, чем уровень доверия. Без дополнительных предположений о выборках (например, о природе базового распределения), односторонние интервалы оптимально узки.
Ссылки
[1]Conover. Practical Nonparametric Statistics, 3rd Ed. 1999.
[2]W. R. Thompson, «On Confidence Ranges for the Median and Other Expectation Distributions for Populations of Unknown Distribution Form», The Annals of Mathematical Statistics, vol. 7, no. 3, pp. 122-128, 1936, Accessed: Sep. 18, 2019. [Online]. Available: https://www.jstor.org/stable/2957563.
[3]H. A. David и H. N. Nagaraja, «Порядковые статистики в непараметрическом выводе» в Order Statistics, John Wiley & Sons, Ltd, 2005, стр. 159-170. Доступно: https://onlinelibrary.wiley.com/doi/10.1002/0471722162.ch7.
[4]N. Hutson, A. Hutson, L. Yan, “QuantileNPCI: Непараметрические доверительные интервалы для квантилей,” пакет R, https://cran.r-project.org/package=QuantileNPCI
[5]M. Mayer, "confintr: Confidence Intervals," R package, https://cran.r-project.org/package=confintr
Примеры
Предположим, мы хотим проверить нулевую гипотезу о том, что медиана популяции равна 0.5. Мы выбираем уровень доверия 99%; то есть мы отклоним нулевую гипотезу в пользу альтернативной, если p-значение меньше 0.01.
При тестировании случайных величин из стандартного равномерного распределения, которое имеет медиану 0.5, мы ожидаем, что данные будут соответствовать нулевой гипотезе в большинстве случаев.
>>> import numpy as np >>> from scipy import stats >>> rng = np.random.default_rng() >>> rvs = stats.uniform.rvs(size=100, random_state=rng) >>> stats.quantile_test(rvs, q=0.5, p=0.5) QuantileTestResult(statistic=45, statistic_type=1, pvalue=0.36820161732669576)
Как и ожидалось, p-значение не ниже нашего порога 0.01, поэтому мы не можем отвергнуть нулевую гипотезу.
При тестировании данных из стандартного нормальный распределение, которое имеет медиану 0, мы ожидаем, что нулевая гипотеза будет отклонена.
>>> rvs = stats.norm.rvs(size=100, random_state=rng) >>> stats.quantile_test(rvs, q=0.5, p=0.5) QuantileTestResult(statistic=67, statistic_type=2, pvalue=0.0008737198369123724)
Действительно, p-значение ниже нашего порога 0.01, поэтому мы отвергаем нулевую гипотезу в пользу альтернативы по умолчанию «двусторонняя»: медиана популяции не равно 0.5.
Однако предположим, что мы тестируем нулевую гипотезу против односторонней альтернативы, что медиана популяции больше чем 0.5. Поскольку медиана стандартного нормального распределения меньше 0.5, мы не ожидали бы отклонения нулевой гипотезы.
>>> stats.quantile_test(rvs, q=0.5, p=0.5, alternative='greater') QuantileTestResult(statistic=67, statistic_type=1, pvalue=0.9997956114162866)
Неудивительно, что при p-значении, превышающем наш порог, мы не отвергли бы нулевую гипотезу в пользу выбранной альтернативы.
Квантильный тест можно использовать для любого квантиля, а не только для медианы. Например, мы можем проверить, превышает ли третий квартиль распределения, лежащего в основе выборки, 0.6.
>>> rvs = stats.uniform.rvs(size=100, random_state=rng) >>> stats.quantile_test(rvs, q=0.6, p=0.75, alternative='greater') QuantileTestResult(statistic=64, statistic_type=1, pvalue=0.00940696592998271)
P-значение ниже порога. Мы отвергаем нулевую гипотезу в пользу альтернативной: третий квартиль распределения, лежащего в основе нашей выборки, больше 0.6.
quantile_testтакже может вычислять доверительные интервалы для любого квантиля.>>> rvs = stats.norm.rvs(size=100, random_state=rng) >>> res = stats.quantile_test(rvs, q=0.6, p=0.75) >>> ci = res.confidence_interval(confidence_level=0.95) >>> ci ConfidenceInterval(low=0.284491604437432, high=0.8912531024914844)
При тестировании односторонней альтернативы доверительный интервал содержит все наблюдения, такие что если переданы как q, p-значение теста было бы больше 0.05, и поэтому нулевая гипотеза не была бы отвергнута. Например:
>>> rvs.sort() >>> q, p, alpha = 0.6, 0.75, 0.95 >>> res = stats.quantile_test(rvs, q=q, p=p, alternative='less') >>> ci = res.confidence_interval(confidence_level=alpha) >>> for x in rvs[rvs <= ci.high]: ... res = stats.quantile_test(rvs, q=x, p=p, alternative='less') ... assert res.pvalue > 1-alpha >>> for x in rvs[rvs > ci.high]: ... res = stats.quantile_test(rvs, q=x, p=p, alternative='less') ... assert res.pvalue < 1-alpha
Кроме того, если 95% доверительный интервал многократно генерируется для случайных выборок, доверительный интервал будет содержать истинное значение квантиля в приблизительно 95% повторений.
>>> dist = stats.rayleigh() # our "unknown" distribution >>> p = 0.2 >>> true_stat = dist.ppf(p) # the true value of the statistic >>> n_trials = 1000 >>> quantile_ci_contains_true_stat = 0 >>> for i in range(n_trials): ... data = dist.rvs(size=100, random_state=rng) ... res = stats.quantile_test(data, p=p) ... ci = res.confidence_interval(0.95) ... if ci[0] < true_stat < ci[1]: ... quantile_ci_contains_true_stat += 1 >>> quantile_ci_contains_true_stat >= 950 True
Это работает с любым распределением и любым квантилем, при условии, что выборки независимы и одинаково распределены.