web-dev-qa-db-ja.com

Pythonの科学ライブラリを使用してカイ2乗適合度検定を実行するにはどうすればよいですか?

経験的に取得したデータがあると仮定しましょう。

from scipy import stats
size = 10000
x = 10 * stats.expon.rvs(size=size) + 0.2 * np.random.uniform(size=size)

これは指数分布(ノイズあり)であり、カイ2乗適合度(GoF)検定を使用してこれを検証したいと思います。 Python(scipyやstatsmodelsなど)の標準的な科学ライブラリを使用して、手動の手順と仮定を最小限に抑えてこれを行う最も簡単な方法は何ですか?

私は次のモデルを適合させることができます:

param = stats.expon.fit(x)
plt.hist(x, normed=True, color='white', hatch='/')
plt.plot(grid, distr.pdf(np.linspace(0, 100, 10000), *param))

distribution and empirical data plot

コルモゴロフ-スミルノフ検定 を計算するのは非常にエレガントです。

>>> stats.kstest(x, lambda x : stats.expon.cdf(x, *param))
(0.0061000000000000004, 0.85077099515985011)

ただし、カイ2乗検定を計算する良い方法が見つかりません。

statsmodelのカイ2乗GoF関数 がありますが、離散分布を想定しています(指数分布は連続です)。

公式scipy.statsチュートリアル はカスタム分布のケースのみをカバーし、確率は多くの式(npoints、npointsh、nbound、normbound)をいじることによって構築されるため、その方法は私にはよくわかりません。他のディストリビューションの場合。 カイ2乗の例 期待値とDoFがすでに取得されていると仮定します。

また、私はテストを「手動で」実行する方法を探していません すでにここで説明されています が、利用可能なライブラリ関数の1つを適用する方法を知りたいです。

18
metakermit

等しい確率のビンの近似解:

  • 分布のパラメーターを推定します
  • 逆累積分布関数、scipy.stats.distributionの場合はppfを使用して、通常の確率グリッドのビンエッジを取得します。 distribution.ppf(np.linspace(0, 1, n_bins + 1), *args)
  • 次に、np.histogramを使用して、各ビンの観測数をカウントします。

次に、頻度でカイ二乗検定を使用します。

別の方法は、ソートされたデータのパーセンタイルからビンのエッジを見つけ、累積分布関数を使用して実際の確率を見つけることです。

カイ二乗検定の理論では、パラメーターがビニングされたデータの最尤法によって推定されると想定しているため、これは概算にすぎません。また、データに基づくビンエッジの選択が漸近分布に影響を与えるかどうかはわかりません。

私はこれを長い間調べていません。おおよその解決策では不十分な場合は、stats.stackexchangeで質問することをお勧めします。

4
Josef

なぜ指数関数的であることを「検証」する必要があるのですか?統計的検定が必要ですか?最終的に指数関数的ではなく、十分なデータがあればテストは重要であり、テストを使用するロジックをかなり強制的にすることはほぼ保証できます。このCVスレッドを読むのに役立つかもしれません: 正規性の検定は「本質的に役に立たない」ですか? 、またはここでの私の答え: 多くの観察による不均一分散の検定

通常、qq-plotおよび/またはpp-plotを使用することをお勧めします(分布の裾または中央の適合について懸念があるかどうかに応じて、ここで私の答えを参照してください: PP-plots vs. QQ -プロット )。 Python SciPyでqq-plotsを作成する方法に関する情報はこのSOスレッド: SciPyを使用した分位数-分位数プロット