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
для вычисления вероятности нулевой гипотезы, заданной числимой суммой, и степеней свободы вы также можете вызвать 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
некоторые из других решений устарели. Использовать 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