Metropolis Hastings采样和贝叶斯泊松回归Poisson模型

简介: Metropolis Hastings采样和贝叶斯泊松回归Poisson模型

在本文中,我想向你展示如何使用R的Metropolis采样从贝叶斯Poisson回归模型中采样。

Metropolis-Hastings算法

Metropolis-Hastings抽样算法是一类马尔科夫链蒙特卡洛(MCMC)方法,其主要思想是生成一个马尔科夫链 使其平稳分布为目标分布。这种算法最常见的应用之一是在贝叶斯统计中从后验密度中取样,这也是本文的目标。

该算法规定对于一个给定的状态Xt,如何生成下一个状态 有一个候选点Y,它是从一个提议分布 ,中生成的,根据决策标准被接受,所以链条在时间t+1时移动到状态Y,即Xt+1=Y或被拒绝,所以链条在时间t+1时保持在状态Xt,即Xt+1=Xt。

Metropolis 采样

在Metropolis算法中,提议分布是对称的,也就是说,提议分布   满足

,所以Metropolis采样器产生马尔科夫链的过程如下。

  1. 选择一个提议分布 . 在选择它之前,了解这个函数中的理想特征。
  2. 从提议分布g中生成X0。
  3. 重复进行,直到链收敛到一个平稳的分布。
  • 生成Y.
  • 从Uniform(0, 1)中生成U。
  • 如果 , 接受Y并设置Xt+1=Y,否则设置Xt+1=Xt。这意味着候选点Y被大概率地接受 .
  • 递增t.

贝叶斯方法

正如我之前提到的,我们要从定义为泊松回归模型的贝叶斯中取样。

对于贝叶斯分析中的参数估计,我们需要找到感兴趣的模型的似然函数,在这种情况下,从泊松回归模型中找到。

现在我们必须为每个参数β0和β1指定一个先验分布。我们将对这两个参数使用无信息的正态分布,β0∼N(0,100)和β1∼N(0,100) 。

最后,我们将后验分布定义为先验分布和似然分布的乘积。

使用Metropolis采样器时,后验分布将是目标分布。

计算方法

这里你将学习如何使用R语言的Metropolis采样器从参数β0和β1的后验分布中采样。

数据

首先,我们从上面介绍的泊松回归模型生成数据。

n <- 1000 #  样本大小
J <- 2 # 参数的数量
X <- runif(n,-2,2) # 生成自变量的值
beta <- runif(J,-2,2) #生成参数的值
y <- rpois(n, lambda = lambda) # 生成因变量的值

似然函数

现在我们定义似然函数。在这种情况下,我们将使用这个函数的对数,这是强烈建议的,以避免在运行算法时出现数字问题。

LikelihoodFunction <- function(param){
        beta0 <- param\[1\]
        beta1 <- param\[2\]
        lambda <- exp(beta1*X + beta0)
        # 对数似然函数
        loglikelihoods <- sum(dpois(y, lambda = lambda, log=T))
        return(loglikelihoods)
}

先验分布

接下来我们定义参数β0和β1的先验分布。与似然函数一样,我们将使用先验分布的对数。

   

beta0prior <- dnorm(beta0, 0, sqrt(100), log=TRUE)
        beta1prior <- dnorm(beta1, 0, sqrt(100), log=TRUE)
        return(beta0prior + beta1prior) #先验分布的对数

后验分布

由于我们是用对数工作的,我们把后验分布定义为似然函数的对数与先验分布的对数之和。记住,这个函数是我们的目标函数f(.),我们要从中取样。

提议函数

最后,我们定义提议分布g(.|Xt)。由于我们将使用Metropolis采样器,提议分布必须是对称的,并且取决于链的当前状态,因此我们将使用正态分布,其平均值等于当前状态下的参数值。



点击标题查阅往期内容


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


左右滑动查看更多

01

02

03

04




Metropolis 采样器

最后,我们编写代码,帮助我们执行Metropolis采样器。在这种情况下,由于我们使用的是对数,我们必须将候选点Y被接受的概率定义为。

 

