私は統計トピックの初心者なので、ここで見逃しているのは明らかなことかもしれません。
基本的に、Apache Commons Mathの統計テストdouble
に基づいて、整数値の配列 (ヒストグラム) が正規分布(平均と標準偏差が指定されている) に適合しているかどうかを調べたいと思います。
私がすでに理解していることは、一般的な方法はp 値を計算し、帰無仮説が真かどうかを判断することです。
私の最初の「赤ちゃん」ステップは、一元配置分散分析テストを使用して、2 つの配列が同じ分布から来ているかどうかを確認することです (2 番目の部分は、ドキュメントの例から取得されます)。
double samples1[] = new double[100];
double samples2[] = new double[100];
Random rand = new Random();
for (int i = 0; i < 100000; i++) {
int index1 = (int) (rand.nextGaussian()*5 + 50);
int index2 = (int) (rand.nextGaussian()*5 + 50);
try {
samples1[index1-1]++;
}
catch (ArrayIndexOutOfBoundsException e) {}
try {
samples2[index2-1]++;
}
catch (ArrayIndexOutOfBoundsException e) {}
}
List classes = new ArrayList<>();
classes.add(samples1);
classes.add(samples2);
double pvalue = TestUtils.oneWayAnovaPValue(classes);
boolean fail = TestUtils.oneWayAnovaTest(classes, 0.05);
System.out.println(pvalue);
System.out.println(fail);
結果は次のとおりです。
1.0
false
有意水準が 0.05 であると仮定すると、仮説は真である (つまり、両方の配列が同じ分布からのものである) と推測できますp > 0.05
。
では、コルモゴロフ・スミルノフ検定を見てみましょう。ドキュメントのサンプルコードは、オブジェクトに対して単一の配列をチェックする方法を示していNormalDistribution
ます (それが私の目標です)。ただし、2 つの配列をチェックすることもできます。どちらの場合も適切な結果が得られません。たとえば、上記の例を KS に適用してみましょう。
double samples1[] = new double[100];
double samples2[] = new double[100];
Random rand = new Random();
for (int i = 0; i < 100000; i++) {
int index1 = (int) (rand.nextGaussian()*5 + 50);
int index2 = (int) (rand.nextGaussian()*5 + 50);
try {
samples1[index1-1]++;
}
catch (ArrayIndexOutOfBoundsException e) {}
try {
samples2[index2-1]++;
}
catch (ArrayIndexOutOfBoundsException e) {}
}
double pvalue = TestUtils.kolmogorovSmirnovTest(samples1, samples2);
boolean fail = pvalue < 0.05;
System.out.println(pvalue);
System.out.println(fail);
結果は次のとおりです。
7.475142727031425E-11
true
私の質問は、なぜ本質的に同じデータの p 値が非常に小さいのですか? このようなデータにはこのテストは適していないということですか。
するべきか:
- (つまり、指定された平均値と標準偏差を使用して)の参照配列を生成
NormalDistribution
し、一元配置分散分析テスト (またはその他) を使用して配列と比較します。 - どういうわけか私のデータを適応させてから、KSを使用して単一の配列を
NormalDistribution
オブジェクトと比較します
?