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

简介: R语言使用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

2)Metro Hastings 完成所有工作。


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

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



plot(mcmc)

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

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,可以滚动浏览。


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

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

 


相关文章
|
4月前
|
数据可视化 数据挖掘 图形学
R语言基础可视化:使用ggplot2构建精美图形的探索
【8月更文挑战第29天】 `ggplot2`是R语言中一个非常强大的图形构建工具,它基于图形语法提供了一种灵活且直观的方式来创建各种统计图形。通过掌握`ggplot2`的基本用法和美化技巧,你可以轻松地将复杂的数据转化为直观易懂的图形,从而更好地理解和展示你的数据分析结果。希望本文能够为你探索`ggplot2`的世界提供一些帮助和启发。
|
4月前
|
数据可视化 数据挖掘 数据处理
R语言高级可视化技巧:使用Plotly与Shiny制作互动图表
【8月更文挑战第30天】通过使用`plotly`和`shiny`,我们可以轻松地创建高度互动的数据可视化图表。这不仅增强了图表的表现力,还提高了用户与数据的交互性,使得数据探索变得更加直观和高效。本文仅介绍了基本的使用方法,`plotly`和`shiny`还提供了更多高级功能和自定义选项,等待你去探索和发现。希望这篇文章能帮助你掌握使用`plotly`和`shiny`制作互动图表的技巧,并在你的数据分析和可视化工作中发挥更大的作用。
|
7月前
|
数据可视化 数据挖掘 API
【R语言实战】聚类分析及可视化
【R语言实战】聚类分析及可视化
|
3月前
|
机器学习/深度学习 算法 数据挖掘
R语言中的支持向量机(SVM)与K最近邻(KNN)算法实现与应用
【9月更文挑战第2天】无论是支持向量机还是K最近邻算法,都是机器学习中非常重要的分类算法。它们在R语言中的实现相对简单,但各有其优缺点和适用场景。在实际应用中,应根据数据的特性、任务的需求以及计算资源的限制来选择合适的算法。通过不断地实践和探索,我们可以更好地掌握这些算法并应用到实际的数据分析和机器学习任务中。
|
4月前
|
数据可视化
R语言可视化设计原则:打造吸引力十足的数据可视化
【8月更文挑战第30天】R语言可视化设计是一个综合性的过程,需要综合运用多个设计原则来创作出吸引力十足的作品。通过明确目标、选择合适的图表类型、合理运用色彩与视觉层次、明确标注与引导视线以及引入互动性与动态效果等原则的应用,你可以显著提升你的数据可视化作品的吸引力和实用性。希望本文能为你提供一些有益的启示和帮助。
|
7月前
|
算法 项目管理
R语言实现蒙特卡洛模拟算法
R语言实现蒙特卡洛模拟算法
|
3月前
|
数据采集 机器学习/深度学习 数据可视化
R语言从数据到决策:R语言在商业分析中的实践
【9月更文挑战第1天】R语言在商业分析中的应用广泛而深入,从数据收集、预处理、分析到预测模型构建和决策支持,R语言都提供了强大的工具和功能。通过学习和掌握R语言在商业分析中的实践应用,我们可以更好地利用数据驱动企业决策,提升企业的竞争力和盈利能力。未来,随着大数据和人工智能技术的不断发展,R语言在商业分析领域的应用将更加广泛和深入,为企业带来更多的机遇和挑战。
|
2月前
|
数据挖掘 C语言 C++
R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。
【10月更文挑战第21天】时间序列分析是一种重要的数据分析方法,广泛应用于经济学、金融学、气象学、生态学等领域。R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。本文将介绍使用R语言进行时间序列分析的基本概念、方法和实例,帮助读者掌握R语言在时间序列分析中的应用。
52 3
|
7月前
|
机器学习/深度学习 数据可视化
R语言逻辑回归logistic模型ROC曲线可视化分析2例:麻醉剂用量影响、汽车购买行为2
R语言逻辑回归logistic模型ROC曲线可视化分析2例:麻醉剂用量影响、汽车购买行为
|
3月前
|
数据采集 数据可视化 数据挖掘
R语言在金融数据分析中的深度应用:探索数据背后的市场智慧
【9月更文挑战第1天】R语言在金融数据分析中展现出了强大的功能和广泛的应用前景。通过丰富的数据处理函数、强大的统计分析功能和优秀的可视化效果,R语言能够帮助金融机构深入挖掘数据价值,洞察市场动态。未来,随着金融数据的不断积累和技术的不断进步,R语言在金融数据分析中的应用将更加广泛和深入。