我计算了一个测试统计量,该统计量被分配为具有1个自由度的卡方,并且想要找出与使用python相对应的P值。
我是一个python和数学/统计新手所以我想我想要的是来自SciPy的chi2分布的概率denisty函数。但是,当我像这样使用它时:
from scipy import stats
stats.chi2.pdf(3.84 , 1)
0.029846
然而,一些谷歌搜索和一些知道数学而不是python的同事交谈时说它应该是0.05。
有什么想法吗? 干杯, 戴维
答案 0 :(得分:41)
快速复习:
概率密度函数:将其视为一个点值;给定点的概率有多密集?
累积分布函数:这是函数达到给定点的概率质量;在这一点的一方,分布的百分比是多少?
在您的情况下,您使用了PDF,您得到了正确的答案。如果您尝试1 - CDF:
>>> 1 - stats.chi2.cdf(3.84, 1)
0.050043521248705147
答案 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值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