意図した分布に対してランダムに生成されたデータをテストする


17

ランダムデータを生成するプログラムを作成しました。プログラムが正常に動作している場合、そのデータは特定の既知の確率分布に従う必要があります。プログラムを実行し、結果に対していくつかの計算を行い、p値を見つけたいと思います。

他の誰かがそれを言う前に:私は、仮説テストではプログラムが正しく動作していることを検出できないことを理解しています。特定の方法で正しく動作していない場合にのみ検出できます。(それでも、選択した有意水準に応じて、テストは時間のX%で「失敗」するはずです...)

だから、私はどのツールが適切かを理解しようとしています。特に:

  • 必要なだけランダムデータを生成できます。私がしなければならないことは、プログラムを十分に長く実行することです。したがって、特定のサンプルサイズに限定されません。

  • p値を生成する手法に興味があります。したがって、グラフをじっと見て、「はい、それは線形に見えます」と言うことは、興味深い選択肢ではありません。グラフの「不安定」にハードナンバーを付ける何らかの方法がない限り。;-)

私がこれまでに知っていること:

  • 適用できると思われる3つの主要なテストの種類を見ました。[Pearson]カイ2乗検定、Kolmogorov-Smirnov検定、およびAnderson-Darling検定。

  • カイ二乗検定は離散分布に適しているように見えますが、他の2つは連続分布に適しています。(?)

  • さまざまな情報源は、ADテストはKSテストよりも「優れている」と示唆していますが、それ以上の詳細は説明していません。

最終的に、これらのテストはすべて、指定されたヌル分布から逸脱する「異なる方法」を検出すると考えられます。しかし、私はまだ違いが何であるかを本当に知りません...要約すると、私は各タイプのテストが最も適切である場所と、それが最もよく検出する種類の問題のある種の一般的な説明を探しています。


独自に作成した場合、知識の限界(設計に組み込んだこと)を超えると、ほぼ「失敗」になります。いくつかのチェック方法、および明らかにstackoverflow.com/q/2130621/717355をリストするrandom.org/analysisご覧ください。哲学的に、プログラムが決定論的である場合、それはとにかくランダムではあり得ません;-)それは間違いなく勉強する価値のある主題です(そしてパスワードハッキングクリポの議論を忘れないでください)。
フィリップオークリー14年

回答:


21

ここに、上記の3つの方法がどのように機能するかの一般的な説明があります。

カイ二乗法は、ビンに含まれる観測値の数を、分布に基づいてビンに含まれると予想される数と比較することで機能します。離散分布の場合、ビンは通常、離散的な可能性またはそれらの組み合わせです。連続分布の場合、カットポイントを選択してビンを作成できます。これを実装する多くの関数は自動的にビンを作成しますが、特定の領域で比較したい場合は独自のビンを作成できるはずです。この方法の欠点は、理論的な分布と、同じビンに値を入れた経験的データとの差が検出されないことです。理論的には、2から3の間の数値が範囲全体に広がる場合、丸めが例になります(2.34296のような値が表示される予定です)、

KS検定統計量は、比較される2つの累積分布関数(多くの場合、理論的および経験的)間の最大距離です。2つの確率分布の交点が1つだけの場合、1から最大距離を引いた値が2つの確率分布の重なりの領域になります(これにより、測定対象を視覚化できます)。同じプロットに理論的な分布関数とEDFをプロットし、2つの「曲線」間の距離を測定すると考えてください。最大の違いは検定統計量であり、nullがtrueの場合の値の分布と比較されます。これは、分布の形状または1つの分布が他の分布と比較してシフトまたはストレッチされていることを示しています。1n