# 创建一个数组来保存链的值
        chain\[1, \] <- startvalue # 定义链的起始值
        for (i in 1:iterations){
                # 从提议函数生成Y
                Y <- ProposalFunction(chain\[i, \])
                # 候选点被接受的概率
                                           PosteriorFunction(chain\[i, \]))
                # 接受或拒绝Y的决策标准 
                if (runif(1) < probability) {
                        chain\[i+1, \] <- Y
                }else{ 
                        chain\[i+1, \] <- chain\[i, \]

由于MCMC链具有很强的自相关,它可能产生的样本在短期内无法代表真实的基础后验分布。那么,为了减少自相关,我们可以只使用链上的每一个n个值来稀释样本。在这种情况下,我们将在算法的每20次迭代中为我们的最终链选择一个值。

startvalue <- c(0, 0) # 定义链条的起始值
#每20次迭代选择最终链的值
for (i in 1:10000){
        if (i == 1){
                cfinal\[i, \] <- chain\[i*20,\]
        } else {
                cfinal\[i, \] <- chain\[i*20,\]
# 删除链上的前5000个值
burnIn <- 5000

在这里,你可以看到ACF图,它给我们提供了任何序列与其滞后值的自相关值。在这种情况下,我们展示了初始MCMC链的ACF图和对两个参数的样本进行稀释后的最终链。从图中我们可以得出结论,所使用的程序实际上能够大大减少自相关。

结果

在这一节中,我们介绍了由Metropolis采样器产生的链以及它对参数β0和β1的分布。参数的真实值由红线表示。

与glm()的比较

现在我们必须将使用Metropolis采样得到的结果与glm()函数进行比较,glm()函数用于拟合广义linera模型。

下表列出了参数的实际值和使用Metropolis采样器得到的估计值的平均值。

##       True value Mean MCMC       glm
## beta0  1.0578047 1.0769213 1.0769789
## beta1  0.8113144 0.8007347 0.8009269

结论

从结果来看,我们可以得出结论,使用Metropolis采样器和glm()函数得到的泊松回归模型的参数β0和β1的估计值非常相似,并且接近于参数的实际值。另外,必须认识到先验分布、建议分布和链的初始值的选择对结果有很大的影响,因此这种选择必须正确进行。

相关文章
|
关系型数据库 MySQL 数据库
【Navicat 连接MySQL时出现错误1251:客户端不支持服务器请求的身份验证协议;请考虑升级MySQL客户端】
【Navicat 连接MySQL时出现错误1251:客户端不支持服务器请求的身份验证协议;请考虑升级MySQL客户端】
1648 0
|
Linux
linux xshell telnet 进去后如何退出
【8月更文挑战第27天】Telnet协议支持用户远程登录并操控另一台计算机。在Linux系统中结束Telnet会话可采用多种方式:直接输入"exit";利用快捷键Ctrl + ]后跟"quit";同样可通过Telnet命令结合快捷键"Ctrl + ]q"实现;此外,图形界面下直接关闭窗口也是一个简便的选择。用户可根据个人习惯及客户端类型选取合适的方法退出会话。
1462 4
|
资源调度 算法 计算机视觉
BRIEF描述子生成算法
BRIEF描述子生成算法
209 0
|
存储 NoSQL Java
Java调度任务如何使用分布式锁保证相同任务在一个周期里只执行一次?
【10月更文挑战第29天】Java调度任务如何使用分布式锁保证相同任务在一个周期里只执行一次?
400 1
|
Prometheus 监控 关系型数据库
数据库同步革命:MySQL GTID模式下主从配置的全面解析
数据库同步革命:MySQL GTID模式下主从配置的全面解析
1493 0
|
Prometheus 监控 Cloud Native
Prometheus:Java调用PromQL工具类(瞬时数据查询)
Prometheus:Java调用PromQL工具类(瞬时数据查询)
Prometheus:Java调用PromQL工具类(瞬时数据查询)
|
SQL 监控 安全
浅析Waf优缺点:硬件Waf、软件Waf、云Waf之总结
WAF(Web应用防火墙)是专为Web应用设计的安全防护产品,主要形态有硬件WAF、软件WAF和云WAF。硬件WAF易于部署,可承受高吞吐量,但价格昂贵;软件WAF廉价易用,功能丰富,但可能误杀和占用内存;云WAF部署简单,维护成本低,但存在被绕过和数据泄露的风险。RASP(运行时应用自我保护)是一种新兴技术,通过注入应用程序提供实时保护,误报率低,维护成本低,但部署复杂且可能影响性能。未来,WAF防护技术将结合机器学习、词法分析、行为识别和大数据关联分析,实现更精准的攻击识别和防护。
2271 2
|
Android开发 UED Kotlin
Android中如何跳转到Wi-Fi开关设置页
本文介绍如何在Android应用开发中使用隐式Intent引导用户至特定系统设置页面,如Wi-Fi设置页,并提供Kotlin代码示例。通过设置Intent的Action属性并检查设备兼容性,可轻松实现跳转功能,提升用户体验。此外,还列举了其他常用设置页面的Intent Action及注意事项。
321 15
|
人工智能 自然语言处理 安全
Claude官网中文版:在国内使用claude AI的最佳选择!
Claude 是 Anthropic 公司开发的一款大型语言模型,类似于 OpenAI 的 ChatGPT 或 Google 的 Bard。它被设计成一个乐于助人 😊、诚实 🤝 且无害 😇 的 AI 助手。