Выполнение MCMC: используйте jags / stan или реализуйте это самостоятельно

13

Я новичок в исследованиях Байесовской статистики. Я слышал от исследователей, что байесовские исследователи лучше внедряют MCMC, а не используют такие инструменты, как JAGS / Stan. Могу ли я спросить, в чем состоит преимущество реализации алгоритма MCMC самостоятельно (на «не совсем быстрых» языках, таких как R), кроме как для целей обучения?

user112758
источник
Поскольку тогда вы можете сами выбирать распределение предложений, вы должны выбрать его так, чтобы полученная в результате цепь Маркова сходилась как можно быстрее к заднему плану.
Благодарность! Это единственная причина?
user112758 14.09.16
4
Если вы прикладной исследователь, который хочет узнать больше Байеса, используя его для приложений, я бы порекомендовал начать с JAGS или Stan, а затем перейти к написанию собственного MCMC, если вы обнаружите, что вам «это нужно». Имейте в виду, что JAGS и Stan имеют немного разные сильные и слабые стороны.
конъюнктурный
Благодарность! Да, я занимаюсь прикладными исследованиями. Не могли бы вы рассказать мне больше об ограничениях JAGS и Stan. Сначала я попробовал Stan, но обнаружил, что в нем нет функций или надстроек «онлайн-мониторинга» или «образца до схождения» - это раздражает, я могу попробовать JAGS сейчас.
user112758

Ответы:

26

В общем, я бы настоятельно рекомендовал не кодировать свой собственный MCMC для реального прикладного байесовского анализа. Это как много работы и времени , и очень вероятно , вводить ошибки в коде. Сэмплеры Blackbox, такие как Stan, уже используют очень сложные сэмплеры. Поверьте мне, вы не будете кодировать пробоотборник этого калибра только для одного анализа!

Существуют особые случаи, в которых этого будет недостаточно. Например, если вам нужно было провести анализ в режиме реального времени (т.е. компьютерное решение на основе входящих данных), эти программы не будут хорошей идеей. Это потому, что Stan требует компиляции кода C ++, что может занять значительно больше времени, чем просто запуск уже подготовленного сэмплера для относительно простых моделей. В этом случае вы можете написать свой собственный код. Кроме того, я полагаю, что есть особые случаи, когда пакеты, такие как Stan, работают очень плохо, такие как негауссовы модели пространства состояний (полное раскрытие: я считаю, что Stan работает плохо в этом случае, но не знает). В этом случае, возможно, стоит реализовать собственный MCMC. Но это исключение, а не правило!

Честно говоря, я думаю, что большинство исследователей, которые пишут сэмплеры для одного анализа (и я видел это), делают это потому, что им нравится писать свои собственные сэмплеры. По крайней мере, я могу сказать, что подпадаю под эту категорию (т.е. я разочарован тем, что написание собственного сэмплера не лучший способ сделать что-то).

Кроме того, хотя нет смысла писать свой собственный сэмплер для одного анализа , может иметь смысл написать собственный код для класса анализа., Поскольку JAG, Stan и т. Д. Являются сэмплерами черного ящика, вы всегда можете ускорить процесс, специализируясь на конкретной модели, хотя количество улучшений зависит от модели. Но написание чрезвычайно эффективного сэмплера с нуля - это, возможно, 10-1000 часов работы, в зависимости от опыта, сложности модели и т. Д. Если вы проводите исследования в области байесовских методов или пишете статистическое программное обеспечение, это нормально; это твоя работа Но если ваш начальник скажет: «Эй, вы можете проанализировать этот набор данных повторных измерений?» и вы потратите 250 часов на написание эффективного сэмплера, ваш босс, вероятно, будет расстроен. Напротив, вы могли бы написать эту модель в Stan, скажем, за 2 часа, и у вас было бы 2 минуты времени работы вместо 1 минуты времени, достигнутого эффективным пробоотборником.

Клифф AB
источник
3
+1. Кроме того, Stan напрямую не решает некоторые проблемы, связанные с дискретными распределениями, поэтому вы должны знать достаточно, чтобы интегрировать их, что само по себе непросто, так что это может быть в том случае, если может помочь сворачивание ваших собственных. Я считаю, что JAGS обрабатывает такие случаи напрямую, поэтому, если вы можете держать в уме различные философии BUGS / JAGS и Stan, было бы лучше просто переключаться между ними.
Уэйн
Кроме того, у Стэна могут быть проблемы, когда диагональная евклидова метрика не очень подходит для геометрии апостериорного; это, в частности, тот случай, когда существует только узкая задняя часть странной формы, которая имеет большую вероятность. В результате выборка сзади напоминает попытку покататься на велосипеде по краю обрыва: вы можете «упасть», если сделаете неправильный поворот!
Sycorax сообщает, что восстановит Монику
2
+1. Моя общая рекомендация для студентов - написать код в JAGS. Если это не сработает, закодируйте его в Stan. Если это не сработает, начните писать свой собственный сэмплер. Существуют также определенные модели, например, пространственные модели, где вы можете использовать BUGS. И некоторые модели, например, негауссовы модели пространства состояний, где вы хотите использовать NIMBLE. Альтернативная стоимость начала написания собственного сэмплера слишком высока.
Джарадниеми
Я не понимаю случая «реального времени» - если возможно иметь «уже подготовленный» собственный сэмплер, почему не так просто использовать уже скомпилированную модель Стэна? Мне также интересно, достаточно ли быстрого MCMC для приложений реального времени.
Юхо Коккала
1
И я не достаточно знаком со Стэном, чтобы знать, что именно требует компиляции новых моделей, но нетрудно представить, что, каково бы ни было ограничение, существует динамическая модель, такая, что по мере поступления новых данных модель становится более сложной. и поэтому перекомпиляция будет необходимо. Я думаю, что непараметрические методы (в которых пространство параметров растет с размером выборки) соответствовали бы этим критериям? Но могут быть умные способы обойти это.
Клифф А.Б.
6

