Значение 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
Однако некоторые поисковые запросы и разговоры с некоторыми коллегами, которые знают математику, но не питон, сказали, что это должно быть 0,05.
Любые идеи?
Ура,
Дэви
Ответы
Ответ 1
Быстрое обновление:
Функция плотности вероятности: подумайте об этом как о значении точки; насколько плотна вероятность в данной точке?
Функция кумулятивного распределения: это масса вероятности функции до данной точки; какой процент распределения лежит на одной стороне этого пункта?
В вашем случае вы взяли PDF файл, для которого вы получили правильный ответ. Если вы попробуете 1 - CDF:
>>> 1 - stats.chi2.cdf(3.84, 1)
0.050043521248705147
PDF
CDF
Ответ 2
Чтобы вычислить вероятность нулевой гипотезы при заданной четной сумме и степенях свободы, вы также можете вызвать chisqprob
:
>>> from scipy.stats import chisqprob
>>> chisqprob(3.84, 1)
0.050043521248705189
Примечание:
chisqprob устарел! stats.chisqprob устарел в scipy 0.17.0; используйте stats.distributions.chi2.sf вместо
Ответ 3
В то время как stats.chisqprob() и 1-stats.chi2.cdf() кажутся сопоставимыми для небольших значений хи-квадрата, для больших значений хи-квадрат предпочтительнее первое. Последнее не может обеспечить p-значение меньше машинного эпсилона и даст очень неточные ответы, близкие к машинным эпсилон. Как показывают другие, сопоставимые значения приводятся для небольших значений хи-квадрат с помощью двух методов:
>>>from scipy.stats import chisqprob, chi2
>>>chisqprob(3.84,1)
0.050043521248705189
>>>1 - chi2.cdf(3.84,1)
0.050043521248705147
Здесь используется 1-chi2.cdf():
>>>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
Обновление: как отмечено, chisqprob() устарел для версии scipy 0.17.0 и далее. Высокоточные значения хи-квадрата теперь можно получить через scipy.stats.distributions.chi2.sf(), например:
>>>from scipy.stats.distributions import chi2
>>>chi2.sf(3.84,1)
0.050043521248705189
>>>chi2.sf(1424,1)
1.2799986253099803e-311
Ответ 4
Вы хотели сделать:
>>> 1 - stats.chi2.cdf(3.84, 1)
0.050043521248705147
Ответ 5
Некоторые из других решений устарели. Используйте scipy.stats.chi2
Функция выживания. Это то же самое, что 1 - cdf(chi_statistic, df)
Пример:
from scipy.stats import chi2
p_value = chi2.sf(chi_statistic, df)
Ответ 6
Если вы хотите понять математику, p-значение образца x (фиксированное),
P [P (X) <= P (x)] = P [m (X) >= m (x)] = 1 - G (m (x) ^ 2)
где <
- P - вероятность a (скажем, k-вариационного) нормального распределения с известной ковариацией (cov) и средней,
- X - случайная величина из этого нормального распределения,
- m (x) - расстояние mahalanobis = sqrt (< cov ^ {- 1} (среднее по x), x-mean > . Заметим, что в 1-d это всего лишь абсолютное значение z-балла.
- G - это CDF распределения chi ^ 2 w/k степеней свободы.
Итак, если вы вычисляете p-значение фиксированного наблюдения x, тогда вы вычисляете m (x) (обобщенный z-балл) и 1-G (m (x) ^ 2).
например, хорошо известно, что если x отбирается из одномерного (k = 1) нормального распределения и имеет z-score = 2 (это 2 стандартных отклонения от среднего), то p-значение составляет около 0,046 (см. таблицу z-score)
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