前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言用Rcpp加速Metropolis-Hastings抽样估计贝叶斯逻辑回归模型的参数

R语言用Rcpp加速Metropolis-Hastings抽样估计贝叶斯逻辑回归模型的参数

作者头像
拓端
发布2021-07-16 15:23:20
5690
发布2021-07-16 15:23:20
举报
文章被收录于专栏:拓端tecdat

原文链接:http://tecdat.cn/?p=6690

在最近的一篇文章中,我描述了一个Metropolis-in-Gibbs采样器,用于估计贝叶斯逻辑回归模型的参数。

这篇文章就此问题进行了研究,以展示Rcpp如何帮助克服这一瓶颈。 TLDR:只需用C ++编写log-posterior而不是矢量化R函数,我们就可以大大减少运行时间。

我模拟了模型的数据:

对于这个分析,我编写了两个Metropolis-Hastings(MH)采样器:sample\_mh()和sample\_mh\_cpp()。前者使用对数后验编码作为向量化R函数。后者使用C ++(log\_post.cpp)中的log-posterior编码,并使用Rcpp编译成R函数。Armadillo库对C ++中的矩阵和向量类很有用。


因此,在每次迭代中,提出了系数向量。下面用红线表示链,表示生成数据的参数值。

代码语言:javascript
复制
burnin <- 1000
iter <- 100000
p <- ncol(X)
cpp(X, Y, iter = iter, jump = .03)
par(mfrow=c(2,2))
plot(mh_cpp\[\[1\]\]\[burnin:iter,'intercept'\])
abline(h= -1, col='red')

似乎趋同。平均接受概率在采样运行中收敛到约20%。

那么Rcpp实现与R实现相比如何呢?Rcpp的运行时间明显较低。当log-posterior被编码为矢量化R函数时,采样器相对于Rcpp实现运行速度大约慢7倍(样本大小为100)。下图显示了样本大小为100到5000的相对运行时间,增量为500。

代码语言:javascript
复制
for(i in 1:length(s){

 benchmark(mh(X, Y, iter = iter)

  time\[i\] <- time/rcpp

plot(ss, time)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 拓端数据部落 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原文链接:http://tecdat.cn/?p=6690
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档