首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >R语言BUGS/JAGS贝叶斯分析: 马尔科夫链蒙特卡洛方法(MCMC)采样|附代码数据

R语言BUGS/JAGS贝叶斯分析: 马尔科夫链蒙特卡洛方法(MCMC)采样|附代码数据

原创
作者头像
拓端
发布于 2023-06-22 02:49:00
发布于 2023-06-22 02:49:00
35001
代码可运行
举报
文章被收录于专栏:拓端tecdat拓端tecdat
运行总次数:1
代码可运行

全文链接:http://tecdat.cn/?p=17884

最近我们被客户要求撰写关于BUGS/JAGS贝叶斯分析的研究报告,包括一些图形和统计输出。

在许多情况下,我们没有足够的计算能力评估空间中所有n维像素的后验概率 。在这些情况下,我们倾向于利用称为Markov-Chain Monte Carlo 算法的程序 。此方法使用参数空间中的随机跳跃来(最终)确定后验分布

相关视频:马尔可夫链原理可视化解释与R语言区制转换Markov regime switching实例

马尔可夫链原理可视化解释与R语言区制转换Markov regime switching实例

相关视频

马尔可夫链蒙特卡罗方法MCMC原理与R语言实现

,时长08:47

马尔科夫链蒙特卡洛方法

MCMC的关键如下:

跳跃概率的比例与后验概率的比例成正比。

跳跃概率可以表征为:

概率(跳跃)*概率(接受)

从长远来看,该链将花费大量时间在参数空间的高概率部分,从而实质上捕获了后验分布。有了足够的跳跃,长期分布将与联合后验概率分布匹配。

MCMC本质上是一种特殊类型的随机数生成器,旨在从难以描述(例如,多元,分层)的概率分布中采样。在许多/大多数情况下,后验分布是很难描述的概率分布。

MCMC使您可以从实际上不可能完全定义的概率分布中进行采样!

令人惊讶的是,MCMC的核心并不难于描述或实施。让我们看一个简单的MCMC算法。

Metropolis-Hastings算法

该算法与模拟退火算法非常相似。

MH算法可以表示为:

Prob(acceptB | A)= min(1,Posterior(B)Posterior(A)⋅Prob(b→a)Prob(a→b))

请注意,从本质上讲,这与“ Metropolis”模拟退火算法相同,后验概率代替了概率,并且 k 参数设置为1。

二元正态例子

请记住,MCMC采样器只是随机数生成器的一种。我们可以使用Metropolis-Hastings采样器来开发自己的随机数生成器,生成进行简单的已知分布。在此示例中,我们使用MH采样器从标准双变量正态概率分布生成随机数。

