明らかな何かが欠けているのでしょうか、それとも Matlab のpkstest2
値が非常に悪いのでしょうか? 非常に悪いとは、それが間違って実装されているという疑いがあることを意味します。
ヘルプページにkstest2
は、関数が漸近p値を計算すると記載されていますが、どのメソッドが正確に使用されているかについての参照は見つかりませんでした。とにかく、説明はさらに述べています:
漸近p値は、サンプル サイズが大きい場合に非常に正確になり、(n1*n2)/(n1 + n2) ≥ 4 のように、サンプル サイズ n1 および n2 の場合はかなり正確であると考えられます。
例 1
Lehman and D'Abrera (1975) の例 6 を見てみましょう。
sampleA = [6.8, 3.1, 5.8, 4.5, 3.3, 4.7, 4.2, 4.9];
sampleB = [4.4, 2.5, 2.8, 2.1, 6.6, 0.0, 4.8, 2.3];
[h,p,ks2stat] = kstest2(sampleA, sampleB, 'Tail', 'unequal');
(n1*n2)/(n1 + n2) = 4
この場合、p値は適度に正確である必要があります。
p = 0.0497
本で与えられた解決策は ですが、Matlab は をもたらし0.0870
ます。ソリューションを検証するために、R を使用しました。R は、特に統計において、Matlab よりも信頼しています。
ks.test
fromstats
パッケージとks.boot
fromパッケージの使用Matching
:
ks.test(sampleA, sampleB, alternative = "two.sided")
ks.boot(sampleA, sampleB, alternative = "two.sided")
どちらも を与えp = 0.0870
ます。
例 2
独自の例を使用kstest2
して、サンプル サイズが大きい場合の Matlab と R の結果を比較してみましょう。
rng(1); % For reproducibility
x1 = wblrnd(1,1,1,50);
x2 = wblrnd(1.2,2,1,50);
[h,p,ks2stat] = kstest2(x1,x2);
これにより が得られp = 0.0317
ます。ここで、同じx1
とx2
ベクトルを使用すると、R は を与えp = 0.03968
ます。非常に正確な結果が期待される場合、約 20% の差(n1*n2)/(n1 + n2) = 25
。
私は行方不明ですか、何かを台無しにしていますか? 例が示すように、Matlab のkstest2
パフォーマンスが非常に悪い可能性はありますか? アルゴリズムkstest2
はどのような近似を使用していますか? (kstest2 に実装されたコードを見ることができますが、何が起こっているのかを理解するには、本や紙を参照する方がはるかに良いでしょう。)
Matlab 2016a を使用しています。
リーマンとダブレラ (1975)。ノンパラメトリック: ランクに基づく統計手法。第1版。スプリンガー。