2つのデータセットが互いに近いかどうかを確認する


7

次の3つのデータセットがあります。

data_a=[0.21,0.24,0.36,0.56,0.67,0.72,0.74,0.83,0.84,0.87,0.91,0.94,0.97]
data_b=[0.13,0.21,0.27,0.34,0.36,0.45,0.49,0.65,0.66,0.90]
data_c=[0.14,0.18,0.19,0.33,0.45,0.47,0.55,0.75,0.78,0.82]

data_aは実際のデータで、他の2つはシミュレーションされたデータです。ここでは、data_bまたはdata_cのいずれがdata_aに最も近いか、または似ているかを確認しようとしています。現在、私は視覚的にks_2sampテスト(python)でそれを行っています。

視覚的に

実際のデータの累積分布関数とシミュレーションデータの累積分布関数をグラフにして、どれが最も近いかを視覚的に確認しようとしました。

data_aとdata_bの累積分布関数

上記はdata_aのcdfとdata_bのcdfです。 ここに画像の説明を入力してください

上記はdata_aのcdfとdata_cのcdfです。

したがって、それを視覚的に見ると、data_cはdata_aよりdata_aに近いと言えますが、それでも正確ではありません。

KSテスト

2番目の方法はKSテストで、data_aをdata_bで、data_aをdata_cでテストしました。

>>> stats.ks_2samp(data_a,data_b)
Ks_2sampResult(statistic=0.5923076923076923, pvalue=0.02134674813035231)
>>> stats.ks_2samp(data_a,data_c)
Ks_2sampResult(statistic=0.4692307692307692, pvalue=0.11575018162481227)

上記から、data_aをdata_cでテストした場合、統計値が低いことがわかります。したがって、data_cはdata_bよりもdata_aに近いはずです。仮説検定として考えるのは適切でなく、得られたp値を使用するのは適切ではないので、p値を考慮しませんでした。この検定は、帰無仮説が事前に決定されて設計されているためです。

だから私のここでの質問は、私がこれを正しくやっているのなら、それを行う他のより良い方法があるのか​​ということです??? ありがとうございました


1
それらがデータのCDFプロットであると確信していますか?そのデータの経験的CDFプロットは次のとおりです。いくつかの標準的なx軸にy軸の値をプロットしているようです。変数の観測値またはCDF上のポイントですか?
エドモンド

@Fatemehhhこんにちは私はこれら2つのプロットを1つのプロットにプロットしていません。実際のデータセットと比較して、実際のデータセットに最も近いものを見つける必要がある他のデータセットが何百もあるからです。基本的に私は異なる値で異なるシミュレートされたデータセットを生成しているパラメーターを近似しようとしています、そしてシミュレートされたデータセットが実際のデータセットに最も近い場合、正しいパラメーターがあります!
Kartikeya Sharma

@Edmund正しいと思います。これらの値は変数の観測値であり、標準のx軸上でy軸上に値をプロットしています。x_points=np.asarray(list(range(0,len(data_a)))) >>> x_points=x_points/len(data_a) >>> plt.plot(x_points,data_a) >>> x_points=np.asarray(list(range(0,len(data_b)))) >>> x_points=np.asarray(list(range(0,len(data_c)))) >>> x_points=x_points/len(data_c) >>> plt.plot(x_points,data_c) これがコードです。しかし、私の質問は、2つのデータセットの間の近さをどのように見つけることができるかです
Kartikeya Sharma

2
分布を観測データに当てはめる方が簡単ではないでしょうか?パラメータの推測、結果のシミュレーション、類似性のテストを行うことは、少し複雑で計算コストがかかるようです。
エドモンド

1
これはXY問題によく似ています。問題の解決策のこの部分ではなく、解決しようとしている問題を共有してください。
エドモンド

回答:


5

分布間で最も低いカルバック・ライブラー分岐を見つけることにより、情報理論アプローチをとることができます。SciPyのエントロピー関数にはKL発散オプションがあります

