2

ポアソン分布のアプリケーションに関する最近のブログ投稿を読んだ後、Pythonの「scipy.stats」モジュールとExcel/LibreOfficeの「POISSON」および「CHITEST」関数を使用してその結果を再現してみました。

記事に示されている期待値については、単に次のものを使用しました。

import scipy.stats
for i in range(8):
    print(scipy.stats.poisson.pmf(i, 2)*31)

これにより、ブログ投稿に示されているテーブルが再現されます。また、セルA1、A2、...、A8に0〜7の値を持つ最初の列Aと、単純な数式'= POISSON()を使用して、LibreOffice内からテーブルを再作成しました。 A1、2、0)*31'は列Bの最初の8行で繰り返されます。

これまでのところ良好です-カイ2乗p検定値について:

LibreOfficeの下で、セルC1〜C8の観測値を書き留め、「= CHITEST(C1:C8、B1:B8)」を使用して、記事で報告された0.18のp値を再現しました。ただし、scipy.statsでは、この値を再現できないようです。

import numpy as np
import scipy.stats

obs = [4, 10, 7, 5, 4, 0, 0, 1]
exp = [scipy.stats.poisson.pmf(i, 2)*31 for i in range(8)]

# we only estimated one variable (the rate of 2 killings per year via 62/31) 
# so dof will be N-1-estimates
estimates = 1
print(scipy.stats.chisquare(np.array(obs), np.array(exp), ddof=len(obs)-1-estimates))
# (10.112318133864241, 0.0014728159441179519)
# the p-test value reported is 0.00147, not 0.18...
#
# Maybe I need to aggregate categories with observations less than 5 
# (as suggested in many textbooks of statistics for chi-squared tests)?
observedAggregateLessThan5 = [14, 7, 5, 5]
expectedAggregateLessThan5 = [exp[0]+exp[1], exp[2], exp[3], sum(exp[4:])]
print(scipy.stats.chisquare(np.array(observedAggregateLessThan5), np.array(expectedAggregateLessThan5), ddof=len(observedAggregateLessThan5)-1-estimates))
# (0.53561749342466913, 0.46425467595930309)
# Again the p-test value computed is not 0.18, it is 0.46...

私は何が間違っているのですか?

4

1 に答える 1

5

ddof引数を正しく 使用していません。デフォルトの自由度に加える変更ddofです。デフォルトは長さより1つ短いです。したがって、指定する必要はまったくありません。ddof

In [21]: obs
Out[21]: [4, 10, 7, 5, 4, 0, 0, 1]

In [22]: exp
Out[22]: 
[4.1953937803349941,
 8.3907875606699882,
 8.3907875606699882,
 5.5938583737799901,
 2.796929186889995,
 1.1187716747559984,
 0.37292389158533251,
 0.10654968331009501]

In [23]: chisquare(obs, f_exp=array(exp))
Out[23]: (10.112318133864241, 0.1822973566091409)
于 2012-12-26T19:10:46.300 に答える