わかりました、この答えを大幅に修正しました。データをビニングして各ビンのカウントを比較するよりも、2Dカーネル密度の推定値をあてはめて比較するという元の答えに埋もれていた提案の方がはるかに良い考えだと思います。さらに良いことに、Tarn DuongのR用のksパッケージには、これをパイとして簡単に実行する関数kde.test()があります。
詳細と調整可能な引数については、kde.testのドキュメントを参照してください。しかし、基本的にそれはあなたが望むものをほとんど正確に行います。返されるp値は、同じ分布から生成されたという帰無仮説の下で比較している2つのデータセットを生成する確率です。したがって、p値が高いほど、AとBの間の適合度が高くなります。以下の例を参照してください。 。
# generate some data that at least looks a bit similar
generate <- function(n, displ=1, perturb=1){
BV <- rnorm(n, 1*displ, 0.4*perturb)
UB <- -2*displ + BV + exp(rnorm(n,0,.3*perturb))
data.frame(BV, UB)
}
set.seed(100)
A <- generate(300)
B1 <- generate(500, 0.9, 1.2)
B2 <- generate(100, 1, 1)
AandB <- rbind(A,B1, B2)
AandB$type <- rep(c("A", "B1", "B2"), c(300,500,100))
# plot
p <- ggplot(AandB, aes(x=BV, y=UB)) + facet_grid(~type) +
geom_smooth() + scale_y_reverse() + theme_grey(9)
win.graph(7,3)
p +geom_point(size=.7)
> library(ks)
> kde.test(x1=as.matrix(A), x2=as.matrix(B1))$pvalue
[1] 2.213532e-05
> kde.test(x1=as.matrix(A), x2=as.matrix(B2))$pvalue
[1] 0.5769637
私の元の答えは、他の場所からのリンクがあり、それが意味をなさないためです。
まず、これについては他の方法もあります。
Justelらは、モデル化されたデータの各セットが元のデータにどの程度適合するかをテストするために、あなたのケースで使用できると思われる適合度のコルモゴロフ-スミルノフテストの多変量拡張を提案しました。私はこれの実装を見つけることができませんでした(例えば、Rで)が、おそらく私は十分に一見しませんでした。
または、コピュラを元のデータとモデル化されたデータの各セットの両方に適合させ、それらのモデルを比較することにより、これを行う方法があります。Rや他の場所にこのアプローチの実装がありますが、私はそれらに特に精通していないので、試していません。
しかし、あなたの質問に直接対処するために、あなたが取ったアプローチは合理的なものです。いくつかのポイントが示唆しています。
データセットが見た目よりも大きい場合を除き、100 x 100グリッドではビンが多すぎると思います。直感的には、ビンの精度のために、データの密度が高い場合でも、さまざまなデータのセットが異なるという結論をあなたが持っていることを想像することができます。しかし、これは最終的には判断の問題です。ビンニングに対するさまざまなアプローチを使用して、確かに結果を確認します。
ビニングを実行し、データを(実際には)ビンの数(この場合は10,000)に等しい2つの列と行の数を含む分割表に変換すると、2つの列を比較する標準的な問題が発生します。カウントの。カイ二乗検定または何らかのポアソンモデルのフィッティングのいずれかが機能しますが、あなたが言うように、多数のゼロカウントのために厄介です。通常、これらのモデルのいずれかは、予想されるカウント数の逆数で重み付けされた差の二乗和を最小化することにより適合します。これがゼロに近づくと、問題が発生する可能性があります。
編集-この答えの残りの部分は、今では適切なアプローチではないと信じています。
このような状況では、Fisherの正確なテストは役に立たないか、適切ではないと思うので、クロスタブの行の限界合計は固定されていません。それはもっともらしい答えを与えるだろうが、その使用を実験デザインからの元の派生と調和させることは難しいと思う。コメントとフォローアップの質問が意味をなすように、元の回答をここに残します。さらに、OPのデータをビニングし、平均絶対差または二乗差に基づいたテストでビンを比較するという望ましいアプローチに答える方法がまだあるかもしれません。このようなアプローチでは、以下に示す使用して独立性をテストします。つまり、列Aが列Bと同じ比率である結果を探します。ng×2
上記の問題の解決策は、フィッシャーの正確検定を使用して適用することだと思います。ここで、はビンの総数です。テーブル内の行数のために完全な計算は実用的ではない可能性がありますが、モンテカルロシミュレーションを使用してp値の適切な推定値を取得できます(フィッシャーのテストのR実装では、テーブルのオプションとしてこれを提供します2 x 2より大きく、他のパッケージもそうだと思います)。これらのp値は、(モデルの1つからの)データの2番目のセットが、ビンを通じて元と同じ分布を持っている確率です。したがって、p値が高いほど、適合度は高くなります。 n gng×2ng
いくつかのデータをシミュレートして、ユーザーのデータに少し似たものにし、このアプローチが、「A」と同じプロセスから生成された「B」データセットと、わずかに異なるデータセットを識別するのに非常に効果的であることがわかりました。肉眼よりも確かに効果的です。
- このアプローチは中の変数の独立性をテストして分割表、それがAの点の数は、それがそのノートものの(Bのものと異なっていることが問題ではないですng×2最初に提案したように、絶対差の合計または差の二乗だけを使用する場合の問題)。ただし、Bの各バージョンのポイント数が異なることは重要です。基本的に、大きなBデータセットは低いp値を返す傾向があります。この問題に対するいくつかの可能な解決策を考えることができます。1.そのサイズよりも大きいすべてのBセットからそのサイズのランダムサンプルを取得することにより、すべてのBセットのデータを同じサイズ(Bセットの最小のサイズ)に縮小できます。2.最初に2次元のカーネル密度推定値を各Bセットに適合させ、次にその推定値から等しいサイズのデータをシミュレートできます。3.何らかの種類のシミュレーションを使用して、p値とサイズの関係を計算し、それを使用して「修正」することができます。上記の手順で得られるp値を比較できるようにします。おそらく他の選択肢もあります。どちらを行うかは、Bデータの生成方法、サイズの違いなどによって異なります。
お役に立てば幸いです。