Плохо реализован двухэлементный тест Колмогорова-Смирнова (kstest2) в Matlab?

Я упускаю что-то очевидное или Matlab's kstest2 дает очень плохие р-значения? Под очень бедным я имею в виду, что у меня есть подозрение, что это даже неправильно реализовано.

Страница справки kstest2 утверждает, что функция вычисляет асимптотическое p- значение, хотя я не нашел никаких ссылок о том, какой метод используется точно. Во всяком случае, описание далее гласит:

асимптотическое p- значение становится очень точным для больших размеров выборки и считается достаточно точным для выборочных размеров n1 и n2, так что (n1*n2)/(n1 + n2) ≥ 4


Пример 1

Давайте возьмем пример 6 из Lehman и D'Abrera (1975):

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 должно быть достаточно точным.

Matlab дает p = 0.0497 в то время как решение, данное в книге, 0.0870, Для проверки решения я использовал R, которому я доверяю больше, чем Matlab, особенно в статистике.

С помощью ks.test от stats пакет и ks.boot от 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's kstest2 так плохо работает, как показывают примеры? Какое приближение, алгоритм kstest2 использует? (Я вижу реализованный код для kstest2, однако лучше понять, что происходит, если обратиться к книге или статье.)

Я использую Matlab 2016a.


Lehman и D'Abrera (1975). Непараметрика: статистические методы на основе рангов. 1-е издание. Springer.

2 ответа

Я думаю, что правильный тест для сравнения с R ks.test в MATLAB или Octave будет kolmogorov_smirnov_test_2:

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];

kolmogorov_smirnov_test_2(sampleA, sampleB)

pval: 0,0878664

Разница заключается в использовании ks против lambdaт.е.

ks   = sqrt (n) * d;
pval = 1 - kolmogorov_smirnov_cdf (ks);

против

lambda =  max((sqrt(n) + 0.12 + 0.11/sqrt(n)) * d , 0);
pval = 1 - kolmogorov_smirnov_cdf (lambda);

Я предполагаю, что различные статистические данные о тестах проистекают из различий в исследовательских работах, цитируемых этими двумя функциями. Если вы хотите глубже погрузиться в статистическую теорию, вы можете обратиться к CrossValidated.

Спасибо за представление этой проблемы. MATLAB также обеспечивает более точные и надежные результаты, если вы хорошо понимаете код, который используете. Что касается вашего вопроса, вы хотите проверить сходство между двумя образцами. сначала вы должны знать, что p-значение, которое вы получили от MATLAB, равно 0,0497. Помните, что в MATLAB нулевая гипотеза здесь означает, что оба образца происходят из одних и тех же распределений, и, следовательно, значения p должны быть больше, чем предполагаемые (в вашем случае альфа составляет 0,05). у вас p-значение 0,0497, что меньше 0,05, поэтому оба образца взяты из разных распределений. Однако в R-программе нулевая гипотеза означает, что оба образца происходят из разных распределений, поэтому значение p должно быть меньше предполагаемого альфа (в вашем случае 0,05).

Другие вопросы по тегам