Как определить бимодальное распределение?

48

Я понимаю, что как только мы построим значения в виде диаграммы, мы сможем определить бимодальное распределение, наблюдая за двумя пиками, но как найти его программно? (Я ищу алгоритм.)

venkasub
источник
5
Интригующий вопрос. Я ничего не знаю об этом, поэтому не буду пытаться ответить, но тест на двузначность Google + дает довольно многообещающие выводы. google.co.uk/search?q=bimodality+test
OneStop
программный код для проверки мультимодальности доступен на сайте www.estima.com и называется MODES.SRC. Вы можете легко конвертировать его в Matlab, R или другое программное обеспечение. С уважением, Гвидо.
1
Вы не можете определить количество режимов (нет ограничения на количество крошечных покачиваний, которые может иметь дистрибутив), но вы можете получить нижнюю границу. Например, см. здесь projecteuclid.org/euclid.aos/1176351045
Glen_b

Ответы:

27

Идентификация режима для непрерывного распределения требует сглаживания или объединения данных.

Биннинг, как правило, слишком прокрустен: результаты часто зависят от того, где вы разместите точки среза бункера.

Сглаживание ядра (в частности, в форме оценки плотности ядра ) является хорошим выбором. Хотя возможно много форм ядра, обычно результат не сильно зависит от формы. Это зависит от пропускной способности ядра. Таким образом, люди либо используют адаптивное сглаживание ядра, либо проводят последовательность сглаживаний ядра для различных фиксированных полос пропускания, чтобы проверить стабильность идентифицированных режимов. Хотя использование адаптивного или «оптимального» сглаживания привлекательно, имейте в виду, что большинство (все?) Из них предназначены для достижения баланса между точностью и средней точностью: они не предназначены для оптимизации оценки местоположения мод.

Что касается реализации, ядро ​​сглаживает локальное смещение и масштабирование заранее определенной функции, чтобы соответствовать данным. При условии, что эта базовая функция дифференцируема - гауссианы - хороший выбор, потому что вы можете дифференцировать их столько раз, сколько захотите - тогда все, что вам нужно сделать, это заменить ее производной, чтобы получить производную от гладкого. Тогда это просто вопрос применения стандартной процедуры обнаружения нуля для обнаружения и проверки критических точек. ( Метод Брента работает хорошо.) Конечно, вы можете проделать тот же трюк со второй производной, чтобы быстро проверить, является ли любая критическая точка локальным максимумом, то есть режимом.

Whuber
источник
2
@venkasub, вы также можете посмотреть на метод Мюллера для поиска корней. Это проще, чем метод Брента, и «почти» так же эффективно, как метод Ньютона, но без необходимости знать производные целевой функции.
кардинал
25

Существует известная статья Сильвермана, посвященная этой проблеме. Он использует оценку плотности ядра. Видеть

Б. В. Сильверман, Использование оценок плотности ядра для исследования мультимодальности , J. Royal Stat. Soc. B , vol. 43, нет. 1, 1981, с. 97-99.

Обратите внимание, что в таблицах статьи есть некоторые ошибки. Это только отправная точка, но довольно хорошая. Он предоставляет четко определенный алгоритм для использования, если это то, что вы больше всего ищете. Вы можете посмотреть в Google Scholar статьи, которые ссылаются на более «современные» подходы.

кардинальный
источник
4
+1 Эта статья использует информацию о том, как количество видимых мод зависит от ширины ядра (для гауссовых ядер), чтобы выбрать подходящую ширину, а затем продолжает, как описано в моем ответе.
whuber
2

Я опоздал на вечеринку, но если вас просто интересует, является ли он мультимодальным или нет, то есть вас не интересует количество режимов, вам стоит посмотреть на diptest .

В Rпакете это называется diptest.

Коц
источник
2
Полное название - тест Химтигана на погружение в унимодальность. В оригинальной статье описывается следующее описание: Тест на погружение измеряет мультимодальность в выборке по максимальной разности по всем точкам выборки между эмпирической функцией распределения и унимодальной функцией распределения, которая минимизирует эту максимальную разницу. Алгоритм не тривиален, но вы можете легко найти C, Python, MATLAB и современные переводы на Фортран, основанные на оригинальной реализации на Фортране, в разделе «Вычисление Dip-статистики для проверки на унимодальность» .
Mortehu
1
Код MATLAB: nicprice.net/diptest и еще один - gist.github.com/schluppeck/e7635dcf0e80ca54efb0 .
Рой
0

Определение в вики меня немного смущает. Вероятность того, что непрерывный набор данных будет иметь только один режим, равна нулю. Простой способ программирования бимодального диструбитона - это два отдельных нормальных распределения, центрированных по-разному. Это создает два пика или то, что вики называет режимами. На самом деле вы можете использовать практически любые два распределения, но одна из более сложных статистических возможностей состоит в том, чтобы найти способ формирования набора данных после объединения двух случайных распределений данных.

Бэзил
источник
Как вы будете определять центры двух нормальных распределений?
venkasub
@venkasub, центр нормального распределения - это среднее. Если вы знаете, что бимодальность происходит из двух нормальных распределений, вы можете подобрать модель смеси, чтобы оценить средние значения, которые будут двумя модами.
mpiktas