Плохо реализован двухэлементный тест Колмогорова-Смирнова (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).