2017-04-07 12 views
3

私が欲しいものを達成するための統計的に健全な方法が何であるかはよく分かりませんが、基本的にp値の分布を取って比較しようとしています元のデータを置換することによって作成されたp値のはるかに大きな分布です。私は小さなp値で作業しているので、実際にはp値のlog10を比較しています。不等長の2つの分布のPython QQとPPプロット

私は、同じ値であるが不等な長さの2つの配列を比較する一般的な方法を理解しようとしています。私が本当に欲しいのは、scipy.qqplot(dataset1, dataset2)のようなものですが、それは存在しません。Q-Qプロットはあなたの流通を既定の流通と比較するだけです(この質問はRについても質問されています:https://stats.stackexchange.com/questions/12392/how-to-compare-two-datasets-with-q-q-plot-using-ggplot2)。

これは、基本的に2つのヒストグラムを比較することになります。私は、各ディストリビューションのために、まったく同じビンを強制的にnp.linspaceを使用することができます。

bins = 100 
mx = max(np.max(vector1), np.max(vector2)) 
mn = min(np.min(vector2), np.max(vector2)) 
boundaries = np.linspace(mn, mx, bins, endpoint=True) 
labels = [(boundaries[i]+boundaries[i+1])/2 for i in range(len(boundaries)-1)] 

私は、簡単に元のベクトルの長さで重み付け二つのヒストグラムを作るためにこれらの境界とラベルを使用することができます。一番簡単なのは、この質問のように、いくつかのビンを使用して、同じ軸上にヒストグラムとしてプロットすることです。

しかし、私は本当にQQプロットのようなものがほしいと思っています。 1対1の線からのわずかな偏差さえも見ることができます。

histogram_example

2つのプロットは、私が何を見ることができない、互いの上にちょうどいいです:ちょうど2つのヒストグラムをプロットするとの問題は、彼らがこのように見えるということです。

私が知りたいことは、ビンラベルを維持しながら、これら2つのヒストグラムをどのように比較するかです。です。私は簡単に散布図としてお互いに対して2をプロットすることができ、それはビン周波数でインデックス化されてしまう:

definitely wrong

私が本当に欲しい、ちょうど2つのヒストグラムを比較するために、またはようにすることです違いのQQプロットが、私はこれを行う統計的に健全な良い方法を考え出すことができません。私は、1つのデータセットとビルドされた分布ではなく、2つのデータセットを使ってQ-Qプロットを作成する方法を見つけることができず、互いに長さが異なる2つの分布をプロットする方法を見つけることができません。

は、参考のため、ここではそのプロットを作成するに入った2つのヒストグラムである、あなたは彼らが非常に似ていることがわかります。私はこれを行うための良い方法がなければなら知っている

histograms

を、ので、それは非常に明白なようですが、私はこの種のものには新しく、scipy、pandas、statsmodelsにも比較的新しいです。

私は意図的にここで配布例を提供していませんでした。なぜなら、非正常に配布され、私がしようとしている配列の最小限のセットを作る方法がわからないからです。これは、2つのオーバーラップする等しくない長さの配列に対してこれを行うことができる点です。

私が知りたいことは、統計的に健全な方法でこの問題にPythonでアプローチする正しい/最善の方法は何ですか? statsmodelsやscipy Q-Qプロットに使用できる置換されたデータから分布を作成する方法はありますか?すでに2つのヒストグラムを視覚的に比較する方法はありますか?私が知らない確率プロットを作る方法はありますか?


編集:しようとして累積し、手動QQプロット@ user333700の答えに

おかげで、私は、データの手動QQプロット、また、累積確率プロットを作成する方法を考え出しました。私は重複最小/最大でデータを使用してプロットが、以下のディストリビューションを作成しました:

manufactured distributions

QQプロット:

qqplot

はそう単純なデータで本当によく働く

q = np.linspace(0, 100, 101) 
fig, ax = plt.subplots() 
ax.scatter(np.percentile(ytest, q), np.percentile(xtest, q)) 
、累積プロットも同様です。

# Pick bins 
x = ytest 
y = xtest 
boundaries = sorted(x)[::round(len(x)/bins)+1] 
labels = [(boundaries[i]+boundaries[i+1])/2 for i in range(len(boundaries)-1)] 

# Bin two series into equal bins 
xb = pd.cut(x, bins=boundaries, labels=labels) 
yb = pd.cut(y, bins=boundaries, labels=labels) 

# Get value counts for each bin and sort by bin 
xhist = xb.value_counts().sort_index(ascending=True)/len(xb) 
yhist = yb.value_counts().sort_index(ascending=True)/len(yb) 

# Make cumulative 
for ser in [xhist, yhist]: 
    ttl = 0 
    for idx, val in ser.iteritems(): 
     ttl += val 
     ser.loc[idx] = ttl 

# Plot it 
fig, ax = plt.subplots(figsize=(6,6)) 
ax.scatter(xhist, yhist) 
plt.show() 

cumulative plot

バック(二つの分布は、長さを除いてあらゆる方法で非常に似ています)私の実際のスキューデータへ行くと1対1の行を追加し、私はそれらの2のためにこれを取得:

plots with real data

したがって、どちらもうまくいきます。累積確率プロットは、データに大きな違いはないことを明確に示していますが、QQプロットはテールに小さな違いがあることを示しています。

+0

小さな変更:ヒストグラムは、同じ長さのビン(元の値の点で、長さ)を持っているので、PP-プロットであります依然として等間隔ではない。 pp-plotに使用するのは、同じ重量ビンです。例えば、xのk回目の観測ごとに定義されたビン境界を使用し、両方のビンをこれらのビンと組み合わせてプロットします。この場合、x累積ヒストグラムの周波数は[0,1]で等間隔になります。 – user333700

+0

@ user333700:わかりますか?私は、この文脈では、あなたが等しい重量ビンを意味するものに従わないのは怖いです。どのようにすればいいのか疑似コードの例を教えてください。 –

+1

確率プロットでは、ポイントのx座標は各ビンの累積確率に対応します。ビンは異なる周波数またはカウントを有するので、点のx座標は、ほとんどの確率が存在する終点に向かって移動する。中央値の下に2つのみのビンがあります。ビンがx変数に等しい周波数を持つようにビン境界を選択すると、プロットポイントはx軸上で等間隔になります。'boundaries = sorted(x)[:: k]'とエンドポイントの調整のようなものです。 「等しい重み」では、xの各ビンで等しい頻度を意味しました。 – user333700

答えて

2

統計的なテストに関して、scipyは、連続変数の2つのサンプルKolmogorov-Smirnov検定を持っています。ビニングされたヒストグラムデータは、カイ二乗検定で使用することができます。 scipy.statsにはkサンプルのAnderson-Darlingテストもあります。プロットする

2つのヒストグラムの確率プロットの等価、すなわちビンの境界に対応する各軸上の累積確率と、二つのサンプルの累積頻度をプロットすることであろう。

statsmodelsには2つのサンプル比較のqq-plotがありますが、現在サンプルサイズは同じであると仮定しています。標本サイズが異なる場合、同じ確率に対して分位数を計算する必要があります。 https://github.com/statsmodels/statsmodels/issues/2896 https://github.com/statsmodels/statsmodels/pull/3169 (私はこれの状態が何であるかを覚えていない。)PP-プロットの

+0

ありがとう@ user333700。お勧めのテストは素晴らしいです。私は二変量累積プロットを行う方法を正確にはわかりません。私はちょうど本当に簡単なバージョンをやってみました、そして、私はチャートの右上に集中している私のポイントの大部分で終わった。これを賢明にするために必要な特別な魔法がありますか? –

+0

また、私は実際に、なぜ境界線の代わりにクォンタイルを使用するのか理解するのに苦労しています...もし2つのディストリビューションが異なっていれば、分かりにくいですか?もしquantileの比較が行くならば、pandas.qcutを使って2つの等しい長さのquantile配列を作成し、それを散布図としてお互いにプロットすることはできません。それともQ-Qプロットが実際に何であるのでしょうか? –

+1

私はqcutを使ったことはありませんが、値の代わりにカテゴリを返すようです。各軸のq = np.linspace(0、100、101)に対するnp.percentiles(x、q)、np.percentiles(y、q)のプロットは、qqプロットで有効です。実際のQQPlotは固定グリッドの代わりにデータポイントに対しても同じことを行います。 – user333700

関連する問題