Подтвердить что ты не робот

Значение 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.

Любые идеи? Ура, Дэви

4b9b3361

Ответ 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