关于算法:R语言Gibbs抽样的贝叶斯简单线性回归仿真分析

54次阅读

共计 2172 个字符,预计需要花费 6 分钟才能阅读完成。

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

贝叶斯剖析的许多介绍都应用了绝对简略的教学实例(例如依据伯努利数据给出胜利概率的推理)。尽管这能够很好地介绍贝叶斯原理,然而将这些原理扩大到回归并不是间接的。

这篇文章将概述这些原理如何扩大到简略的线性回归。我将导出感兴趣参数的后验条件散布,给出用于实现 Gibbs 采样器的 R 代码,并提出所谓的网格办法。

贝叶斯模型

假如咱们察看数据

对于咱们的模型​是

乏味的是推断​和​。如果咱们将正态先验放在系数上,将反伽玛先验放在方差项上,则此数据的残缺贝叶斯模型能够写为:

假如超参数​是已知的,后验能够被写入到一个比例常数,

括号中的项是是数据的联结散布或概率。其余项包含参数的联结先验散布。

R 代码从指定的“实在”参数模型生成数据。咱们稍后将用这个数据预计贝叶斯回归模型来查看是否能够复原这些实在的参数。

 tphi<-rinvgamma(1, shape=a, rate=g)
tb0<-rnorm(1, m0, sqrt(t0) )
tb1<-rnorm(1, m1, sqrt(t1) )
tphi; tb0; tb1;

y<-rnorm(n, tb0 + tb1*x, sqrt(tphi))

吉布斯采样器

要从这种后验散布中得出,咱们能够应用 Gibbs 采样算法。吉布斯采样是一种迭代算法,从每个感兴趣的参数的后验散布生成样本。它通过以下形式从每个参数的条件后验散布顺次得出的:

能够看出,剩下的 1,000 个样本是从后验散布中抽取的。这些样本不是独立的。每个步骤都取决于先前的地位。

条件后验散布

要应用 Gibbs,咱们须要确定每个参数的条件后验。

为了找到参数的条件后验,咱们简略地删除不蕴含参数后验的所有项。例如,常数项条件后验:

类似地,

条件后验能够被认为是另一个逆伽马散布。

条件后验​不那么容易辨认。然而如果应用网格办法,咱们不须要通过代数办法。

​思考网格办法。网格办法是暴力办法,从其条件后验散布进行抽样。这个条件散布只是一个函数​。所以咱们能够评估密度​值。在 R 中,能够是 grid = seq(-10,10,by = .001)。这个序列是点的“网格”。

那么在每个网格点评估的条件后验散布通知咱们这个抽样的绝对概率。

而后,咱们能够应用 R 中的 sample()函数从这些网格中抽取,抽样概率与网格处的密度评估成比例。

 for(i in 1:length(p) ){p[i]<- (-(1/(2*phi))*sum((y - (grid[i]+b1*x))^2 ))  + (-(1/(2*t0))*(grid[i] - m0)^2)
  }
  

  draw<-sample(grid, size = 1, prob = exp(1-p/max(p))) 

这在 R 代码的第一局部的函数 rb0cond()和 rb1cond()中实现。

应用网格办法时遇到数值问题是很常见的。因为咱们在评估网格中未标准化的后验,因而后果可能会变得相当大或很小。可能会在 R 中产生 Inf 和 -Inf 值。

例如,在函数 rb0cond()和 rb1cond()中,我实际上评估了条件后验散布的对数。而后,我进行归一化和对数化。

咱们不须要应用网格办法来从后验条件抽样,因为它来自已知的散布​。

请留神,这种网格办法有一些毛病。

首先,这在计算上是简单的。通过代数,心愿失去一个已知的后验散布,从而在计算上更有效率。

其次,网格办法须要指定网格点的区域。如果条件后验在咱们指定的 [-10,10] 的网格区间之外具备显着的密度,在这种状况下,咱们不会从条件后验失去精确的样本。并且须要宽泛的网格区间进行试验。所以,咱们须要灵便地解决数字问题,例如在 R 中靠近 Inf 和 -Inf 值的数字。

仿真后果

当初咱们能够从每个参数的条件后验进行采样,咱们能够实现 Gibbs 采样器。

iter<-1000
burnin<-101
phi<-b0<-b1<-numeric(iter)
phi[1]<-b0[1]<-b1[1]<-6 

后果很好。下图显示了 1000 个吉布斯(Gibbs)样本的序列。红线示意咱们模仿数据的实在参数值。第四幅图显示了截距和斜率项的后验联结散布,红线示意等高线。

z <- kde2d(b0, b1, n=50)
plot(b0,b1, pch=19, cex=.4)
contour(z, drawlabels=FALSE, nlevels=10, col='red', add=TRUE)

总结一下,咱们首先推导了一个表达式,用于参数的联结散布。而后咱们概述了从后验抽取样本的 Gibbs 算法。在这个过程中,咱们意识到 Gibbs 办法依赖于每个参数的条件后验散布,这是容易辨认的已知的散布。对于斜率和截距项,咱们决定用网格办法来躲避代数办法。这样做的益处是咱们能够绕开很多代数运算。代价是减少了计算复杂性。

参考文献

1.matlab 应用贝叶斯优化的深度学习

2.matlab 贝叶斯隐马尔可夫 hmm 模型实现

3.R 语言 Gibbs 抽样的贝叶斯简略线性回归仿真

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

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

6.Python 用 PyMC3 实现贝叶斯线性回归模型

7.R 语言应用贝叶斯 层次模型进行空间数据分析

8.R 语言随机搜寻变量抉择 SSVS 预计贝叶斯向量自回归(BVAR)模型

9.matlab 贝叶斯隐马尔可夫 hmm 模型实现

正文完
 0