-1

どうすればscipy.stats.kde.gaussian_kdeandscipy.stats.kstestをコンフォーマルな方法で使用できますか?

たとえば、コードは次のとおりです。

from numpy import inf
import scipy.stat
my_pdf = scipy.stats.kde.gaussian_kde(sample)
scipy.stats.kstest(sample, lambda x: my_pdf.integrate_box_1d(-inf, x))

次の答えが得られます。 (0.5396735893479544, 0.0)

サンプルは明らかにこのサンプルで構築された分布に属しているため、これは正しくありません。

4

1 に答える 1

1

まず、2 つのサンプルが同じ分布に由来する可能性があるかどうかをテストするために使用する適切なテストは、 で実装されている2 サンプル KS テストscipy.stats.ks_2sampです。これは、経験的 CDF を直接比較します。KDE は密度推定であり、CDF を平滑化するため、統計的に言えば、推定を悪化させる不要な作業の束です。

しかし、この問題が発生する理由は、CDF パラメーターの署名が正しくないためです。(source)kstestを呼び出します。ここで、 は並べ替えられたサンプルで、各サンプルの CDF 値を取得します。あなたのコードでは、これは を呼び出すことになりますが、両方の引数をスカラーにする必要があります。署名が間違っています。ほとんどの配列でこれを試した場合、次のエラーでクラッシュします。cdf(vals) valsmy_pdf.integrate_box_1d(-np.inf, samps)integrate_box_1dValueError

>>> my_pdf.integrate_box_1d(-np.inf, samp[:10])
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-38-81d0253a33bf> in <module>()
----> 1 my_pdf.integrate_box_1d(-np.inf, samp[:10])

/Library/Python/2.7/site-packages/scipy-0.12.0.dev_ddd617d_20120725-py2.7-macosx-10.8-x86_64.egg/scipy/stats/kde.pyc in integrate_box_1d(self, low, high)
    311 
    312         normalized_low = ravel((low - self.dataset) / stdev)
--> 313         normalized_high = ravel((high - self.dataset) / stdev)
    314 
    315         value = np.mean(special.ndtr(normalized_high) - \

ValueError: operands could not be broadcast together with shapes (10) (1,1000) 

残念ながら、2 番目の引数が の場合samp、配列が同じ形状であるため、問題なくブロードキャストでき、すべてが地獄に落ちます。おそらくintegrate_box_1d引数の形状をチェックする必要がありますが、これを正しく行う1つの方法を次に示します。

>>> my_cdf = lambda ary: np.array([my_pdf.integrate_box_1d(-np.inf, x) for x in ary])
>>> scipy.stats.kstest(sample, my_cdf)
(0.015597917205996903, 0.96809912578616597)

np.vectorize気が向いたらこちらも使えます。

(しかし、繰り返しますが、おそらく実際には を使用したいと思うでしょうks_2samp。)

于 2013-03-21T21:07:35.470 に答える