Dav*_*agh 32 python statistics scipy chi-squared
我已经计算出一个测试统计量,该统计量被分配为具有1个自由度的卡方,并且想要找出与使用python相对应的P值.
我是一个python和数学/统计新手所以我认为我想要的是来自SciPy的chi2分布的概率denisty函数.但是,当我这样使用时:
from scipy import stats
stats.chi2.pdf(3.84 , 1)
0.029846
Run Code Online (Sandbox Code Playgroud)
然而,一些谷歌搜索和一些知道数学而不是python的同事交谈说它应该是0.05.
有任何想法吗?干杯,戴维
lea*_*ner 44
快速复习:
概率密度函数:将其视为一个点值; 给定点的概率有多密集?
累积分布函数:这是函数达到给定点的概率质量; 在这一点的一方,分布的百分比是多少?
在您的情况下,您获取了PDF,您得到了正确的答案.如果您尝试1 - CDF:
>>> 1 - stats.chi2.cdf(3.84, 1)
0.050043521248705147
Run Code Online (Sandbox Code Playgroud)
jb.*_*jb. 22
为了计算零假设的概率给定chisquared和,你也可以调用自由度chisqprob:
>>> from scipy.stats import chisqprob
>>> chisqprob(3.84, 1)
0.050043521248705189
Run Code Online (Sandbox Code Playgroud)
注意:
chisqprob已被弃用!stats.chisqprob在scipy 0.17.0中弃用; 使用stats.distributions.chi2.sf代替
Chr*_*ert 18
虽然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
Run Code Online (Sandbox Code Playgroud)
使用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
Run Code Online (Sandbox Code Playgroud)
而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
Run Code Online (Sandbox Code Playgroud)
更新:如上所述,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
Run Code Online (Sandbox Code Playgroud)
你的意思是:
>>> 1 - stats.chi2.cdf(3.84, 1)
0.050043521248705147
Run Code Online (Sandbox Code Playgroud)
其他一些解决方案已被弃用。使用scipy.stats.chi2生存功能。这与1 - cdf(chi_statistic, df)
例子:
from scipy.stats import chi2
p_value = chi2.sf(chi_statistic, df)
Run Code Online (Sandbox Code Playgroud)