从C++程序调用Stan例程 我读到这是可能的,我直接解释了C++程序中的例程。 我有一些复杂的对数似然函数,我用C++编码过,并且不知道如何用STAN语言对它们进行编码。是否可以调用Stan中的蒙特卡洛例程,使用我已经在C++中编码的对数似然函数?如果有的话,有这样的例子吗

从C++程序调用Stan例程 我读到这是可能的,我直接解释了C++程序中的例程。 我有一些复杂的对数似然函数,我用C++编码过,并且不知道如何用STAN语言对它们进行编码。是否可以调用Stan中的蒙特卡洛例程,使用我已经在C++中编码的对数似然函数?如果有的话,有这样的例子吗,c++,bayesian,mcmc,stan,C++,Bayesian,Mcmc,Stan,这似乎是一件很自然的事情,但我找不到任何关于如何做到这一点的例子或指针。我认为你的问题与你链接的问题有点不同。他有一个完整的STAN程序,想从C++驱动它,而你问你是否可以通过调用外部C++函数来评估一个STAN程序来评估日志的可能性。但这不会让你走得很远,因为你仍然必须以Stan可以处理的形式传递数据,向Stan声明未知参数及其支持,等等。因此,我认为你不能也不应该逃避学习Stan语言 但是,将C++函数暴露给Stan语言相当容易,这基本上只需要在${StasiHOL}/LB/StasyMas

这似乎是一件很自然的事情,但我找不到任何关于如何做到这一点的例子或指针。

我认为你的问题与你链接的问题有点不同。他有一个完整的STAN程序,想从C++驱动它,而你问你是否可以通过调用外部C++函数来评估一个STAN程序来评估日志的可能性。但这不会让你走得很远,因为你仍然必须以Stan可以处理的形式传递数据,向Stan声明未知参数及其支持,等等。因此,我认为你不能也不应该逃避学习Stan语言

但是,将C++函数暴露给Stan语言相当容易,这基本上只需要在${StasiHOL}/LB/StasyMasth$${Stut/Max/下,在正确的位置添加MyLogLogRoopHoo.HPP文件,将包含语句添加到该子目录中的Mth.HPP文件中,并编辑${StasiHON}。/src/stan/lang/function\u signatures.h。在这一点上,你的.stan程序看起来就像 资料{ //声明y、X等数据。 } 参数{ //声明像θ这样的参数 } 模型{ //打电话给y~我的loglikhood\u logtheta,X } 但我认为你的问题的真正答案是,如果你已经编写了一个C++函数来评估日志的可能性,那么用STAN语言重写它不应该花费几分钟。Stan language是非常类似C的,所以将.STAN文件解析成C++源文件更容易。下面是我为回归上下文中条件高斯结果的对数可能性编写的Stan函数: 功能{ /** *用多元正态分布的对数增加对数后验值 *所有误差的标量标准偏差的可能性 *相当于y~normalintercept+X*beta,sigma,但速度更快 *@paramβ系数向量,不包括截距 *@param b OLS系数的预计算向量,不包括截距 *@param中间矩阵,不包括通常预先计算为crossprodX的矩阵 *@param intercept标量假设X居中 *@param ybar预计算结果的样本平均值 *@param SSR残差平方和的正预计算值 *@param sigma误差标准偏差的正值 *@param N整数等于观察数 */ void ll_mvn_ols_lpu向量beta,向量b,矩阵中间, 真正的拦截,真正的ybar, 实SSR,实sigma,int N{ 增量对数概率-0.5*四元形式对称,β-b+ N*平方截距-ybar+SSR/ 平方西格玛-0.91…是logsqrt2*pi N*logsigma+0.91893853320467267; } } 这基本上就是我将原本可能是C语法的东西转储到Stan语言的函数体中,然后在.Stan程序的模型块中调用该函数体


所以,简而言之,我认为把你的C++函数改写为STAN函数可能是最容易的。然而,您的日志可能性可能涉及一些目前没有相应的Stan语法的异国情调。在这种情况下,您可以回到将C++函数暴露给Stan语言,并且理想地在STANDEV下在GITHUB上对数学和STAN库进行拉取请求,这样其他人就可以使用它,尽管如此,您还必须编写单元测试、文档等。p> 进一步检查后,您可能希望不接受我之前的答案,您可以尝试以下方法:编写一个.stan程序,在函数块中使用用户定义的函数,该函数具有正确的签名和解析,但基本上什么都不做。这样地 功能{ 实foo_logreal[]y,向量β,矩阵X,实σ{ 返回NOTIAL号;/ /在解析后将其替换为C++ } } 资料{ int N; int K; 矩阵[N,K]X; 实y[N]; } 参数{ 向量[K]β; 实西格玛; } 模型{ y~foobeta,X,sigma; //这里的前科 } 然后,使用CmdStan编译该模型,该模型将生成一个.hpp文件作为中间步骤。在PooSQL日志中编辑.HPP文件,调用模板化的C++函数,还包括定义文件的头文件。然后重新编译并执行二进制文件


<>这可能对你有用,但是如果你做的任何事情都有用的话,我们希望你能贡献出C++的东西。< / P>谢谢你的详细回答,本。我的问题是,日志可能
已经写了100行的C++代码,利用了我编写的许多C++类,所以把整个东西重新写到STAN语言中是浪费的,所以STAN编译器可以将它转换回C++。我希望有一种方法来为先验和对数似然写C++函数,然后把它们传递给STH-HMC函数——这是完全可能的吗?也许你可以编写一个STAN程序,填充除了模型之外的所有块,用CmdStan解析成C++,从生成的类继承。重写继承类中的LogyPROB方法调用C++函数,需要对其进行模板化,以便处理Stan的自定义标量类型,克服任何意外的出现,编译修改后的C++源,并希望得到最好的结果。但我仍然认为,最好选择我在主要回答中提到的路线之一。无论在这个Stan项目上浪费了多少时间,都将在下一个项目上为您提供很好的服务。我想我将在.Stan文件中编写模型-它看起来更简单!非常感谢你的帮助,本。我在周末刚刚完成了这项工作,但我现在需要做一段时间的其他工作:我正在尝试一个非齐次泊松过程模型,其中瞬时速率非常复杂,似然函数中的积分也非常复杂。这是非常具体的,所以我不认为这将是一个有价值的贡献,不幸的是。除非我能想出一种方法来推广这个模型,否则我会想一想。再次感谢。我得到了一些基本的例子,再次感谢你的解决方案!我想知道你是否认为有人会对一些例子感兴趣,以及我可以在哪里发布它?也许是GitHub wiki?我不知道它是否会让你创建一个新页面,但我们中的一个人可以为你推送它,或者我们可能会更改权限。我现在已经把它全部放在GitHub上了。我举了一个例子,用50个y~Nmu观测值对μ和sigma的后验值进行采样,sigma的速度大约是正常Stan等效值的两倍。我猜是因为我没有编写任何渐变?