私が欲しいものを達成するための統計的に健全な方法が何であるかはよく分かりませんが、基本的に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の線からのわずかな偏差さえも見ることができます。
2つのプロットは、私が何を見ることができない、互いの上にちょうどいいです:ちょうど2つのヒストグラムをプロットするとの問題は、彼らがこのように見えるということです。
私が知りたいことは、ビンラベルを維持しながら、これら2つのヒストグラムをどのように比較するかです。です。私は簡単に散布図としてお互いに対して2をプロットすることができ、それはビン周波数でインデックス化されてしまう:
私が本当に欲しい、ちょうど2つのヒストグラムを比較するために、またはようにすることです違いのQQプロットが、私はこれを行う統計的に健全な良い方法を考え出すことができません。私は、1つのデータセットとビルドされた分布ではなく、2つのデータセットを使ってQ-Qプロットを作成する方法を見つけることができず、互いに長さが異なる2つの分布をプロットする方法を見つけることができません。
は、参考のため、ここではそのプロットを作成するに入った2つのヒストグラムである、あなたは彼らが非常に似ていることがわかります。私はこれを行うための良い方法がなければなら知っている
を、ので、それは非常に明白なようですが、私はこの種のものには新しく、scipy、pandas、statsmodelsにも比較的新しいです。
私は意図的にここで配布例を提供していませんでした。なぜなら、非正常に配布され、私がしようとしている配列の最小限のセットを作る方法がわからないからです。これは、2つのオーバーラップする等しくない長さの配列に対してこれを行うことができる点です。
私が知りたいことは、統計的に健全な方法でこの問題にPythonでアプローチする正しい/最善の方法は何ですか? statsmodelsやscipy Q-Qプロットに使用できる置換されたデータから分布を作成する方法はありますか?すでに2つのヒストグラムを視覚的に比較する方法はありますか?私が知らない確率プロットを作る方法はありますか?
編集:しようとして累積し、手動QQプロット@ user333700の答えに
おかげで、私は、データの手動QQプロット、また、累積確率プロットを作成する方法を考え出しました。私は重複最小/最大でデータを使用してプロットが、以下のディストリビューションを作成しました:
QQプロット:
はそう単純なデータで本当によく働く
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()
バック(二つの分布は、長さを除いてあらゆる方法で非常に似ています)私の実際のスキューデータへ行くと1対1の行を追加し、私はそれらの2のためにこれを取得:
したがって、どちらもうまくいきます。累積確率プロットは、データに大きな違いはないことを明確に示していますが、QQプロットはテールに小さな違いがあることを示しています。
小さな変更:ヒストグラムは、同じ長さのビン(元の値の点で、長さ)を持っているので、PP-プロットであります依然として等間隔ではない。 pp-plotに使用するのは、同じ重量ビンです。例えば、xのk回目の観測ごとに定義されたビン境界を使用し、両方のビンをこれらのビンと組み合わせてプロットします。この場合、x累積ヒストグラムの周波数は[0,1]で等間隔になります。 – user333700
@ user333700:わかりますか?私は、この文脈では、あなたが等しい重量ビンを意味するものに従わないのは怖いです。どのようにすればいいのか疑似コードの例を教えてください。 –
確率プロットでは、ポイントのx座標は各ビンの累積確率に対応します。ビンは異なる周波数またはカウントを有するので、点のx座標は、ほとんどの確率が存在する終点に向かって移動する。中央値の下に2つのみのビンがあります。ビンがx変数に等しい周波数を持つようにビン境界を選択すると、プロットポイントはx軸上で等間隔になります。'boundaries = sorted(x)[:: k]'とエンドポイントの調整のようなものです。 「等しい重み」では、xの各ビンで等しい頻度を意味しました。 – user333700