Этот вопрос прежде всего основан на мнении, но я думаю, что здесь достаточно написать ответ. Там может быть много причин, чтобы написать собственный пробник для исследовательской задачи. Вот некоторые из них

  1. Предложение: Как предлагает fcop в своем комментарии, если выборка MH, то кодирование вашего собственного сэмплера позволяет вам поэкспериментировать с распределениями предложений, чтобы получить лучший микшерный сэмплер.

  2. Гибкость: встроенные программы могут не дать вам необходимой гибкости. Возможно, вы захотите начать с определенного случайного значения или использовать конкретную начальную структуру.

  3. Понимание: кодирование вашего собственного сэмплера помогает вам понять поведение сэмплера, давая представление о процессе цепочки Маркова. Это полезно для исследователя, работающего над проблемой.

  4. Бремя: если данные, по которым я делаю все мои байесовские выводы, получены из программы, которую я не кодировал, то бремя вывода больше не лежит на мне. Как исследователь, я хотел бы взять на себя полную ответственность за методы / результаты, которые я представляю. Использование встроенных методов не позволяет вам сделать это.

Возможно, есть и другие причины, но именно эти четыре заставляют меня писать собственные сэмплеры.

Greenparker
источник
6
Я бы сказал , что «доверие» причина спорно: Стэн является открытым исходным кодом и имеет множество участников, так что несколько человек смотрели на это исходный код , и поэтому маловероятно , что у него есть серьезные ошибки. С другой стороны, если вы делаете это самостоятельно, вы всегда можете пропустить ошибку, которую вы сделали - и все делают ошибки, это просто вопрос количества строк кода, которые вы пишете ...
Тим
@ Я согласен. Я изменил эту точку, чтобы отразить то, что я пытался сказать. Благодарю.
Greenparker
5
+1 за аргумент понимания. Тем не менее, аргумент Onus кажется немного завышенным. Почти все, что вы кодируете самостоятельно, будет опираться на чей-то другой статистический язык, библиотеку линейной алгебры, генератор случайных чисел и т. Д., Поэтому «принятие ответственности» - это вопрос степени.
конъюнктурный
@conjugateprior Абсолютно согласен. Вот почему мой ответ на этот вопрос был от первого лица. Это было чисто мое мнение.
Greenparker
4

Я дал +1 к ответу Клиффа АБ. Чтобы добавить один маленький кусочек, если вы хотите работать на более низком уровне, но не на уровне кода «все для себя», вы должны поискать поискать пакет LaplacesDemon . Первоначальный автор был великолепен, но, кажется, выпал из сетки, и пакет был перехвачен кем-то другим. (Это на Github, я верю.)

Он реализует впечатляющее количество алгоритмов, используемых в MCMC, и включенные виньетки стоят того, чтобы их прочитать, даже если вы не используете пакет. Практически любой сэмплер, о котором вы читали. Вы кодируете иначе, чем BUGS / JAGS или Stan, и все это на R, но часто это настолько эффективно, что оно конкурентоспособно.

Wayne
источник
1
Бесстыдный плагин: вы также можете использовать [nimble] (r-nimble.org), который позволяет настроить MCMC (т.е. использовать сэмплер срезов для этого узла, модуль обновления блоков для этой группы узлов и т. Д.) Без необходимости перезаписи это пробники каждый раз. И вы также можете написать свои собственные сэмплеры для непосредственной реализации! Раскрытие: я работал над этим проектом.
Клифф А.Б.
@CliffAB: Похоже LaplacesDemon, если вы знакомы с этим. Рад слышать и о nimble. Я по крайней мере, скачать его. (Хотя несколько виньеток LaplacesDemon могут стоить загрузки, даже если вы используете шустрый.) ... Оооо, просто пошел на страницу. Если его SMC прост в использовании, я стану большим поклонником. Единственный пакет R, который я видел, который делает SMC, ужасно сложен.
Уэйн
@CliffAB: Ух ты, после прочтения nimbleсайта это впечатляет. Почему я никогда не слышал об этом? Это похоже на отличный вариант для людей, привыкших к языку моделирования BUGS / JAGS. Конечно, они сделают самые лучшие сравнения на сайте, но мне все еще нравится это. (За исключением того, что с rstanarmи brms, который использует Стэна под капотом, чемпионом по простоте использования в R будет Стэн.)
Уэйн
это все еще очень ново: v0.1 был выпущен, я думаю, чуть более 2 лет назад? И SMC был огромным стимулом для проекта: PI сделал значительную публикацию на фильтрах частиц и был раздражен написанием их с нуля каждый раз. Но я был немного занят текущей работой, чтобы не отставать от текущего состояния сэмплеров SMC; когда я ушел (почти два года назад), мы просто собрали очень примитивный.
Клифф AB
1
Просто скажите эту статью о arXiv , которая может вас заинтересовать.
Клифф А.Б.