P-значение из статистики теста Chi sq в Python

я вычислил тестовую статистику, которая распределяется как хи-квадрат с 1 степенью свободы, и хочу узнать, какое значение P соответствует использованию python.

Я новичок python и maths / stats, поэтому я думаю, что хочу здесь функцию вероятности denisty для распределения chi2 от SciPy. Однако, когда я использую это так:

from scipy import stats
stats.chi2.pdf(3.84 , 1)
0.029846

однако некоторые гуглить и говорить с некоторыми коллегами, которые знают математику, но не python сказали, что это должно быть 0.05.

какие идеи? Овации, Дэви!--2-->

6 ответов


быстрое обновление здесь:

функция плотности вероятности: подумайте об этом как о значении точки; насколько плотна вероятность в данной точке?

кумулятивная функция распределения: это масса вероятности функции до заданной точки; какой процент распределения лежит на одной стороне этой точки?

в вашем случае вы взяли PDF, для которого вы получили правильный ответ. Если вы попробуете 1 - CDF:

>>> 1 - stats.chi2.cdf(3.84, 1)
0.050043521248705147

PDF CDF


для вычисления вероятности нулевой гипотезы, заданной числимой суммой, и степеней свободы вы также можете вызвать chisqprob:

>>> from scipy.stats import chisqprob
>>> chisqprob(3.84, 1)
0.050043521248705189

обратите внимание:

chisqprob устарел! статистика.chisqprob устарел в scipy 0.17.0; используйте статистика.распределения.chi2.sf


в то время как статистика.chisqprob () и 1-stats.chi2.cdf () кажется сопоставимым для малых значений Хи-квадрата, для больших значений Хи-квадрата предпочтительнее первое. Последний не может предоставить p-значение меньше,чем машина epsilon, и даст очень неточные ответы, близкие к машине epsilon. Как показали другие, сопоставимые значения приводят к малым значениям Хи-квадрата с помощью двух методов:

>>>from scipy.stats import chisqprob, chi2
>>>chisqprob(3.84,1)
0.050043521248705189
>>>1 - chi2.cdf(3.84,1)
0.050043521248705147

использование 1-chi2.ВПР() ломается здесь:

>>>1 - chi2.cdf(67,1)
2.2204460492503131e-16
>>>1 - chi2.cdf(68,1)
1.1102230246251565e-16
>>>1 - chi2.cdf(69,1)
1.1102230246251565e-16
>>>1 - chi2.cdf(70,1)
0.0

в то время как chisqprob() дает точные результаты для гораздо большего диапазона значений Хи-квадрата, производя p-значения, почти такие же маленькие, как самый маленький поплавок, больше нуля, пока он тоже не переполнится:

>>>chisqprob(67,1)
2.7150713219425247e-16
>>>chisqprob(68,1)
1.6349553217245471e-16
>>>chisqprob(69,1)
9.8463440314253303e-17    
>>>chisqprob(70,1)
5.9304458500824782e-17
>>>chisqprob(500,1)
9.505397766554137e-111
>>>chisqprob(1000,1)
1.7958327848007363e-219
>>>chisqprob(1424,1)
1.2799986253099803e-311
>>>chisqprob(1425,1)
0.0

Update: как уже отмечалось, chisqprob() устарел для scipy версии 0.17.0 и далее. Значения Хи-квадрата высокой точности теперь можно получить через scipy.статистика.распределения.chi2.СФ(), например:

>>>from scipy.stats.distributions import chi2
>>>chi2.sf(3.84,1)
0.050043521248705189
>>>chi2.sf(1424,1)
1.2799986253099803e-311

вы хотели сделать:

>>> 1 - stats.chi2.cdf(3.84, 1)
0.050043521248705147

некоторые из других решений устарели. Использовать scipy.stats.chi2 Функции Выживания. Что то же самое, что 1 - cdf(chi_statistic, df)

пример:

from scipy.stats import chi2
p_value = chi2.sf(chi_statistic, df)

Если вы хотите понять математику, p-значение образца, x (фиксированное), является

P[P (X) = m(x)] = 1 - G(m (x)^2)

здесь

  • P-вероятность нормального распределения (скажем, K-variate) с известной ковариацией (cov) и средним значением,
  • X-случайная величина из этого нормального распределения,
  • m (x)-расстояние Махаланобиса = sqrt (. Обратите внимание, что в 1-d это просто абсолютное значение z-оценки.
  • G-CDF распределения chi^2 с степенями свободы.

Итак, если вы вычисляете p-значение фиксированного наблюдения, x, то вы вычисляете m (x) (обобщенный Z-балл) и 1-G(m (x)^2).

In [7]: from scipy.stats import chi2

In [8]: k = 1

In [9]: z = 2

In [10]: 1-chi2.cdf(z**2, k)
Out[10]: 0.045500263896358528