web-dev-qa-db-ja.com

Pythonのカイ二乗検定統計量からのP値

1自由度のカイ二乗として分布する検定統計量を計算し、これがPythonを使用してどのP値に対応するかを調べたいと思います。

私はpython and maths/stats newbieなので、ここで欲しいのはSciPyからのchi2分布の確率密度関数であると思います。

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

ただし、数学を知っているがpythonではない)同僚と話してグーグルで話している人は、0.05であるべきだと言っています。

何か案は?乾杯、デイビー

31
Davy Kavanagh

ここでクイックリフレッシャー:

確率密度関数:ポイント値と考えてください。与えられた点での確率はどれくらいの密度ですか?

累積分布関数:これは、特定の点までの関数の確率の質量です。分布の何パーセントがこの点の片側にありますか?

あなたの場合、あなたは正しい回答を得たPDFを取りました。 1-CDFを試す場合:

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

[〜#〜] pdf [〜#〜][〜#〜] cdf [〜#〜]

43
learner

カイ二乗和と自由度が与えられた帰無仮説の確率を計算するには、chisqprobを呼び出すこともできます。

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

注意:

chisqprob は非推奨です! stats.chisqprobは、scipy 0.17.0で廃止されました。代わりに stats.distributions.chi2.sf を使用してください

20
jb.

Stats.chisqprob()および1-stats.chi2.cdf()は小さなカイ2乗値に匹敵するように見えますが、大きなカイ2乗値には前者が好ましいです。後者は、マシンイプシロンよりも小さいp値を提供できず、マシンイプシロンに近い非常に不正確な回答を提供します。他の人が示すように、2つの方法で小さなカイ2乗値の比較可能な値が得られます。

>>>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()は、より大きな範囲のカイ2乗値に対して正確な結果を提供しますが、アンダーフローするまで、ゼロよりも大きい最小フロートとほぼ同じ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()を使用して、高精度のカイ2乗値を取得できるようになりました。例:

>>>from scipy.stats.distributions import chi2
>>>chi2.sf(3.84,1)
0.050043521248705189
>>>chi2.sf(1424,1)
1.2799986253099803e-311
17

あなたがするつもりでした:

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

他のソリューションのいくつかは非推奨です。 _scipy.stats.chi2_ Survival Functionを使用します。 1 - cdf(chi_statistic, df)と同じです

例:

_from scipy.stats import chi2
p_value = chi2.sf(chi_statistic, df)
_
3
SARose

数学を理解したい場合、サンプルのp値x(固定)は

P [P(X)<= P(x)] = P [m(X)> = m(x)] = 1-G(m(x)^ 2)

どこ、

  • Pは、既知の共分散(cov)と平均をもつ(たとえばk変量)正規分布の確率です。
  • Xはその正規分布からのランダム変数です。
  • m(x)はマハラノビス距離= sqrt(<cov ^ {-1}(x-mean)、x-mean>。1-dでは、これはzスコアの絶対値にすぎないことに注意してください。
  • Gは、自由度がkのchi ^ 2分布のCDFです。

したがって、固定観測値xのp値を計算する場合、m(x)(一般化されたzスコア)、および1-G(m(x)^ 2)。

たとえば、xが単変量(k = 1)正規分布からサンプリングされ、zスコア= 2(平均から2標準偏差)の場合、p値は約.046であることがよく知られています(aを参照) Zスコアテーブル)

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