Anderson-Darling検定もKS検定のようにCDF曲線間の差を使用しますが、最大差を使用するのではなく、2つの曲線間の合計面積の関数を使用します(実際に差を2乗し、それらが尾を持つより多くの影響力があり、分布のドメイン全体で統合されます これにより、KSよりも外れ値の重みが大きくなり、いくつかの小さな違いがある場合にも重みが大きくなります(KSが強調する1つの大きな違いと比較して)。これにより、重要ではないと思われる相違点(穏やかな丸めなど)を見つけるためのテストが圧倒される可能性があります。KSテストと同様に、これはデータからパラメーターを推定しなかったことを前提としています。

最後の2つの一般的なアイデアを示すグラフを次に示します。

ここに画像の説明を入力してください

このRコードに基づいて:

set.seed(1)
tmp <- rnorm(25)
edf <- approxfun( sort(tmp), (0:24)/25, method='constant', 
    yleft=0, yright=1, f=1 )

par(mfrow=c(3,1), mar=c(4,4,0,0)+.1)
curve( edf, from=-3, to=3, n=1000, col='green' )
curve( pnorm, from=-3, to=3, col='blue', add=TRUE)

tmp.x <- seq(-3, 3, length=1000)
ediff <- function(x) pnorm(x) - edf(x)
m.x <- tmp.x[ which.max( abs( ediff(tmp.x) ) ) ]
ediff( m.x )  # KS stat
segments( m.x, edf(m.x), m.x, pnorm(m.x), col='red' )  # KS stat

curve( ediff, from=-3, to=3, n=1000 )
abline(h=0, col='lightgrey')    

ediff2 <- function(x) (pnorm(x) - edf(x))^2/( pnorm(x)*(1-pnorm(x)) )*dnorm(x)
curve( ediff2, from=-3, to=3, n=1000 )
abline(h=0)

上のグラフは、標準の標準のCDFと比較した標準の標準のサンプルのEDFと、KS統計を示す線を示しています。中央のグラフは、2つの曲線の違いを示しています(KS統計が発生する場所を確認できます)。下部は2乗の重み付き差であり、AD検定はこの曲線の下の面積に基づいています(すべてが正しいと仮定した場合)。

他のテストでは、qqplotの相関関係を調べ、qqplotの傾きを調べ、モーメントに基づいて平均、var、およびその他の統計を比較します。


+1、これは実際の質問に対する良い答えです(私の...とは異なります)。パラグラフ3の真ん中を通る説明は、説明用の図を求めているだけです。
GUNG -復活モニカ

それは本当にいい答えです。完全に理解するために、KSテストはCDFとEDFの間の最大偏差を返し、ADは2つの曲線間の合計[加重]エリアを返しますか?
MathematicalOrchid

@MathematicalOrchid、ほとんど正しい、ADは距離を2乗し、次に重みをかけ、次に積分するため、エリアとは多少異なります(ただし、理解するために、エリアと考えることはおそらく大丈夫ではるかに簡単です)。
グレッグスノー

1
理論的な分布に点質量(特定の点でのCDFの垂直ジャンプ)があり、データの実際の分布にほぼ同じ場所(完全ではない)に点質量がある場合、KSテストが優れている可能性がありますADテストに。しかし、そのケースはおそらく少し不自然です。KSテストでは、ADが常に両面である片面テストが許可されているため、別の違いになります(一般的ではありません)。
グレッグスノー

2
私は、KS統計が「1つの極値」のみに依存するという@MathematicalOrchidの特徴付けが好きではありません。CDF内のその「1つのポイント」(多くの場合、分布の中央)の位置は、セット内の他のポイントの値に依存するため、その言語が素朴なリスナーに示唆するほど孤立していない。
-DWin

12

明確で詳細な質問を書くために+1。私の答えがイライラしないことを願っています。あなたの場合、仮説検定は適切なアプローチではないと思います。帰無仮説の有意性検定は、答え「はい」または「いいえ」の場合に行うべき合理的なことですが、どちらが正しいかわかりません。(残念ながら、実際にはどちらがわかるかはわかりませんが、これは別の問題です。)あなたの場合、あなたがあなたのアルゴリズムが良いかどうか知りたいのです。ただし、確率分布から真にランダムなデータを生成できるコンピュータープログラムはないことは(確実に)わかっています。すべてのコンピューターは有限状態マシンであり、したがって擬似乱数しか生成できないため、これは最初に当てはまります。さらに(真のランダム性の欠如を別にすれば)、生成された値が連続的な分布に完全に従うことは不可能です。これを理解するにはいくつかの方法がありますが、おそらく最も簡単なのは、数値行に「ギャップ」があることです。これは、連続するランダム変数には当てはまりません。さらに、これらのギャップは、すべてが完全に等しい幅または完全に等しい間隔ではありません。擬似乱数生成に取り組んでいるコンピューターサイエンティストの間では、ゲームの名前はアルゴリズムを改良して、ギャップをより小さく、より均一に、より長い期間(そしてより多くの値をより速く生成できるようにする)です。とにかく、これらの事実は、仮説検定がアルゴリズムが「特定の既知の確率分布」に適切に従っているかどうかを判断するための間違ったアプローチであることを確立しています。そうではないからです。(ごめんなさい。)

代わりに、より適切なフレームワークは、データが理論上の分布にどれだけ近いかを判断することです。このため、プロット、特にqq-plotspp- plotsを再検討することをお勧めします1βr=1

もう1つの注意点として、アルゴリズムの品質の評価に関しては、他の標準pRNGと比較して時間を調整することができます。

お役に立てれば。


正確に私が求めたものではありませんが、それでもなお洞察力に富んでいます。「連続的ではない」というのは、コンピューターが無限精度の演算を実装していないという事実を基本的に参照していると思いますか?
MathematicalOrchid

それはそれの大きな部分ですが、問題の全体ではありません。これは非常に複雑なトピックです。
GUNG -復活モニカ

1
@gungの最初の段落のアイデアのいくつかは、R SnowsPenultimateNormalityTestTeachingDemosパッケージの関数に実装されています。p値に焦点を当てるのではなく、親密度の尺度を見るという@gungのアイデアに同意します。このためにqqプロットで相関を使用する場合の問題の1つは、データの形状が正しいが、平均、分散などが異なる場合でも、非常に高い相関が得られることです。もう1つの方法は、KS統計またはAD統計を理論との差の尺度として使用することです。
グレッグスノー

@gung、答えてくれてありがとう。「プロットのためにデータを適切に変換し、問題の理論的分布から対応する値を計算したので、それらを相関させることができます」についてもう少し詳しく説明してもらえますか?ppプロットまたはqqプロットのデータを計算しましたが、あなたが言及したrスコアを取得するための次のステップは何でしょうか?よく知られたテストですか?参考にしてください。ありがとうございました!
イヴァン

1

すべての答えを完全に読んだわけではありませんが、かなり徹底的かつ正確であることがわかります。長い答えに埋もれた何かを繰り返しているというリスクを冒して、v =カイ二乗検定は連続データに使用できると言いたいだけです。これは最良のテストではない可能性があり、多くのテストと同様に漸近理論に依存しているため、スパースセルの小さなサンプルでは正確ではない可能性があります(これはビニングの方法にも依存します)。Anderson-Darlingは、KSテストよりも正規性をテストするためにより強力ですが、KSは他の連続分布に対してより良いかもしれません。Lilleforsには、指数分布用に設計されたテストがあります。

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