前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言使用Metropolis- Hasting抽样算法进行逻辑回归

R语言使用Metropolis- Hasting抽样算法进行逻辑回归

作者头像
拓端
发布2021-04-07 10:30:34
4540
发布2021-04-07 10:30:34
举报
文章被收录于专栏:拓端tecdat

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

在逻辑回归中,我们将二元因变量Y_i回归到协变量X_i上。下面的代码使用Metropolis采样来探索 beta_1和beta_2 的后验Yi到协变量Xi。

定义expit和分对数链接函数

代码语言:javascript
复制
logit<-function(x){log(x/(1-x))} 此函数计算beta_1,beta_2的联合后验。它返回后验的对数以获得数值稳定性。(β1,β2)(β1,β2)。它返回后验的对数获得数值稳定性。
log_post<-function(Y,X,beta){
    prob1  <- expit(beta[1] + beta[2]*X)
like+prior}

这是MCMC的主要功能.can.sd是候选标准偏差。

代码语言:javascript
复制
Bayes.logistic<-function(y,X,
                         n.samples=10000,
                         can.sd=0.1){
 
     keep.beta     <- matrix(0,n.samples,2)
     keep.beta[1,] <- beta

     acc   <- att <- rep(0,2)
 
    for(i in 2:n.samples){

      for(j in 1:2){

       att[j] <- att[j] + 1

      # 抽取候选:

       canbeta    <- beta
       canbeta[j] <- rnorm(1,beta[j],can.sd)
       canlp      <- log_post(Y,X,canbeta)

      # 计算接受率:

       R <- exp(canlp-curlp)  
       U <- runif(1)                          
       if(U<R){       
          acc[j] <- acc[j]+1
       }
     }
     keep.beta[i,]<-beta

   }
   # 返回beta的后验样本和Metropolis的接受率


list(beta=keep.beta,acc.rate=acc/att)}

生成模拟数据

代码语言:javascript
复制
 set.seed(2008)
 n         <- 100
 X         <- rnorm(n)
  true.p    <- expit(true.beta[1]+true.beta[2]*X)
 Y         <- rbinom(n,1,true.p)

拟合模型

代码语言:javascript
复制
 burn      <- 10000
 n.samples <- 50000
  fit  <- Bayes.logistic(Y,X,n.samples=n.samples,can.sd=0.5)
 tock <- proc.time()[3]

 tock-tick
代码语言:javascript
复制
## 3.72

结果

代码语言:javascript
复制
abline(true.beta[1],0,lwd=2,col=2)
代码语言:javascript
复制
abline(true.beta[2],0,lwd=2,col=2)
代码语言:javascript
复制
hist(fit$beta[,1],main="Intercept",xlab=expression(beta[1]),breaks=50)
代码语言:javascript
复制
abline(v=true.beta[2],lwd=2,col=2)
代码语言:javascript
复制
 print("Posterior mean/sd")
## [1] "Posterior mean/sd"
 print(round(apply(fit$beta[burn:n.samples,],2,mean),3))
## [1] -0.076  0.798
 print(round(apply(fit$beta[burn:n.samples,],2,sd),3))
## [1] 0.214 0.268

## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.6990  -1.1039  -0.6138   1.0955   1.8275  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)   
## (Intercept) -0.07393    0.21034  -0.352  0.72521   
## X            0.76807    0.26370   2.913  0.00358 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 138.47  on 99  degrees of freedom
## Residual deviance: 128.57  on 98  degrees of freedom
## AIC: 132.57
## 
## Number of Fisher Scoring iterations: 4

非常感谢您阅读本文,有任何问题请在下面留言!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 拓端数据部落 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原文链接:http://tecdat.cn/?p=6761
  • 定义expit和分对数链接函数
  • 生成模拟数据
  • 拟合模型
  • 结果
    • 非常感谢您阅读本文,有任何问题请在下面留言!
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档