Bayes | 贝叶斯统计入门杂记

这篇文章首先以一个最简单的例子+code,带你体验什么是MCMC,随后会推荐一些实用资源。[不知怎么的,这篇文章本来要写R+JAGS教程,最后硬是写成了一篇杂文😓,不过也还算是一篇过得去的低阶入门文章吧。]

c97b96b61f098750c44f9f990ac7e6d3.png

贝叶斯模型的后验分布可以使用共轭先验进行推导,但是更为复杂的问题无法使用closed formed的形式找到后验分布,因为The Devil is in the Denominator! 这时可以使用基于MCMC采样的方法获得后验分布的估计--BUSGS(Bayesian Analysis Using Gibbs Sampling)。另外我了解到还有一种不需要采样(pakage: r-inla)的方法,但不适合新手并且适用的问题有限。

0c7f7181ac983a85059e8e7f515c1250.png

WinBugs,OpenBUGS和JAGS是实现BUGS的三个软件。OpenBUGS和WinBUGS在Windows操作系统上运行,有图形界面。JAGS(Just another Gibbs sampler)可在win/macos/linux上使用,无图形界面。几个软件使用了基本相同的语法,都可以用R调用。

一个最简单的栗子

假设观测到了1000个值来自正态分布的值,但是并不知道其总体的信息,目标是使用BUGS找出总体参数的后验分布。

1

安装所需软件

  • 安装JAGS到电脑

  • R中安装:

    • rjags    

    • coda

    • MCMCvis

2

生成数据

set.seed(432104)
n <- 1000
x <- rnorm(n, 0, 5)

dcaea08f9fd986c05c3b09a27b0169f4.png

3

建立JAGS模型

因为不知道总体的信息,我们假设观测值来自于均值为mu,presicion为tau的正态总体。其中tau=1/sigma^2。对于这两个未知的参数,我们的先验信息有限,如果觉得mu大概率为0的话,可以假设mu采样于正态N(0,0.0001), sigma采样于均匀分布Unif(0,100)。[可以尝试使用其他的先验看一下对结果有什么影响]

JAGS模型如下

model {
    for (i in 1:N){
    x[i] ~ dnorm(mu, tau)
    }
  mu ~ dnorm(0,.0001)
  tau <- pow(sigma, -2)
  sigma ~ dunif(0,100)
}

一般情况下,我们可以将JAGS的模型单独保存为一个文件,使用R调用JAGS调用JAGS运行该文件。这里可以偷懒使用textConnection,将这个模型保存为成一个string,假装我们已经已经保存了一个模型的文件。

model1.string <-"
  model {
    for (i in 1:N){
    x[i] ~ dnorm(mu, tau)
    }
  mu ~ dnorm(0,.0001)
  tau <- pow(sigma, -2)
  sigma ~ dunif(0,100)
}"
model1.spec<-textConnection(model1.string)

调用JAGS建立模型并采样

jags <- jags.model(model1.spec,
                   data = list('x' = x,
                               'N' = n),
                   n.chains=4,
                   n.adapt=100)
model=coda.samples(jags,
             c('mu', 'tau','sigma'),
             1000)

➡jags.model

1. JAGS模型文件

这里填入之前的模型model1.spec

如果你将模型保存为了文件,这里则需改为该文件的路径+文件名。

2. data

list中变量的名称应该和JAGS所需要的数据名称一致。

此外需要注意数据是否有NA,数据的格式不能是charater

3.  inits

每一个链的初始值,默认会随机生成。但是推荐手动设置,因为你在设置该参数的时候会想一下在估计什么参数。其形式是list of list

比如2个chain的初始值可以这么定义:
inits=list(
list(mu=0, sigma=6),
list(mu=10, sigma=50))

4. n.chains

生成多少个chain

5.  n.adapt

在一个chain中获得最优的sampler的迭代次数

coda.samples

这里用了coda.samples没用jags.samples是为了方便使用之后的可视化工具MCMCvis,使用coda.samples生成的结果的数据类型为mcmc.list。

n.iter: 每条链的迭代次数

n.thin:保存的比例,比如n.thin=10,意味着每隔10个数据保存一个数据,可有效降低数据量。

4

模型诊断

可以看到估计的mu和sigma比较接近真实值0和5。生成的summary中Rhat和n.eff是衡量MCMC是否收敛和稳健的指标。一般要求Rhat为1,n.eff在10000以上。

MCMCsummary(model)
            mean          sd        2.5%        50%      97.5% Rhat n.eff
mu    0.04226580 0.164487718 -0.28048634 0.04222556 0.37103327    1  4000
sigma 5.09866516 0.113608046  4.88476288 5.09587009 5.32551275    1  2745
tau   0.03852413 0.001715037  0.03525958 0.03850909 0.04190955    1  2766

做个trace plot,看看有没有哪一条链被“困”在某一个地方,生成的posterior的density distribution看起来正不正常。

MCMCtrace(model,ISB = FALSE, ind = TRUE, pdf = FALSE)

0a0a23438e7f6646f5cb4a399c71188e.png

MCMC不止于此

JAGS用的是Gibbs sampling的算法,其实MCMC的算法大概包括了:

  • Metropolis

    • Metropolis-Hastings

  • Gibbs (JAGS)

  • Hamiltonian MCMC (Stan)

    • No-U-Turn Sampler (NUTS)

具体几个sampler之间的异同,MCMC及原理,这些都是比较底层的东西,不一定会有很多人感兴趣,有机会再做介绍。

贝叶斯统计工具

如果做贝叶斯统计的话,现有的工具都非常容易上手,也不要求你理解MCMC的原理,为什么NUTS的算法会比Gibbs好。比如基于R+Stan的brms,可以看到用法和LM差不多,上手毫无难度。

2129a21737de021b25261e45f00397e2.png

另外还有比较流行的JASP,大概算是贝叶斯版的免费SPSS吧。今年有个Webinar,可以在官网找到视频教程。

ff97c7180a453cb9fff6b3e3f58c6b6c.png

贝叶斯教材推荐

最后推荐一本贝叶斯数据分析的教材:

John Kruschke的Doing Bayesian Data Analysis

dfa7d7036deec31e435591f93c76b1cf.png

没有复杂的公式和晦涩的内容,只不过每章开头一首蹩脚的小诗,看得人不知所云。能坚持看完700多页的内容,其他的三四百页的书都会觉得不在话下(这也许只是个幻觉)。印象最深的还是在power一章讨论两种统计目标,拒绝虚无假设(rejecting the null value)还是达到准确度(achieving precision)时作者说,前者是基于恐惧,害怕如果无法拒绝虚无假设,结果无法发表,后者是基于对真理的追求。像甘地说过的

Power is of two kinds. One is obtained by the fear of punishment and the other by acts of love. Power based on love is a thousand times more effective and permanent than the one derived from fear of punishment.

Mahatma Gandhi

如果觉得搞不定700多页的内容,可以考虑了解一下这篇浓缩版的paper

40bb3ec17d2b372cfe77dc861ff0955d.png

493d169f887c5a5c93d55c2591978c6e.gif

btw, Ben Lambert的A student's guide to Bayesian Statistics其实应该也还行,没来得及看。作者在油管上有很多视频教程,对公式推导或者英音感兴趣的人不妨前往观摩。

50432e540605e217daaa2bc304738071.png

ecc4855ddeca474d8e5693b8b6ed6f78.png

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值