Проверка на равномерность распределения в статистике

Entikjkeee

У меня есть наборы точек следующего вида (Y — значение точки, X — номер точки в отсортированной последовательности):



Мне нужен какой-то практический алгоритм, который ответит на следующие вопросы:
1. образуют ли точки равномерное распределение (за исключением outlier'ов) ?
2. если да, то найти минимальное и максимальное значениия Y (за иключением outlier'ов)
Например, для первых двух графиков ответ на первый вопрос "нет", а для третьего — "да", отрезок значений [1_900_000, 13_000_000].
С практической точки зрения я хотел бы алгоритм, который найдет минимальный набор точек, которые нужно удалить, чтобы оставшиеся точки формировали равномерное распределение. Дальше я бы посмотрел на значения и количество удаленных точек и уже ответил бы на вопрос, можно ли считать исходный набор точек равномерно распределенным. Ну а границы отрезка — это просто глобальные минимум и максимум из оставшихся точек.
Базовые познания математики мне шепчут что-то про хи-квадрат, физпрака — про линейную аппроксимацию, а практический опыт — что нужно придумать какой-нибудь простой алгоритм на коленке.

griz_a

Это довольно расплывчатый вопрос, что значит "образуют ли равномерное распределение".
Мы можем взять критерий - какое-то правило, которое детектирует неравномерность в какой-то форме. Оно будет а) искать только определенный вид неравномерности б) будет выдавать некоторую вероятность - уровень значимости.
В данном случае, например, должен хорошо работать критерий Андерсона-Дарлинга, потому что он как раз ищет неравномерность в форме поиска отклонений слева и справа. Мы можем убрать точки так, чтобы критерий перестал протестовать, для этого как вариант можно просто убирать какое-то число точек слева и справа до того момента, пока статистика Андерсона-Дарлинга не спадет до какого-то разрешимого уровня значимости

griz_a

А вообще можно какую-нибудь робастную регрессионную модель заложить, например, least median of squares.

sveta555

http://en.wikipedia.org/wiki/Statistical_distance#Examples
тут много разного, но особо рекомендую эти:
для CDF - http://en.wikipedia.org/wiki/Kolmogorov%96Smirnov_test
для PDF - http://en.wikipedia.org/wiki/Kullback%96Leibler_divergence
если аутлаеры только по краям - то положи, что это na точек слева и nb точек справа, что соответствует величинам a и b или pa и pb (в процентах)
внутри [a, b] посчитай KS статистику как если бы точек вне [a,b] вобще бы не было
посчитай R = max(pa, pb, KS[a, b])
найди минимум R по (na, nb)
сравни R с пороговым значением

sveta555

а зачем сортировал-то?

griz_a

Подсказка: Колмогоров-Смирнов вообще не отличает края от не краев. Если взять порядка [math]$\sqrt{n}$[/math] максимальных величин и увеличить на 100500, то критерий Колмогорова даже не заметит.
Не говоря уж о том, что Колмогоров-Смирнов в целом как тест не ахти, увы.

sveta555

я тоже редко пользуюсь KS, но кмк на задачу ляжет, и да, не чистый KS, а R = max(pa, pb, KS[a, b])
ps: и похоже, что автор пропустил вводное "в экселе, без смс"

griz_a

Еще раз - статистика Колмогорова-Смирнова вообще бесполезна, пока выбросов не [math]$\sqrt{n}$[/math], она будет маленькой. Использовать ее в этой задаче нет смысла вообще, она просто не ощутит каких-то проблем

Entikjkeee

Сейчас я запилил придуманный руками алгоритм:
1. Сортируем массив данных
2. Ищем элемент x_m с минимальным значением sqrt(sum(x_i - x_m)^2)
3. Идем влево от x_m, пока отношение двух соседних величин по метрике sqrt(sum(x_i - x_m)^2) не станет меньше 1.1 (пороговое значение можно менять — на результат это мало влияет). Получаем x_low. Считаем, что всё, что меньше x_low — это outlier'ы. Считаем количество таких outlier'ов. Если их больше 2% — значит, исходная гипотеза не прокатила.
4. Проделываем то же самое, но вправо. Получаем x_high.
5. Отрезок x_low, x_high делим на несколько одинаковых по ширине бинов и проверяем, что в бины попало приблизетльно одинаковое количество точек. Если это не так, то гипотеза не прокатила.
А вообще можно какую-нибудь робастную регрессионную модель заложить, например, least median of squares.
Тут у меня совсем глупый вопрос: а что в качестве аргумента f(x) брать? Не порядковый же номер сэмпла в отсортированной последовательности?
а зачем сортировал-то?
Если это вопрос мне адресован, то для визуализации глазами. Есть более лучший способ? Пробовал scatter график — но там не особо хорошо видно.
ps: и похоже, что автор пропустил вводное "в экселе, без смс"
На C++, без смс.

griz_a

