2013-07-27 9 views
5

このモジュール(およびScipyドキュメント)についての既存の記事を読んだことがありますが、Scipyのkstestモジュールを使って良さを確認する方法はまだ分かりませんデータセットと呼び出し可能な関数がある場合にフィットテストを実行します。適合性テストのためのScipyのstats.kstestモジュールの使用

標準scipy.statsディストリビューションの一つではないので、私は同じようなものを使用して、それを呼び出すことはできませんに対して、私は私のデータをテストしたいPDF:

MYDATAはnumpyの配列がある
kstest(mydata,'norm') 

。代わりに、私は次のようなことをしたい:

kstest(mydata,myfunc) 

ここで 'myfunc'は呼び出し可能な関数です。これはうまくいきません。なぜなら、kstestが 'myfunc'を使って対応する理論周波数を生成するために 'mydata'配列の横座標を知る方法がないからです。 'mydata'の周波数がランダム変数の値に対応すると仮定すると、配列 '横座標'になります。それで統計情報が有効かどうかわかりませんが、私はstats.ks_2samp:

ks_2samp(mydata,myfunc(abscissa)) 

を使用することができます。 (Sidenote:kstestとks_2sampは周波数配列が1に正規化されることを期待していますか、絶対周波数を必要としていますか?)

いずれの場合でも、1サンプルKS検定は、私は、kstestを使って直接行う方法があると仮定しなければなりません。これどうやってやるの?

答えて

9

いくつかの例では、scipy.stats.kstestの使い方について説明しています。最初にいくつかのテストデータを設定します。我々は変位値の配列を受け取り、累積密度関数の対応する値を返す関数f(x)を必要とするこれらのデータにkstestを実行する

>>> data = scipy.stats.norm.rvs(loc=5, scale=10, size=(1000,)) 

:通常は平均5と標準偏差10と一緒に配布。私たちが行うことができscipy.stats.normcdf機能再利用する場合:

>>> scipy.stats.kstest(data, lambda x: scipy.stats.norm.cdf(x, loc=5, scale=10)) 
(0.019340993719575206, 0.84853828416694665) 

を上記通常より便利な形で実行されます:

>>> scipy.stats.kstest(data, 'norm', args=(5, 10)) 
(0.019340993719575206, 0.84853828416694665) 

私たちは一様に分散されたデータを持っている場合は、構築することは容易です手でCDF:ks_2samp用として

>>> data = np.random.rand(1000) 
>>> scipy.stats.kstest(data, lambda x: x) 
(0.019145675289412523, 0.85699937276355065) 
+0

ありがとう、素晴らしい作品です!何かが私を混乱させる。あなたの例に従えば、私はD = 0.08、p = 1.6e-14になります。私の元の質問では、ks_2sampを使用するための私の 'ハック'解法を挙げました。ヒストグラムモジュールを使ってデータの観測頻度を計算し、同じビンサイズの理論周波数を計算し、これらの2つの配列でks_2sampを使用しました。それは私にD = 0.74、p = 0.017を与えた。このように劇的に異なる結果が出るのはちょっと奇妙なようです。あなたは2つの計算を近づけるべきだと思いますか? –

+0

私は自分自身を混乱させるかもしれません:ks_2sampは2つのデータセットの経験的なcdfを取るのでしょうか? –

+0

'ks_2samp'は2つのデータセット自体を取ります。あなたがうまくやっているのであれば、 'ks_2samp'メソッドが' kstest'よりも高い 'p-values'をもたらすことは合理的だと思います。あなたが見ている違いが大きすぎるかどうかは分かりません... – Jaime

1

、それは両方のサンプルが同じ確率分布からサンプリングされた帰無仮説をテストします。あなたは、たとえば行うことができ

>>> ks_2samp(x, y) 
(0.022999999999999909, 0.95189016804849658) 

最初の値は、検定統計量であり、第2の値は、p値であり、X、Yはnumpy.arrayの2つのインスタンスである

>>> from scipy.stats import ks_2samp 
>>> import numpy as np 
>>> 

。 p値が95未満(5%の有意水準)の場合、これは、2つのサンプル分布が同一であることをNull-Hypotheseは拒否できないことを意味します。

関連する問題