2016-05-06 12 views
0

同じDGPから来るデータの分布の平等を拒否:KSおよびカイ二乗検定は、私は次のコードを使用して2つの分布を生成

rand_num1 = 2*np.random.randn(10000) + 1 
rand_num2 = 2*np.random.randn(10000) + 1 
stats.ks_2samp(rand_num1, rand_num2) 

私の質問は、なぜこれらの両方の分布は同じベースであることをテストしていないですkstestとchisquareテストで。

私は私が手2つのディストリビューションでkstest実行します。

Ks_2sampResult(statistic=0.019899999999999973, pvalue=0.037606196570126725) 

二つの分布が統計的に異なっていることを意味します。

count1, bins = np.histogram(rand_num1, bins = 100) 
count2, _ = np.histogram(rand_num2, bins = bins) 
plt.plot(np.cumsum(count1), 'g-') 
plt.plot(np.cumsum(count2), 'b.') 

This is how the CDF of two distributions looks:私は二つの分布のCDFをプロットするために、次のコードを使用します。

私は次の取得カイ二乗検定を実行すると:CDFは同じに見えるし、なぜデータが同じ分布から来ているにもかかわらず

  1. stats.chisquare(count1, count2) # Gives an nan output 
    stats.chisquare(count1+1, count2+1) # Outputs "Power_divergenceResult(statistic=180.59294741316694, pvalue=1.0484033143507713e-06)" 
    

    を、私は以下の3つの質問を持っていますkstestとchisquareは両方とも同じ分布仮説を棄却するか?ここに欠けているという根本的な前提がありますか?

  2. いくつかのカウントは0なので、最初のchisquare()はエラーを返します。正確な見積もりを得るためにすべてのカウントに0以外の数字を追加するだけでよいのですか?
  3. 非標準分布に対してテストするkstestがありますか?たとえば、平均が0でなく、std!= 1である法線がありますか?
+0

奇妙な、本当に。私はちょうどK-Sの例を実行し、一貫して '(statistic = 0.011、pvalue = 0.57)'のような値を得ました。 'stats.ks_2samp(rand_num1、rand_num1)'(num2の場合も同様)の値はどれくらいですか?出力は '(0,1)'でなければなりません。 –

+0

私は 'np.random.seed(12345)'を前に置いて、stats.ks_2samp(rand_num1、rand_num1)のPython 3.5.1 x64 Anaconda –

+0

の '(statistic = 0.010、pvalue = 0.61)'でKSを返します。 p値= 1.0(期待値)を得る。あなたは正しいです - ほとんどの場合、私は有意でないp値を得ます。 私は特に私が投稿したケースに関係しています - 配布物のCDFは非常に似ていて、kstestとchisquareの両方のテストが異なっていることを暗示しています。 kstestが同じ(p-val> 0.5)と言っても、chisquareテストはそれらが同じであると拒否します。 – StreetHawk

答えて

0

私の謙虚な意見では、CDFは見るべき良い曲線ではありません。これは、それが不可欠であるという事実のために、多くの細部を隠すでしょう。基本的に、下の方の分布の外れ値は、上の方の別の外れ値によって補われます。

[OK]をクリックして、K-S結果の分布を見てみましょう。私はテストを100回実行し、統計値とp値をプロットし、予想通り、(小さなp、大きな統計)ポイントがあることがあります。

import matplotlib.pyplot as plt 

import numpy as np 
from scipy import stats 

np.random.seed(12345) 

x = [] 
y = [] 

for k in range(0, 100): 
    rand_num1 = 2.0*np.random.randn(10000) + 1.0 
    rand_num2 = 2.0*np.random.randn(10000) + 1.0 

    q = stats.ks_2samp(rand_num1, rand_num2) 

    x.append(q.statistic) 
    y.append(q.pvalue) 

plt.scatter(x, y, alpha=0.1) 
plt.show() 

グラフ

enter image description here

UPDATE実際に

私がテストを実行し、私のプロットに示されるように、私が望む私のメトリックの制御分布対テストを参照してください場合彼らが同じであると言うことができるように - これらのテストの周りにこれらのディストリビューションがどれほど近いかを教えてくれる統計やパラメータはありますか?

もちろん、このようなテストの1つを使用しています。 K-Sは最も一般的ですが最も弱いテストです。また、どのテストでも同じルーチンから意図的にサンプルを抽出しても、そのサンプルが異なるディストリビューションから来ていると言うテストがいつもあります。それはちょうどもののNATUREです あなたはyesまたはnoを得るでしょうが、それほど多くはありません。イラストのためにもう一度グラフに を見てください。

chi2での演習については、最初からchi2を使用することに非常に懐疑的です。私にとって、2つのサンプルについて決定を下す問題を考えると、使用するテストは明示的に対称でなければなりません。 K-Sは大丈夫ですが、chi2の定義を見ると、対称ではありません。 あなたのコード

count1, bins = np.histogram(rand_num1, bins = 40, range=(-2.,2.)) 
count2, _ = np.histogram(rand_num2, bins = bins, range=(-2.,2.)) 

q = stats.chisquare(count2, count1) 
print(q) 

q = stats.chisquare(count1, count2) 
print(q) 

の簡単な修正は基本的に、それはあなたが、私見を(1,2)を実行しますが、あなたは良いされていない、(2,1)を実行した場合失敗した場合、テストは合格可能性があることを意味

Power_divergenceResult(statistic=87.645335824746468, pvalue=1.3298580128472864e-05) 
Power_divergenceResult(statistic=77.582358201839526, pvalue=0.00023275129585256563) 

のようなものを生成します。 Chi2はすぐにあなたが知られている分布曲線から期待値に対してテストとして私と一緒にokです - ここでは、テストの非対称性が、センス

になり、私はライン

q = stats.anderson_ksamp([np.sort(rand_num1), np.sort(rand_num2)]) 
print(q) 

沿っアンダーソン - ダーリンテストを試してアドバイス。しかし、それを覚えているだろうKSと同じですが、いくつかのサンプルは、同じ基本ディストリビューションから引き出されてもテストに合格しないことがあります - これは獣の性質に過ぎません。

UPDATE:一部の読み物

https://stats.stackexchange.com/questions/187016/scipy-chisquare-applied-on-continuous-data

+0

これを共有してくれてありがとう。私は、拒否(小さなp値)がタイプ1のエラーによるものだと言って最初のqnに答えていると思います。 – StreetHawk

+0

これを共有していただきありがとうございます。私は、拒否(小さなp値)がタイプ1のエラーによるものだと言って最初のqnに答えていると思います。 実際に私がテストを実行し、私のプロットに示されているように私のメトリックのテスト対コントロール分布を見ると、彼らは同じであると言いたいと思うでしょう - これらのテストの周りにはこれらの分布はどれくらい近いのですか? 最後の2つの質問の考えは? – StreetHawk

+0

@StreetHawk更新を参照してください –

関連する問題