对于这个简单的示例,我们不需要MCMC采样器。一种实现方法是使用以下代码,该代码从具有相关参数ρ的双变量标准正态分布中绘制并可视化任意数量的独立样本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#################
#MCMC采样的简单示例
#################
#########
# #首先,让我们构建一个从双变量标准正态分布生成随机数的函数
rbvn<-function (n, rho)   #用于从二元标准正态分布中提取任意数量的独立样本。
{
        x <- rnorm(n, 0, 1)
        y <- rnorm(n, rho * x, sqrt(1 - rho^2))
        cbind(x, y)
}
#########
# 现在,从该分布图中绘制随机抽样 
bvn<-rbvn(10000,0.98)
par(mfrow=c(3,2))
plot(bvn,col=1:10000
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
###############
# #Metropolis-Hastings双变量正态采样器的实现...
library(mvtnorm)    # 加载一个包,该包使我们能够计算mv正态分布的概率密度
metropoli<- function (n, rho=0.98){    # 双变量随机数生成器的MCMC采样器实现
    mat <- matrix(ncol = 2, nrow = n)   # 用于存储随机样本的矩阵
    x <- 0   # 所有参数的初始值
    prev <- dmvnorm(c(x,y),mean=c(0,0),sig
 # 起始位置分布的概率密度
    mat[1, ] <- c(x, y)        # 初始化马尔可夫链
      newx <- rnorm(1,x,0.5)     # 进行跳转 
      newprob <- dmvnorm(c(newx,newy),sigma =
  # 评估跳转
      ratio <- newprob/prev   # 计算旧位置(跳出)和建议位置(跳到)的概率之比。
      prob.accept <- min(1,ratio)     # 决定接受新跳跃的概率!
      if(rand<=prob.accept){
        x=newx;y=newy    # 将x和y设置为新位置
        mat[counter,] <- c(x,y)    # 将其存储在存储阵列中
        prev <- newprob    # 准备下一次迭代

然后,我们可以使用MH采样器从该已知分布中获取随机样本…

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
###########
# 测试新的M-H采样器
bvn<-metropoli(10000,0.98)
par(mfrow=c(3,2))
plot(bvn,col=1:10000)
plot(bvn,type=

让我们尝试解决一个问题。

MCMC对粘液瘤病进行调查

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
############
#黏液病示例的MCMC实现
############
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 subset(MyxDat,grade==1
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##   grade day titer
## 1     1   2 5.207
## 2     1   2 5.734
## 3     1   2 6.613
## 4     1   3 5.997
## 5     1   3 6.612
## 6     1   3 6.810

选择使用Gamma分布。这是经验分布:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
###########
# 第100次可视化粘液病数据
hist(Myx$titer,freq=FALSE)

我们需要估算最适合此经验分布的伽马速率和形状参数。这是适合此分布的Gamma的一个示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#########
# ...覆盖生成模型的数据(伽玛分布)
curve(dgamma(x,shape=40,scale=0.15),add=T,col="red")

二维(对数)似然面:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##############
# 定义二维参数空间
##############
shapevec <- seq(3,100,by=0.1)   
scalevec <- seq(0.01,0.5,by=0.001)
##############
# #定义参数空间内此网格上的似然面
##############
GammaLogLikelihoodFunction <- function(par
}
surface2D <- matrix(nrow=length(shapevec),ncol=length(scalevec))   #初始化存储变量
newparams <- c(sha
    surface2D[i,j] <- GammaLogLikelihoodFunction(newparams) 
############
# 可视化似然面
############
contour(x=shapevec,y=scalevec,z=surface2D,levels=c(-30,-40,-80,-500),add=T)

这是MH算法的实现,用于找到后验分布!

首先,我们需要一个似然函数–这次,我们将返回真实概率–而不是对数转换的概率

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
############
#编写非对数转换的似然函数
GammaLike- function(params){
  prod(dgamma(Myx$titer,shape=params['shape']
params <- c(shape=40,
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## shape scale 
## 40.00  0.15
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GammaLike(params)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] 2.906766e-22
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GammaLogLike(params)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] -49.58983

然后,我们需要预先分配参数!在这种情况下,我们分配gamma(shape = 0.01,scale = 100)和gamma(shape = 0.1,scale = 10)的分布(均值为1且方差略低):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#############
# 函数返回参数空间中任意点的先验概率密度
GammaPriorFunction <- function(params){
  prior <- c(shape=NA,scale=NA)
],3,100)        
  # prior['scale'] <- dunif(params['
GammaLogPriorFunction <- function(params){
  prior <- c(shape=NA,scale=NA)
'],shape=0.001,scale=1000,log=T)
  # prior['shape'] <- dunif(params['shape'],3,100)        
  # prior['scale'] <- dunif(params['
curve(dgamma(x,shape=0.01,scale=1000),3,100)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
params
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## shape scale 
## 40.00  0.15
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GammaPrior(params)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] 1.104038e-06
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
prior2D <- matrix(nrow=length(shapevec),ncol=length(scalevec))   # 初始化存储变量
newparams <- c(shape=50,scale=0 
  for(j in 1:length(scalevec)){
    newparams['scale'] <- sca 
############
# 可视化似然面
############
image(x=shapevec,y=scalevec,z=prior2D,zlim
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
contour(x=shapevec,y=scalevec,z=prior2D,levels=c(-30,-40,-80,-500),add=T)

我们假设形状和比例 在先验中是 独立的(联合先验的乘法概率)。然而,并没有对后验参数相关性提出相同的假设,因为概率可以反映在后验分布中。

然后,我们需要一个函数,该函数可以计算参数空间中任何给定跳转的后验概率比率。因为我们正在处理 后验概率的 比率,所以 我们不需要计算归一化常数

无需归一化常数,我们只需要计算加权似然比(即先验加权的似然比)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
############
# 函数用于计算参数空间中任意两点之间的后验密度比
PosteriorRatio <- function(oldguess,newguess
  oldLik <- max(1e-90,GammaLikelihoodFunction(oldguess))   # 计算旧猜测的可能性和先验密度
  newLik <- GammaLikelihoodFunction(newguess)             # 在新的猜测值下计算可能性和先验密度
  return((newLik*newPrior)/(oldLik*oldPrior))          # 计算加权似然比
}
PosteriorRatio2 <- function(oldguess,newguess){
  oldLogLik <- GammaLogLikelihoodFunction(oldguess)   # 计算旧猜测的可能性和先验密度
  newLogLik <- GammaLogLikelihoodFunction(newguess)             # 在新的猜测值下计算可能性和先验密度
  return(exp((newLogLik+newLogPrior)-(oldLogLik+oldLogPrior)))          # 计算加权似然比
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] 0.01436301
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PosteriorRatio2(oldguess,newguess)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] 0.01436301

然后,我们需要一个函数进行新的推测或在参数空间中跳转:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
############
# 为参数空间中的跳转定义:使用正态分布函数进行新的推测
newGuess <- function(oldguess)
  jump <- c(shape=rnorm(1,mean=0,sd=sdshapejump),scale=rnorm(1,0,sdscalejump))
  newguess <- abs(oldguess + ju
}
  # 在原始推测附近设置新的推测
newGuess(oldguess=params)   
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##      shape      scale 
## 35.7132110  0.1576337
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
newGuess(oldguess=params)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##      shape      scale 
## 45.1202345  0.2094243
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
newGuess(oldguess=params)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##       shape       scale 
## 42.87840436  0.08152061

现在,我们准备实现Metropolis-Hastings MCMC算法:

我们需要一个初始点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##########
# 在参数spacer中设置起点
startingvals <- c(shape=75,scale=0.28)    # 算法的起点

测试函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
###########
# 尝试我们的新函数
newguess <- newGuess(startingvals)    # 在参数空间中跳跃
newguess
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##      shape      scale 
## 73.9663949  0.3149796
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PosteriorRatio2(startingvals,newguess)   # 后验比例差异
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## [1] 2.922783e-57

现在让我们看一下Metropolis-Hastings:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
###############
#可视化Metropolis-Hastings
chain.length <- 11
gth,ncol=2)
colnames(guesses) <- names(startingvals)
guesses[1,] <- startingvals
counter <- 2
  post.rat <- PosteriorRatio2(oldguess,newguess)
  prob.accept <- min(1,post
    oldguess <- newguess
    guesses[coun
#可视化
contour(x=shapevec,y=scal

我们运行更长的时间 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##########
# 获取更多MCMC示例
chain.length <- 100
oldgu
counter <- 2
while(counter <= chain.length){
  newguess <- newGuess(oldguess)
  post.rat <- Posterio
  rand <- runif(1)
  if(rand<=prob.accept){
ewguess 
    counter=counte
#可视化
image(x=shapevec,y=scalevec,z=su
urface2D,levels=c(-30,-40,-80,-5
lines(guesses,col="red")

更长的时间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
############
#更长的时间
chain.length <- 1000
oldguess <- startingvals
chain.length,ncol=2)
colnames(guesses) <- names(startingvals)
guesses[1,] <- startingva
ess)
  post.rat <- PosteriorRatio2(oldguess,newguess)
  prob.accept <- min(1,post.rat)
  rand <- runif(1)
    guesse
#可视化
image(x=shapevec,y=scalevec,
rface2D,levels=c(-30,-40,-80,-500),a

看起来更好!搜索算法可以很好地找到参数空间的高似然部分!

现在,让我们看一下“ shape”参数的链

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#############
# 评估MCMC样本的“轨迹图” ...
##### Shape 参数
plot(1:chain.length,guesses[,'sha

对于比例参数 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
###### 比例参数 
plot(1:chain.length,guesses[,'scale'],type="l

我们可以说这些链已经收敛于形状参数的后验分布吗?

首先,链的起点“记住”起始值,因此不是固定分布。我们需要删除链的第一部分。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
############
# 删除预烧期(允许MCMC有一段时间达到后验概率)
burn.in <- 100
MCMCsamples <- guesses[-c(1:burn.in),]

但这看起来还不是很好。让我们运行更长的时间,看看是否得到的东西看起来更像是随机数生成器(白噪声)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##########
# 再试一次-运行更长的时间
chain.length <- 20000
oldguess <- startingv
o2(oldguess,newguess)
  prob.accept <- mi

让我们首先删除前5000个样本作为预烧期

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#############
# 使用更长的“预烧”
burn.in <- 5000
MCMCsamples <- guesses[-c(1:bur

现在,让我们再次看一下链条

在评估这些迹线图时,我们希望看到看起来像白噪声的“平稳分布”。该轨迹图看起来可能具有一些自相关。解决此问题的一种方法是稀疏MCMC样本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##########
# “稀疏” MCMC样本
thinnedMCMC <- MCMCsamples[seq(1,chain.length,by=5),]

现在我们可以检查我们的后验分布!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 可视化后验分布
plot(density(thinnedMCMC[,'scale'])

我们可以像以前一样可视化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#########
# 更多后验概率检察
par(mfrow=c(3,2))
plot(thinnedMCMC,col=1:10000)
plot(thinnedMCMC,type="l")

可以修改Metropolis-Hastings MCMC方法来拟合任意模型的任意数量的自由参数。但是,MH算法本身不一定是最有效和灵活的。在实验中,我们使用吉布斯采样,大多采用建模语言 BUGS 。

注意:BUGS实现(例如JAGS)实际上倾向于结合使用MH和Gibbs采样,MH和Gibbs采样器并不是唯一的MCMC例程。例如,“ stan”使用MH采样的一种改进形式,称为“ Hamiltonian Monte Carlo”。

吉布斯Gibbs采样器

Gibbs采样器非常简单有效。基本上,该算法从完整的条件 概率分布(即, 在模型中所有其他参数的已知值作为条件的条件下,对任意参数i的后验分布)中进行 连续采样 。

在很多情况下,我们不能直接制定出我们的模型后验分布,但我们 可以 分析出条件后验分布。尽管如此,即使它在分析上不易处理,我们也可以使用单变量MH程序作为最后方法。

问:为什么Gibbs采样器通常比纯MH采样器效率更高?

二元正态例子

MCMC采样器只是随机数生成器的一种。我们可以使用Gibbs采样器来开发自己的随机数生成器,以实现相当简单的已知分布。在此示例中,我们使用Gibbs采样器从标准双变量正态概率分布生成随机数。注意,吉布斯采样器在许多方面都比MH算法更简单明了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#############
#Gibbs采样器的简单示例
#############
########
# 首先,回顾一下我们简单的双变量正态采样器
rbvn<-function (n, rho){  #f函数用于从双变量标准正态分布中提取任意数量的独立样本。
        x <- rnorm(n, 0, 1)
        y <- rnorm(n, rho * x, sqrt(1 - rho^2))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#############
# 现在构造一个吉布斯采样器
gibbs<-function (n, rho){    # 双变量随机数生成器的gibbs采样器实现
    mat <- matrix(ncol = 2, nrow = n)   # 用于存储随机样本的矩阵
    mat[1, ] <- c(x, y)        # initialize the markov chain
    for (i in 2:n) {
            x <- rnorm(1, rho * y, sqrt(1 - rho^2))        # 以y为条件的x中的样本
            y <- rnorm(1, rho * x, sqrt(1 - rho^2))        # 以x为条件的y中的样本
            mat[i, ] <- c(x, y)

然后,我们可以使用Gibbs采样器从该已知分布中获取随机样本…

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##########
# 测试吉布斯采样器
plot(ts(bvn[,2]))
hist(bvn[,1],40)
hist(bvn[,2],40)

在这里,马尔可夫链的样本中有很多明显的自相关。Gibbs采样器经常有此问题。

示例

BUGS语言

最后,让我们为我们最喜欢的粘瘤病示例创建一个Gibbs采样器,为此,我们将使用BUGS语言(在JAGS中实现)来帮助我们!

JAGS,全称是Just another Gibbs sampler,是基于BUGS语言开发的利用MCMC来进行贝叶斯建模的软件包。它没有提供建模所用的GUI以及MCMC抽样的后处理,这些要在其它的程序软件上来处理,比如说利用R包(rjags)来调用JAGS并后处理MCMC的输出。JAGS相对于WinBUGS/OpenBUGS的主要优点在于平台的独立性,可以应用于各种操作系统,而WinBUGS/OpenBUGS只能应用于windows系统;JAGS也可以在64-bit平台上以64-bit应用来进行编译。

BUGS语言看起来与R类似,但是有几个主要区别:

  • 首先,BUGS是一种编译语言,因此代码中的操作顺序并不重要
  • BUGS不是矢量化的-您需要使用FOR循环
  • 在BUGS中,几个概率分布的参数差异很大。值得注意的是,正态分布通过均值和精度(1 / Variance )进行参数化。

这是用BUGS语言实现的粘液病示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model {
  #############
  # 似然
  ############
  for(obs in 1:n.observations){
    titer[obs] ~ dgamma(shape,rate
  #############
  # 先验
  ############
  rate <- 1/scale   # 将BUGS的scale参数转换为“ rate”
}

我们可以使用R中的“ cat”函数将此模型写到您的工作目录中的文本文件中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
###########
# BUGS建模语言中的粘液瘤示例
##########
# 将BUGS模型写入文件
cat("
  model {
    #############
    # 似然
    ############
    for(obs in 1:n.observations){
      titer[obs] ~ dgamma(shape,rate)
    #############
    # 先验
    ############
    shape ~ dgamma(0.001,0.001
file="BUGSmodel.txt")

现在我们已经将BUGS模型打包为文本文件,我们将数据捆绑到一个列表对象中,该列表对象包含BUGS代码中引用的所有相关数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
############
# 将数据封装到单个“列表”对象中
myx.data <- list(
  n.observations = length(Myx$titer
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## $titer
##  [1] 5.207 5.734 6.613 5.997 6.612 6.810 5.930 6.501 7.182 7.292 7.819
## [12] 7.489 6.918 6.808 6.235 6.916 4.196 7.682 8.189 7.707 7.597 7.112
## [23] 7.354 7.158 7.466 7.927 8.499
## 
## $n.observations
## [1] 27

然后,我们需要为所有参数定义初始值。将其定义为一个函数很方便,因此可以使用不同的起始值来初始化每个MCMC链。 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
###########
# 用于为所有自由参数生成随机初始值的函数
init.vals.for.bugs()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## $shape
## [1] 51.80414
## 
## $scale
## [1] 0.2202549
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
init.vals.for.bugs()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## $shape
## [1] 89.85618
## 
## $scale
## [1] 0.2678733
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
init.vals.for.bugs()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## $shape
## [1] 69.22457
## 
## $scale
## [1] 0.1728908

现在我们可以调用JAGS!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
###########
# 运行 JAGS 
##########
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## Loading required package: rjags
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## The following object is masked from 'package:coda':
## 
##     traceplot
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jags.fit <- run.jags(model="BUGSmodel.txt",
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## Compiling rjags model...
## Calling the simulation using the rjags method...
## Adapting the model for 100 iterations...
## Running the model for 5000 iterations...
## Simulation complete
## Finished running the simulation
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jags.fit)   # 转换为“ MCMC”对象(CODA包)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## 
## Iterations = 101:5100
## Thinning interval = 1 
## Number of chains = 3 
## Sample size per chain = 5000 
## 
## 1. Empirical mean and standard deviation for each variable,
##    plus standard error of the mean:
## 
##          Mean       SD  Naive SE Time-series SE
## shape 51.6013 14.36711 0.1173070       2.216657
## scale  0.1454  0.04405 0.0003597       0.006722
## 
## 2. Quantiles for each variable:
## 
##           2.5%     25%     50%     75%   97.5%
## shape 28.76333 40.9574 50.1722 60.2463 82.7532
## scale  0.08346  0.1148  0.1378  0.1687  0.2389
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plot(jagsfit.mcmc)

评估收敛

第一步是视觉检查-我们寻找以下内容来评估收敛性:

  • 当视为“轨迹图”时,每个参数的链应看起来像白噪声(模糊的毛毛虫)或类似的噪声
  • 多个具有不同起始条件的链条看起来应该相同

我们可能在这里可以做得更好的一种方法是使链条运行更长的时间,并丢弃初始样本我们还可以。

通过细化链来尝试减少自相关,我们每20个样本中仅保留1个。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
################
#运行链更长时间
jags.fit <- 
 sample = 10000,n.chains = 3,adapt = 1000,burnin = 1000,
                     summarise = FALSE,thin=20,method = "parallel" )
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## Calling 3 simulations using the parallel method...
## Following the progress of chain 1 (the program will wait for all
## chains to finish before continuing):
## Welcome to JAGS 4.2.0 on Wed Oct 23 11:33:35 2019
## JAGS is free software and comes with ABSOLUTELY NO WARRANTY
## Loading module: basemod: ok
## Loading module: bugs: ok
## . . Reading data file data.txt
## . Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 27
##    Unobserved stochastic nodes: 2
##    Total graph size: 37
## . Reading parameter file inits1.txt
## . Initializing model
## . Adapting 1000
## -------------------------------------------------| 1000
## ++++++++++++++++++++++++++++++++++++++++++++++++++ 100%
## Adaptation successful
## . Updating 1000
## -------------------------------------------------| 1000
## ************************************************** 100%
## . . . Updating 200000
## -------------------------------------------------| 200000
## ************************************************** 100%
## . . . . Updating 0
## . Deleting model
## . 
## All chains have finished
## Simulation complete.  Reading coda files...
## Coda files loaded successfully
## Finished running the simulation
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jagsfit.mcmc <- as.mcmc.list
  # 转换为“ MCMC”对象(CODA包)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## 
## Iterations = 2001:201981
## Thinning interval = 20 
## Number of chains = 3 
## Sample size per chain = 10000 
## 
## 1. Empirical mean and standard deviation for each variable,
##    plus standard error of the mean:
## 
##          Mean      SD  Naive SE Time-series SE
## shape 47.1460 12.9801 0.0749404       0.292218
## scale  0.1591  0.0482 0.0002783       0.001075
## 
## 2. Quantiles for each variable:
## 
##           2.5%     25%     50%     75%   97.5%
## shape 25.14757 37.9988 45.9142 55.1436 75.5850
## scale  0.09147  0.1256  0.1509  0.1825  0.2773
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plot(jagsfit.mcmc)

从视觉上看,这看起来更好。现在我们可以使用更多的定量收敛指标。

Gelman-Rubin诊断

一种简单而直观的收敛诊断程序是 Gelman-Rubin诊断程序,该诊断程序基于简单的蒙特卡洛误差来评估链之间是否比应有的链距更大:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##############
# 运行收敛诊断
gelman(jagsfit.mcmc)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## Potential scale reduction factors:
## 
##       Point est. Upper C.I.
## shape          1       1.00
## scale          1       1.01
## 
## Multivariate psrf
## 
## 1

通常,1.1或更高的值被认为收敛不佳。为模型中的所有可用参数计算GR诊断。如果测试失败,则应尝试运行更长的链!

所以这个模型看起来不错!

本文选自《R语言BUGS/JAGS贝叶斯分析: 马尔科夫链蒙特卡洛方法(MCMC)采样》。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
R语言BUGS/JAGS贝叶斯分析: 马尔科夫链蒙特卡洛方法(MCMC)采样|附代码数据
在许多情况下,我们没有足够的计算能力评估空间中所有n维像素的后验概率 。在这些情况下,我们倾向于利用称为Markov-Chain Monte Carlo 算法的程序 。此方法使用参数空间中的随机跳跃来(最终)确定后验分布(点击文末“阅读原文”获取完整代码数据)。
拓端
2022/10/28
1.8K0
R语言BUGS/JAGS贝叶斯分析: 马尔科夫链蒙特卡洛方法(MCMC)采样
在许多情况下,我们没有足够的计算能力评估空间中所有n维像素的后验概率 。在这些情况下,我们倾向于利用称为Markov-Chain Monte Carlo 算法的程序 。此方法使用参数空间中的随机跳跃来(最终)确定后验分布。MCMC的关键如下:
拓端
2020/11/30
2.4K0
R语言BUGS/JAGS贝叶斯分析: 马尔科夫链蒙特卡洛方法(MCMC)采样
R语言MCMC:Metropolis-Hastings采样用于回归的贝叶斯估计|附代码数据
如果需要计算有复杂后验pdf p(θ| y)的随机变量θ的函数f(θ)的平均值或期望值。
拓端
2023/04/28
4200
R语言MCMC:Metropolis-Hastings采样用于回归的贝叶斯估计|附代码数据
如果需要计算有复杂后验pdf p(θ| y)的随机变量θ的函数f(θ)的平均值或期望值。
拓端
2022/10/27
8520
R语言Gibbs抽样的贝叶斯简单线性回归仿真分析|附代码数据
最近我们被客户要求撰写关于Gibbs抽样的研究报告,包括一些图形和统计输出。 贝叶斯分析的许多介绍都使用了相对简单的教学实例(例如,根据伯努利数据给出成功概率的推理)。虽然这很好地介绍了贝叶斯原理,但是这些原则的扩展并不是直截了当的
拓端
2022/12/21
1.1K0
R语言MCMC:Metropolis-Hastings采样用于回归的贝叶斯估计
如果需要计算有复杂后验pdf p(θ| y)的随机变量θ的函数f(θ)的平均值或期望值。
拓端
2021/01/29
1.4K0
R语言MCMC:Metropolis-Hastings采样用于回归的贝叶斯估计
R语言贝叶斯MCMC:用rstan建立线性回归模型分析汽车数据和可视化诊断|附代码数据
尽管Stan提供了使用其编程语言的文档和带有例子的用户指南,但对于初学者来说,这可能是很难理解的。
拓端
2023/02/14
2.3K0
马尔可夫链蒙特卡洛(MCMC)算法
在之前的推送中我们了解到什么是马尔可夫链(Markov Chain)。下面我们来介绍一下马尔可夫链蒙特卡洛算法(Markov Chain Monte Carlo), 在此之前,我们需要回顾一下马尔可夫
量化投资与机器学习微信公众号
2018/01/29
3.5K0
R语言使用Metropolis-Hastings采样算法自适应贝叶斯估计与可视化
1)定义模型(即概率先验)。在此示例中,让我们构建一个简单的线性回归模型(对数)。
拓端
2023/09/25
3540
R语言使用Metropolis-Hastings采样算法自适应贝叶斯估计与可视化
R语言蒙特卡洛方法:方差分量的Metropolis Hastings(M-H)、吉布斯Gibbs采样比较分析
蒙特卡洛方法利用随机数从概率分布P(x)中生成样本,并从该分布中评估期望值,该期望值通常很复杂,不能用精确方法评估。在贝叶斯推理中,P(x)通常是定义在一组随机变量上的联合后验分布。然而,从这个分布中获得独立样本并不容易,这取决于取样空间的维度。因此,我们需要借助更复杂的蒙特卡洛方法来帮助简化这个问题;例如,重要性抽样、拒绝抽样、吉布斯抽样和Metropolis Hastings抽样。这些方法通常涉及从建议密度Q(x)中取样,以代替P(x)。
拓端
2021/07/16
1.2K0
R语言蒙特卡洛方法:方差分量的Metropolis Hastings(M-H)、吉布斯Gibbs采样比较分析
【深度干货】专知主题链路知识推荐#7-机器学习中似懂非懂的马尔科夫链蒙特卡洛采样(MCMC)入门教程02
【导读】主题链路知识是我们专知的核心功能之一,为用户提供AI领域系统性的知识学习服务,一站式学习人工智能的知识,包含人工智能( 机器学习、自然语言处理、计算机视觉等)、大数据、编程语言、系统架构。使用请访问专知 进行主题搜索查看 - 桌面电脑访问www.zhuanzhi.ai, 手机端访问www.zhuanzhi.ai 或关注微信公众号后台回复" 专知"进入专知,搜索主题查看。今天给大家继续介绍我们独家整理的机器学习——马尔科夫链蒙特卡洛采样(MCMC)方法。 上一次我们详细介绍了机器学习中似懂非懂的马尔
WZEARW
2018/04/08
4.1K1
【深度干货】专知主题链路知识推荐#7-机器学习中似懂非懂的马尔科夫链蒙特卡洛采样(MCMC)入门教程02
R语言coda贝叶斯MCMC Metropolis-Hastings采样链分析和收敛诊断可视化|附代码数据
最近我们被客户要求撰写关于MCMC Metropolis-Hastings采样的研究报告,包括一些图形和统计输出。
拓端
2023/09/06
4920
MCMC原理解析(马尔科夫链蒙特卡洛方法)
马尔科夫链蒙特卡洛方法(Markov Chain Monte Carlo),简称MCMC,MCMC算法的核心思想是我们已知一个概率密度函数,需要从这个概率分布中采样,来分析这个分布的一些统计特性,然而这个这个函数非常之复杂,怎么去采样?这时,就可以借助MCMC的思想。
种花家的奋斗兔
2020/11/13
3K0
MCMC原理解析(马尔科夫链蒙特卡洛方法)
R语言JAGS贝叶斯回归模型分析博士生延期毕业完成论文时间|附代码数据
本文为读者提供了如何进行贝叶斯回归的基本教程。包括完成导入数据文件、探索汇总统计和回归分析
拓端
2022/12/23
9640
PYTHON用时变马尔可夫区制转换(MARKOV REGIME SWITCHING)自回归模型分析经济时间序列|附代码数据
最近我们被客户要求撰写关于MARKOV REGIME SWITCHING的研究报告,包括一些图形和统计输出。 本文提供了一个在统计模型中使用马可夫转换模型模型的例子,来复现Kim和Nelson(1999)中提出的一些结果。它应用了Hamilton(1989)的滤波器和Kim(1994)的平滑器 ( 点击文末“阅读原文”获取完整代码数据******** ) 。
拓端
2022/11/29
1K0
R语言贝叶斯Metropolis-Hastings采样 MCMC算法理解和应用可视化案例
例如,使用的rstan包采用了一个Hamiltonian Monte Carlo算法。用于贝叶斯建模的另一个rjags包采用了Gibbs sampling算法。尽管细节有所不同,但这两种算法都是基于基本的Metropolis-Hastings算法的变体。
拓端
2023/12/14
3420
R语言贝叶斯Metropolis-Hastings采样 MCMC算法理解和应用可视化案例
使用R语言进行Metroplis-in-Gibbs采样和MCMC运行分析
这篇文章展示了我们如何使用Metropolis-Hastings(MH)从每次Gibbs迭代中的非共轭条件后验对象中进行采样–比网格方法更好的替代方法。
拓端
2020/08/07
1.4K0
R语言实现MCMC中的Metropolis–Hastings算法与吉布斯采样|附代码数据
第一步,我们创建一些测试数据,用来拟合我们的模型。我们假设预测变量和因变量之间存在线性关系,所以我们用线性模型并添加一些噪音。
拓端
2023/08/15
3900
MATLAB随机波动率SV、GARCH用MCMC马尔可夫链蒙特卡罗方法分析汇率时间序列|附代码数据
最近我们被客户要求撰写关于波动率的研究报告。 波动率是一个重要的概念,在金融和交易中有许多应用。它是期权定价的基础。波动率还可以让您确定资产配置并计算投资组合的风险价值 (VaR)。
拓端
2022/11/16
7980
R语言贝叶斯非参数模型:密度估计、非参数化随机效应meta分析心肌梗死数据|附代码数据
最近,我们使用贝叶斯非参数(BNP)混合模型进行马尔科夫链蒙特卡洛(MCMC)推断。
拓端
2024/06/25
2100
推荐阅读
R语言BUGS/JAGS贝叶斯分析: 马尔科夫链蒙特卡洛方法(MCMC)采样|附代码数据
1.8K0
R语言BUGS/JAGS贝叶斯分析: 马尔科夫链蒙特卡洛方法(MCMC)采样
2.4K0
R语言MCMC:Metropolis-Hastings采样用于回归的贝叶斯估计|附代码数据
4200
R语言MCMC:Metropolis-Hastings采样用于回归的贝叶斯估计|附代码数据
8520
R语言Gibbs抽样的贝叶斯简单线性回归仿真分析|附代码数据
1.1K0
R语言MCMC:Metropolis-Hastings采样用于回归的贝叶斯估计
1.4K0
R语言贝叶斯MCMC:用rstan建立线性回归模型分析汽车数据和可视化诊断|附代码数据
2.3K0
马尔可夫链蒙特卡洛(MCMC)算法
3.5K0
R语言使用Metropolis-Hastings采样算法自适应贝叶斯估计与可视化
3540
R语言蒙特卡洛方法:方差分量的Metropolis Hastings(M-H)、吉布斯Gibbs采样比较分析
1.2K0
【深度干货】专知主题链路知识推荐#7-机器学习中似懂非懂的马尔科夫链蒙特卡洛采样(MCMC)入门教程02
4.1K1
R语言coda贝叶斯MCMC Metropolis-Hastings采样链分析和收敛诊断可视化|附代码数据
4920
MCMC原理解析(马尔科夫链蒙特卡洛方法)
3K0
R语言JAGS贝叶斯回归模型分析博士生延期毕业完成论文时间|附代码数据
9640
PYTHON用时变马尔可夫区制转换(MARKOV REGIME SWITCHING)自回归模型分析经济时间序列|附代码数据
1K0
R语言贝叶斯Metropolis-Hastings采样 MCMC算法理解和应用可视化案例
3420
使用R语言进行Metroplis-in-Gibbs采样和MCMC运行分析
1.4K0
R语言实现MCMC中的Metropolis–Hastings算法与吉布斯采样|附代码数据
3900
MATLAB随机波动率SV、GARCH用MCMC马尔可夫链蒙特卡罗方法分析汇率时间序列|附代码数据
7980
R语言贝叶斯非参数模型:密度估计、非参数化随机效应meta分析心肌梗死数据|附代码数据
2100
相关推荐
R语言BUGS/JAGS贝叶斯分析: 马尔科夫链蒙特卡洛方法(MCMC)采样|附代码数据
更多 >
LV.9
拓端数据
目录
  • 全文链接:http://tecdat.cn/?p=17884
  • 相关视频:马尔可夫链原理可视化解释与R语言区制转换Markov regime switching实例
  • 相关视频
    • 马尔科夫链蒙特卡洛方法
    • Metropolis-Hastings算法
    • 二元正态例子
      • MCMC对粘液瘤病进行调查
    • 吉布斯Gibbs采样器
    • 二元正态例子
      • 示例
      • 评估收敛
  • Gelman-Rubin诊断
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档