Алгоритм так себе.
Во-первых, такое x_m - это выборочное среднее. Которое в общем и целом будет себя не очень вести при больших\малых выбросах.
Во-вторых, отношение соседних величин по этой метрике может быть маленьким, а это все равно выбросы - например, если у меня 20 данных R[0,1], а остальные 980 R[1,20], то будет небольшое расхождение соседних, а выбросы вот они. Это работает только на выбросах-одиночках.
В-третьих, мера хорошести ненормированная, при увеличении данных в 10 раз она возрастет в 10 раз, а пороговое значение таким же останется.
В-четвертых, все эти параметры 2%, 1.1 фиг подберешь, играясь с ними можно что угодно признать равномерным или наоборот ничего не признавать.
Если требуемая точность невысока, то можно, конечно, на колене писать что-то, но разумные критерии гораздо лучше работают.
Тут у меня совсем глупый вопрос: а что в качестве аргумента f(x) брать? Не порядковый же номер сэмпла в отсортированной последовательности?

Обычно делают наоборот, строят эмпирическую функцию распределения. Но можно и так, только нормированный порядковый номер сэмпла, чтобы милионную погрешность не таскать.

Entikjkeee

должен хорошо работать критерий Андерсона-Дарлинга
А как данные под него правильно нормализовать? Если в отрезок [0, 1], то под логарифмами нули для мин. и макс. элементов получаются. Ну и на эту тему даже комментарий есть такой:
Note that the uniform (0,1) case can be used for fully specified distributions (i.e., the shape, location, and scale parameters are not estimated from the data).

griz_a

Надо первое и последнее наблюдение после сжатия на [0,1] выкинуть, получится выборка размера n-2 с равномерным распределением

Entikjkeee

Окай, спасибо, в целом работает хорошо.
Меня только смущает, что A^2 сильно зависит от количества сэмплов. Это ожидаемо? Например, на полной популяции в 4650 сэмплов A^2 = 4.47096, а для случайных выборок по 2000 сэмплов из этой же популяции получаются такие значения:
2.50052
1.5762
3.16074
2.37377
1.74525
1.78418
2.08328
3.01752
1.70962
3.50203
2.34815
3.76788
1.65501
3.2824
2.70605
2.33602
5.24765
2.9496
2.30055
2.45399
В общем, чем больше сэмплов, тем выше значение a^2.
Плюс я как-то совсем запутался, как правильно эти тесты применять (безотносительно конкретно этой задачи). Все мануалы говорят, что с помощью тестов можно достоверно только сказать, что распределение не соответствует проверяемому (с некоторой вероятностью false positive). А как проверить, что оно соответствует проверяемому? Если для моей выборки a^2 оказался ниже критического значения, то могу ли я считать, что распределение выборки соответсвует проверямому? Если да, то с какой вероятностью false negative? В статьях есть упоминание термина "test power", но никаких численных значений для него я не нашел. Или нужны какие-то совершенно иные тесты?
В идеале, конечно, хочется получить одно число, которое говорит, насколько выборка соответствует ожидаемому распределению. И дальше уже руками выбрать устраивающие значения: если P<0.2 — считаем, что не соответствут; если P>0.8, то считаем, что соответствует; а если P=[0.2, 0.8], то это ситуация не рыба - ни мясо, и уже от задачи зависит, что делать в таком случае.
Я хочу чего-то странного?

griz_a

Разумные критерии с ростом числа наблюдений работают лучше.
Меня только смущает, что A^2 сильно зависит от количества сэмплов. Это ожидаемо? Например, на полной популяции в 4650 сэмплов A^2 = 4.47096, а для случайных выборок по 2000 сэмплов из этой же популяции получаются такие значения:

В целом мощность критерия снижается с уменьшением размера выборки и он уже не столь уверенно реагирует на выбросы. Плюс много зависит от того, сколько выбросов попало в подвыборку. Можно разглядеть там 5 с чем-то, когда выбросов попало много.
А как проверить, что оно соответствует проверяемому?

Никак. Нельзя отделить равномерное распределение от всех остальных, потому что среди остальных есть очень-очень-очень похожее на равномерное распределение. Критерий Андерсона-Дарлинга - критерий, который хорошо отделяет именно нетипично большие-маленькие значения, поэтому он здесь работает неплохо.
Но все равно сказать, что вот здесь вот получилось в точности равномерное мы не можем, я про это писал в самом первом посте.
В идеале, конечно, хочется получить одно число, которое говорит, насколько выборка соответствует ожидаемому распределению. И дальше уже руками выбрать устраивающие значения: если P<0.2 — считаем, что не соответствут; если P>0.8, то считаем, что соответствует; а если P=[0.2, 0.8], то это ситуация не рыба - ни мясо, и уже от задачи зависит, что делать в таком случае.

Это p-value критерия Андерсона-Дарлинга.
Оставить комментарий
Имя или ник:
Комментарий: