from scipy import stats
stats.chi2.pdf(3.84 , 1)
0.029846
然而,一些谷歌搜索和与一些了解数学但不了解Python的同事交流后,他们说应该是0.05。
有什么想法吗? 谢谢, Davy
from scipy import stats
stats.chi2.pdf(3.84 , 1)
0.029846
然而,一些谷歌搜索和与一些了解数学但不了解Python的同事交流后,他们说应该是0.05。
有什么想法吗? 谢谢, Davy
更新:请注意,从scipy版本0.17.0开始,chisqprob()已被弃用。现在可以通过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
虽然对于小的卡方值,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
已被弃用,http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chisqprob.html#scipy.stats.chisqprob - ZK Zhao要计算给定卡方和和自由度时的零假设概率,您还可以调用chisqprob
:
>>> from scipy.stats import chisqprob
>>> chisqprob(3.84, 1)
0.050043521248705189
注意:
chisqprob已经被弃用!自scipy 0.17.0版本开始,使用stats.distributions.chi2.sf代替stats.chisqprob。
您想执行的操作是:
>>> 1 - stats.chi2.cdf(3.84, 1)
0.050043521248705147
其他一些解决方案已被废弃,请使用scipy.stats.chi2
生存函数,其与1 - cdf(chi_statistic, df)
相同。
示例:
from scipy.stats import chi2
p_value = chi2.sf(chi_statistic, df)
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
如果需要超高精度,当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
由另一位用户(WestCoastProjects)更新使用OP中的值时,我们得到:
np.exp(np.longdouble(r.pchisq(3.84,1, lower_tail=False, log_p=True)[0]))
Out[5]: 0.050043521248705198928
所以这就是你要找的那个0.05。
R
是统计学中的大杀器。 - WestCoastProjects
scipy.stats.chisquare
运行测试,是否能得到所需的结果? - Fred Foox = 3.84; reciprocal(2**.5 * gamma(.5)) * x ** (.5 - 1) * exp(- x / 2)
。 - Fred Foo