zoukankan      html  css  js  c++  java
  • 拓端tecdat|R语言Metropolis Hastings采样和贝叶斯泊松回归Poisson模型

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

    原文出处:拓端数据部落公众号

    在本文中,我想向你展示如何使用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的后验分布中采样。

    数据

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

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

    似然函数

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

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

    先验分布

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

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

    后验分布

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

    提议函数

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

    Metropolis 采样器

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

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

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

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

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

    结果

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

    与glm()的比较

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

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

    1.  
      ## True value Mean MCMC glm
    2.  
      ## beta0 1.0578047 1.0769213 1.0769789
    3.  
      ## beta1 0.8113144 0.8007347 0.8009269

    结论

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


    最受欢迎的见解

    1.R语言多元Logistic逻辑回归 应用案例

    2.面板平滑转移回归(PSTR)分析案例实现

    3.matlab中的偏最小二乘回归(PLSR)和主成分回归(PCR)

    4.R语言泊松Poisson回归模型分析案例

    5.R语言回归中的Hosmer-Lemeshow拟合优度检验

    6.r语言中对LASSO回归,Ridge岭回归和Elastic Net模型实现

    7.在R语言中实现Logistic逻辑回归

    8.python用线性回归预测股票价格

    9.R语言如何在生存分析与Cox回归中计算IDI,NRI指标

    ▍关注我们 【大数据部落】第三方数据服务提供商,提供全面的统计分析与数据挖掘咨询服务,为客户定制个性化的数据解决方案与行业报告等。 ▍咨询链接:http://y0.cn/teradat ▍联系邮箱:3025393450@qq.com
  • 相关阅读:
    bat文件转换为exe文件
    桌面快捷方式增(删)
    客户推广微信小程序的几种方法如下
    小程序开发客户对接流程
    Java MySQL 连接
    前端开发构建工具
    [转]chrome 的devtools 中setting 开启workspace , 也有点用处。不是很大
    回归基础的东西,不能只是“感觉会了”
    angular 的ui.router 定义不同的state 对应相同的url
    学习javascript 非常好的博客
  • 原文地址:https://www.cnblogs.com/tecdat/p/15181116.html
Copyright © 2011-2022 走看看