R语言使用Metropolis-Hastings采样算法自适应贝叶斯估计与可视化|附代码数据

码海映风使
• 阅读 846

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

原文出处:拓端数据部落公众号

 最近我们被客户要求撰写关于Metropolis-Hastings采样的研究报告,包括一些图形和统计输出。

如果您可以写出模型的似然函数,则 Metropolis-Hastings算法可以负责其余部分(即MCMC )。我写了r代码来简化对任意模型的后验分布的估计。具体如下:

1)定义模型(即概率先验)。在此示例中,让我们构建一个简单的线性回归模型(对数)。



a<-pars[1]      #截距

b<-pars[2]      #斜率

sd_e<-pars[3]   #残差

if(sd_e<=0){return(NaN)}



log_likelihood<-sum( dnorm(data[,2],pred,sd_e, log=TRUE) )

先验:


epsilon<-pars[3]    #残差



prior_a<-dnorm(a,0,100,log=TRUE)     ##所有的非信息性先验

prior_b<-dnorm(b,0,100,log=TRUE)     ## 参数.

prior_epsilon<-dgamma(epsilon,1,1/100,log=TRUE)

现在让我们模拟一些数据以进行运行测试:

x<-runif(30,5,15)

y<-x+rnorm(30,0,5) ##斜率=1, 截距=0, epsilon=5

R语言使用Metropolis-Hastings采样算法自适应贝叶斯估计与可视化|附代码数据

2)Metro Hastings 完成所有工作。

MH(li_func=li_reg,pars=c(0,1,1),

3)您可以使用plotMH()查看所有模型参数的后验

plot(mcmc)

R语言使用Metropolis-Hastings采样算法自适应贝叶斯估计与可视化|附代码数据

绘制所有参数之间的相关性。

R语言使用Metropolis-Hastings采样算法自适应贝叶斯估计与可视化|附代码数据

4)输出后验置信区间。

BCI

#              0.025    0.975

# a       -5.3345970 6.841016

# b        0.4216079 1.690075

# epsilon  3.8863393 6.660037

接下来,我想提供一种直观的方法来可视化此算法运行的情况。

主要思想是从分布中抽取样本。积分很重要,贝叶斯定理本身:

P(θ| D)= P(D |θ)P(θ)/ P(D)

其中P(D)是观察数据的无条件概率。由于这不依赖于推断的模型(θ)参数,因此P(D)是归一化常数。

因此,我们有一个非归一化的概率密度函数,我们希望通过随机抽样来估计。对于复杂的模型而言,随机抽样本身的过程通常很困难,因此,我们使用马尔可夫链来探索分布。我们需要一个链,如果运行时间足够长,它将作为目标分布的随机样本整体。我们构建的马尔可夫链的这种特性称为 遍历性。Metropolis-Hastings算法是构建这种链的一种方法。

步骤:

  1. 在参数空间k_X中选择一些起点
  2. 选择一个候选点k_Y〜N(k_X,σ)。这通常称为提议分布
  3. 移至候选点的概率为:min(π(k_Y)/π(K_X),1)
  4. 重复。

以下代码通过简单的正态目标分布演示了此过程。


###     Metropolis-Hastings 可视化                #######



k_X = seed; ##将k_X设置为种子位置




for(i in 1:iter)

{

track<-c(track,k_X)    ## 链

k_Y = rnorm(1,k_X,prop_sd) ##候选点



## -- 绘制链的核密度估计





lines(density(track,adjust=1.5),col='red',lwd=2)



## -- 绘制链


plot(track,1:i,xlim=plot_range,main='',type='l',ylab='Trace')




## -- 绘制目标分布和提议分布 



curve(dnorm(x,k_X,prop_sd),col='black',add=TRUE)

abline(v=k_X,lwd=2)




## 接受概率为a_X_Y 

if (log(runif(1))<=a_X_Y)



points(k_Y,0,pch=19,col='green',cex=2)



## 调整提议

if(i>100)

prop_sd=sd(track[floor(i/2):i])

 

该算法实现中的一个普遍问题是σ的选择。当σ接近目标分布的标准偏差时,将发生有效混合(链收敛到目标分布)。当我们不知道这个值时。我们可以允许σ根据到目前为止的链历史记录进行调整。在上面的示例中,将σ更新为链中某些先验点的标准偏差值。

输出为多页pdf,可以滚动浏览。

R语言使用Metropolis-Hastings采样算法自适应贝叶斯估计与可视化|附代码数据

R语言使用Metropolis-Hastings采样算法自适应贝叶斯估计与可视化|附代码数据

R语言使用Metropolis-Hastings采样算法自适应贝叶斯估计与可视化|附代码数据

R语言使用Metropolis-Hastings采样算法自适应贝叶斯估计与可视化|附代码数据

顶部显示了目标分布(蓝色虚线)和通过MCMC样本对目标进行的核平滑估计。第二面板显示了链的轨迹,底部显示了算法本身的步骤。

注意:请注意,前100次左右的迭代是目标分布的较差表示。在实践中,我们将“预烧”该链的前n个迭代-通常是前100-1000个。

 

 

 


R语言使用Metropolis-Hastings采样算法自适应贝叶斯估计与可视化|附代码数据

最受欢迎的见解

1.使用R语言进行METROPLIS-IN-GIBBS采样和MCMC运行

2.R语言中的Stan概率编程MCMC采样的贝叶斯模型

3.R语言实现MCMC中的Metropolis–Hastings算法与吉布斯采样

4.R语言BUGS JAGS贝叶斯分析 马尔科夫链蒙特卡洛方法(MCMC)采样

5.R语言中的block Gibbs吉布斯采样贝叶斯多元线性回归

6.R语言Gibbs抽样的贝叶斯简单线性回归仿真分析

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

8.R语言使用Metropolis- Hasting抽样算法进行逻辑回归

9.R语言中基于混合数据抽样(MIDAS)回归的HAR-RV模型预测GDP增长

 

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
PPDB:今晚老齐直播
【今晚老齐直播】今晚(本周三晚)20:0021:00小白开始“用”飞桨(https://www.oschina.net/action/visit/ad?id1185)由PPDE(飞桨(https://www.oschina.net/action/visit/ad?id1185)开发者专家计划)成员老齐,为深度学习小白指点迷津。
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
PhoneGap设置Icon
参考:http://cordova.apache.org/docs/en/latest/config\_ref/images.html通过config.xml中的<icon标签来设置Icon<iconsrc"res/ios/icon.png"platform"ios"width"57"height"57"densi
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这