>>> from scipy.stats import entropy

>>> p = [0.21,0.24,0.36,0.56,0.67,0.72,0.74,0.83,0.84,0.87] # Data removed to make equal sizes: [0.91,0.94,0.97]
>>> q_1 = [0.13,0.21,0.27,0.34,0.36,0.45,0.49,0.65,0.66,0.90]
>>> print(entropy(p, q_1)) 
0.019822015024454846

>>> q_2 =[0.14,0.18,0.19,0.33,0.45,0.47,0.55,0.75,0.78,0.82]
>>> print(entropy(p, q_2))
0.01737229446663193

2番目のシミュレーションされた分布は、最初のシミュレーションされた分布よりも実際の分布に近くなります。

推論に興味がある場合は、多くのシミュレーションを実行してp値を計算できます。そのプロセスは、順列テストのバリエーションです。


回答ありがとうございますが、実際の配布からデータを削除する理由は何ですか。私はscipyメソッドが等しいデータセットでのみ機能することを理解していますが、データのどの要素を削除する必要がありますか?それはなぜですか?ここで、最後のものを削除しました。また、等しくないデータセットで機能させる方法はありませんか?
Kartikeya Sharma

3
コードサンプルを機能させるために、データを任意に削除しました。それが私のプロジェクトだった場合、実際のデータは削除しません。実際のデータと同じサイズになるようにデータをシミュレートします。等しいサイズのデータ​​を生成するため、等しくないデータセットを処理する必要はありません。これはあなたのプロジェクトなので、SciPyのKL分岐方法を使用することを選択した場合は、削除するデータを選択できます。
ブライアンスピアリング

2

アースムーバーの距離(つまり、Wasserstein-1距離)を使用することを検討してください。これは、KLダイバージェンスと同様に、ポイントのセット間の「距離」(またはそれらによって引き起こされる経験的分布)を計算するために使用できます。このライブラリだけでなく、scipyにもメソッドがあります

いくつかのメモ:

  • 各セットに同じ数のポイントを設定する必要はありません(EMDでは質量を「分割」できます)。
  • KLダイバージェンスに対する利点は、分布が同一のサポートを持たない場合にKLDが未定義または無限になる可能性があることです(ただし、ジェンセンシャノンダイバージェンスを使用するとこれが軽減されます)。さらに、エントロピーの推定は難しいことが多く、パラメーターなしではない(通常はビニングまたはKDEが必要)一方で、入力データポイントでEMD最適化を直接解くことができます。
  • 単純な統計(たとえば、平均と共分散、または基準の比較)に対する利点は、情報を失う傾向があることです。たとえば、最初の2つのモーメントを一致させても、3番目のモーメントが強制的に一致することはありません。または、2つのデータセットは非常に異なっていても同じノルムを持つことができます(ポイントの場合、同じ半径の超球上のすべてのポイントは同じノルムを持っています)。対照的に、EMDは1つのセットのすべてのポイントと他のセットのすべてのポイントの関係を考慮する必要があります。nn
  • 私はKSテストを完全に合理的に使用することを検討しています。この投稿も参照してください。注意点の1つは、その上限の使用が少し極端であることです。たとえば、ある分布はある時点で大きなCDF偏差を持ち、残りの時間に非常に近いです。別の分布は、いくつかの小さなに対して何度も逸脱します統計では前者が優先されます。それが理にかなっているかどうかはあなた次第です。δδϵϵ

1

データを削除してはならないので、origin(l2 norm)からベクトルノルムを使用できます

与えられたdata_a、data_b、data_cは配列です。

 import numpy as np    
 import pandas as pd
 from numpy.linalg import norm
 l2_a=norm(data_a)
 l2_b=norm(data_b)
 l2_c=norm(data_c)
 print(l2_a,l2_b,l2_c)

出力:2.619885493680974 1.5779100101083077 1.6631897065578538。

l2_a、l2_cの値が近いほど、data_aとdata_cは互いに近くなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.