对于许多模型,例如逻辑模型,没有共轭先验分布。因此,吉布斯采样不适用。
这篇文章展示了我们如何使用Metropolis-Hastings(MH)从每次Gibbs迭代中的非共轭条件后验对象中进行采样–比网格方法更好的替代方法。
我将说明该算法,给出一些R代码结果,然后分析R代码以识别MH算法中的瓶颈。
模型
此示例的模拟数据是包含患者的横截面数据集。有一个二元因变量Y,一个二元处理变量A,一个因子变量age。年龄是具有3个等级的分类变量。我用贝叶斯逻辑回归建模:
什么是sampling?
sampling就是以一定的概率分布,看发生什么事件。举一个例子。甲只能E:吃饭、学习、打球,时间T:上午、下午、晚上,天气W:晴朗、刮风、下雨。现在要一个sample,这个sample可以是:打球+下午+晴朗。
吉布斯采样的通俗解释?
问题是我们不知道p(E,T,W),或者说,不知道三件事的联合分布joint distribution。当然,如果知道的话,就没有必要用gibbs sampling了。但是,我们知道三件事的conditional distribution。也就是说,p(E|T,W),p(T|E,W),p(W|E,T)。现在要做的就是通过这三个已知的条件分布,再用gibbs sampling的方法,得到联合分布。
具体方法。首先随便初始化一个组合,i.e. 学习+晚上+刮风,然后依条件概率改变其中的一个变量。具体说,假设我们知道晚上+刮风,我们给E生成一个变量,比如,学习-》吃饭。我们再依条件概率改下一个变量,根据学习+刮风,把晚上变成上午。类似地,把刮风变成刮风(当然可以变成相同的变量)。这样学习+晚上+刮风-》吃饭+上午+刮风。同样的方法,得到一个序列,每个单元包含三个变量,也就是一个马尔可夫链。然后跳过初始的一定数量的单元(比如100个),然后隔一定的数量取一个单元(比如隔20个取1个)。这样sample到的单元,是逼近联合分布的。
对于Metroplis-in-Gibbs吉布斯采样来说,这是一个相当不错的示例:
- 我们有一个二进制结果,为此我们采用了非线性链接函数。
- 我们有一个需要调整的因素。
- 我们正在估计我们关心的更多参数,但肯定会给采样器带来压力。
非规范条件后验
让我们看一下该模型的(非标准化分布)条件后验。
此条件分布不是已知分布,因此我们不能简单地使用Gibbs从中进行采样。相反,在每个gibbs迭代中,我们需要另一个采样步骤来从该条件后验中提取。第二个采样器将是MH采样器。
可下载资源
Metroplis-in-Gibbs采样
目标是从中取样。
MH采样器的工作方式如下:
- 开始采样。
- 让我们假设将提议分布的方差设置为某个常数。
- 我们计算在上一次绘制时评估的非标准化密度与当前提议的比率:
- 如果该比率大于1,则当前提议分布的密度高于先前值的密度。因此,我们“接受”了提议并确定了。然后,我们使用以提议为中心的提议分布重复步骤2-4 ,然后生成新提议。如果该比率小于1,则当前建议值的密度低于先前建议。
因此,总是接受产生更高条件的后验评估的提议。但是,有时仅接受具有较低密度评估的提议-提议的相对密度评估越低,其接受的可能性就越低。
经过多次迭代,从后验的高密度区域开始的抽样被接受,并且被接受的序列“爬升”到高密度区域。一旦序列到达此高密度区域,它将趋于保持在那里。因此,这也类似于模拟退火。
这种表示法很容易扩展到我们的4维示例:提议分布现在是4维多元高斯模型。代替标量方差参数,我们有一个协方差矩阵。因此,我们的建议是系数的向量。从这个意义上讲,我们运行的是Gibbs –使用MH每次迭代绘制整个系数。
- 跳跃分布的方差是重要的参数。如果方差太小,则当前提议可能会非常接近最后一个值,因此也很可能接近1。因此,我们会非常频繁地接受,但由于接受的值彼此之间非常接近,因此我们会攀升至较高在许多次迭代中慢慢降低密度区域。如果方差太大,则序列到达高密度区域后可能无法保留在该区域。
- 许多“自适应” MH方法是此处描述的基本算法的变体,但包括调整周期以找到产生最佳接受率的跳跃分布方差。
- MH中计算量最大的部分是密度评估。对于每个Gibbs迭代,我们必须两次评估4维密度。
- 尽管很容易扩展到高维度,但性能本身在高维度上会变差。
结果
这是我们感兴趣的4个参数的MCMC链。红线表示真实值。
profvis(expr = {
for(i in 2:gibbs_iter){
# 来自 phi 后验分布的样本
gibbs_res[i,p+1] <- rcond_post_phi(gibbs_res[i-1,1:p],
alpha, gamma, lambda, p)
# 来自beta后验分布的样本 ( 使用 Mh )
mh_draw <- rcond_post_beta_mh(gibbs_res[i-1,1:p], gibbs_res[i,p+1],
lambda, X, Y, mh_trials=5, jump_v=.01)
}
})
par(mfrow=c(2,2))
plot(gibbs_res[,1],type='l',xlab='MCMC Iterations',ylab=c('Coefficient Draw'),
main='Intercept')
abline(h=-1,col='red')
plot(gibbs_res[,2],type='l',xlab='MCMC Iterations',ylab=c('Coefficient Draw'),
main='Age1')
abline(h=.7,col='red')
plot(gibbs_res[,3],type='l',xlab='MCMC Iterations',ylab=c('Coefficient Draw'),
main='Age2')
abline(h=1.1,col='red')
plot(gibbs_res[,4],type='l',xlab='MCMC Iterations',ylab=c('Coefficient Draw'),
main='Treatment')
abline(h=1.1,col='red')
# 计算后验分布和置信区间
post_burn_trim<-gibbs_res[seq(1000,gibbs_iter,100),]
colMeans(post_burn_trim)
apply(post_burn_trim, 2, quantile, p=c(.025,.975))
有一些改进的空间:
- 接受率只有18%,我本可以调整跳跃分布协方差矩阵来获得更好的接受率。
- 我认为更多的迭代肯定会在这里有所帮助。这些链看起来不错,但仍然是自相关的。
关于贝叶斯范式的好处是,所有推断都是使用后验分布完成的。现在,系数估计值是对数化,但是如果我们需要比值,则只需对后验取幂。
如果我们想要对比值进行区间估计,那么我们就可以获取指数后验的2.5%和97.5%。
下面是使用R分析,显示了这一点。for循环运行Gibbs迭代。在每个Gibbs迭代中,我都调用函数使用MH从参数向量的条件后验中得出图形。
随时关注您喜欢的主题
我们看到子例程log_cond()是MH运行中的瓶颈。此函数是beta的对数条件后验密度。
可下载资源
关于作者
Kaizong Ye是拓端研究室(TRL)的研究员。Kaizong Ye是拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。
本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。
非常感谢您阅读本文,如需帮助请联系我们!