Python中Chi square检验统计量的P值

时间:2012-07-30 15:59:10

标签: python statistics scipy chi-squared

我计算了一个测试统计量,该统计量被分配为具有1个自由度的卡方,并且想要找出与使用python相对应的P值。

我是一个python和数学/统计新手所以我想我想要的是来自SciPy的chi2分布的概率denisty函数。但是,当我像这样使用它时:

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

然而,一些谷歌搜索和一些知道数学而不是python的同事交谈时说它应该是0.05。

有什么想法吗? 干杯, 戴维

7 个答案:

答案 0 :(得分:41)

快速复习:

概率密度函数:将其视为一个点值;给定点的概率有多密集?

累积分布函数:这是函数达到给定点的概率质量;在这一点的一方,分布的百分比是多少?

在您的情况下,您使用了PDF,您得到了正确的答案。如果您尝试1 - CDF:

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

PDF CDF

答案 1 :(得分:18)

为了计算无效假设的概率,给定chisquared sum和自由度,你也可以调用chisqprob

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

<强>注意:

  

chisqprob已被弃用! stats.chisqprob在scipy 0.17.0中弃用;请改用stats.distributions.chi2.sf

答案 2 :(得分:15)

虽然stats.chisqprob()和1-stats.chi2.cdf()在小卡方值上看似可比,但对于大卡方值,前者更可取。后者不能提供小于机器epsilon的p值,并且将在机器epsilon附近给出非常不准确的答案。如其他人所示,使用两种方法可比较的值导致小的卡方值:

>>>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

答案 3 :(得分:5)

你的意思是:

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

答案 4 :(得分:3)

其他一些解决方案已被弃用。使用scipy.stats.chi2生存函数。这与1 - cdf(chi_statistic, df)

相同

示例:

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

答案 5 :(得分:2)

如果你想理解数学,样本的p值x(固定)是

P [P(X)&lt; = P(x)] = P [m(X)> = m(x)] = 1-G(m(x)^ 2)

其中,

  • P是具有已知协方差(cov)和均值的(例如k-变量)正态分布的概率,
  • X是该正态分布的随机变量,
  • m(x)是马哈拉诺比斯距离= sqrt(&lt; cov ^ { - 1}(x-mean),x-mean>。注意,在1-d中,这只是z-的绝对值得分。
  • G是具有k自由度的chi ^ 2分布的CDF。

因此,如果您计算固定观测值的p值x,则计算m(x)(广义z得分)和1-G(m(x)^ 2)。

例如,众所周知,如果x是从单变量(k = 1)正态分布中采样并且z分数= 2(它与均值的标准偏差为2),那么p值约为0.046(参见z分数表)

Button

答案 6 :(得分:1)

要获得超高精度,当scipy的chi2.sf()不够用时,请拿出大手枪:

>>> import numpy as np
>>> from rpy2.robjects import r
>>> np.exp(np.longdouble(r.pchisq(19000, 2, lower_tail=False, log_p=True)[0]))
1.5937563168532229629e-4126