Я думаю, что ваш вопрос немного отличается от того, с которым вы связались. У него была полная программа Stan, и он хотел управлять ею с C++, тогда как вы спрашиваете, можете ли вы обойти писать программу Stan, вызывая внешнюю функцию C++ для оценки вероятности регистрации. Но это не привело бы вас к очень далеко, потому что вам все равно придется передавать данные в форме, которую может выполнять Стэн, объявить Стэну, какие неизвестные параметры (плюс их поддержка) и т. Д. Итак, я не думаю, что вы можете (или должен) уклоняться от изучения языка Стэна.
Но довольно легко выставить на язык Сцена функцию C++, которая по сути просто включает в себя добавление файла my_loglikelihood.hpp в нужное место под ${STAN_HOME}/lib/stan_math_${VERSION}/stan/math/
, добавив инструкцию include в файл math.hpp в этом подкаталоге, и редактирование ${STAN_HOME}/src/stan/lang/function_signatures.h
. В этот момент ваша программа .stan может выглядеть так же просто, как data { // declare data like y, X, etc. } parameters { // declare parameters like theta } model { // call y ~ my_logliklihood_log(theta, X) }
Но я думаю, что реальный ответ на ваш вопрос заключается в том, что если вы уже написали C++-функцию для оценки логарифмической правдоподобия, то переписывание ее на языке Stan должно Не прошло и нескольких минут. Язык Стэн очень похож на C, так что легче обрабатывать файл .stan в исходный файл C++. Вот функция Stan, которую я написал для log-правдоподобия условно-гауссовского результата в контексте регрессии: functions { /** * Increments the log-posterior with the logarithm of a multivariate normal * likelihood with a scalar standard deviation for all errors * Equivalent to y ~ normal(intercept + X * beta, sigma) but faster * @param beta vector of coefficients (excluding intercept) * @param b precomputed vector of OLS coefficients (excluding intercept) * @param middle matrix (excluding ones) typically precomputed as crossprod(X) * @param intercept scalar (assuming X is centered) * @param ybar precomputed sample mean of the outcome * @param SSR positive precomputed value of the sum of squared OLS residuals * @param sigma positive value for the standard deviation of the errors * @param N integer equal to the number of observations */ void ll_mvn_ols_lp(vector beta, vector b, matrix middle, real intercept, real ybar, real SSR, real sigma, int N) { increment_log_prob(-0.5 * (quad_form_sym(middle, beta - b) + N * square(intercept - ybar) + SSR)/ square(sigma) - # 0.91... is log(sqrt(2 * pi())) N * (log(sigma) + 0.91893853320467267)); } }
, который в основном просто сбрасывает то, что в противном случае могло бы быть C-синтаксисом в тело функции на языке Stan, которая затем вызывается в блоке model
программы .stan.
Итак, я думаю, вам было бы проще всего переписать вашу C++-функцию как функцию Stan. Однако возможно, что ваш лог-правдоподобие включает в себя что-то экзотическое, для которого в настоящее время не существует соответствующего синтаксиса Синтаксиса. В этом случае вы можете вернуться к раскрытию этой функции C++ для языка Stan и в идеале сделать запросы на загрузку в репозитории math и stan на GitHub под stan-dev, чтобы другие люди могли его использовать (хотя тогда вам также придется писать модульные тесты, документация и т. д.).
Я только что работал над выходными, но мне нужно немного поработать над другими вещами :(Я пытаюсь создать неоднородную модель пуассоновского процесса, где мгновенная скорость довольно сложная, а также интеграл в функции правдоподобия. довольно конкретный, поэтому я не думаю, что это был бы достойный вклад, к сожалению. Если, возможно, я не смогу придумать способ обобщить модель немного больше - я подумаю. Еще раз спасибо. – Jeff
Я получил это для работы некоторые основные примеры, еще раз спасибо за ваше решение! Мне было интересно, считаете ли вы, что кто-нибудь будет интересоваться некоторыми примерами, а также где я могу его разместить? – Jeff
Возможно, GitHub wiki? (https://github.com/stan-dev/) stan/wiki) Я не знаю, позволит ли вам создать новую страницу, но один из нас может нажать ее для вас, или мы могли бы, вероятно, изменить разрешения. –