基本层次贝叶斯分析代码

时间:2019-03-03 06:00:41

标签: r bayesian jags winbugs hierarchical-bayesian

我用winBUGS编写了这段代码:

n <- 100

x1 <- rbinom(n,1,.7)

x2 <- rbinom(n,1,.5)

sum(x1)

sum(x2)

model{

x1 ~ dbin(p1, n) x2 ~ dbin(p2, n) p1 ~ dbeta(a1, b1) p2 ~ dbeta(a2,b2)

diff <- p1 - p2 p.value <- step(diff)

} list(n = 100, x1 = 70, x2 = 54, a1 = 1, b1 = 1, a2 = 1, b2 = 1)

我在如何在R / JAGS中执行此操作时遇到麻烦。实际上,我什至不能完全确定此代码试图做什么(我想计算后验吗?)。我以前从未使用过winBUGS,而且我是R的新手。这也是我的第一个贝叶斯课程,一旦引入代码,我就很迷路。

此外,如何计算比例之间的差异的后验均值和标准差?或如何找到p1大于p2的后验概率,以及这是否显着?

1 个答案:

答案 0 :(得分:2)

如果您需要帮助设置 Rjags ,我希望您的助教或同学可以为您提供帮助。这个答案重点在于解释代码的作用。

出于教学目的,让我们对这些数据进行简单的叙述。假设我们有两个硬币,我们想知道一个硬币是否比另一个硬币更容易翻转。 代码分为两部分。

生成/正向仿真

第一个是正向模拟,我们已经知道两个硬币翻转头的概率是多少。

## how many times we will flip each coin
n <- 100

## coin 1 has 70% chance to land on heads
## simulate n flips
x1 <- rbinom(n, 1, .7)

## coin 2 has 50% chance to land on heads
## simulate n flips
x2 <- rbinom(n, 1, .5)

## count number of coin 1 heads
sum(x1) # 70

## count number of coin 2 heads
sum(x2) # 54

后验概率

现在,我们使用这些模拟数据并尝试逆转实验。也就是说,如果我们从一个硬币观察到70个正面,从另一个硬币观察到54个正面,我们能否说一说每个硬币必须翻转一个正面的概率?具体来说,代码将询问:“ 在关于每个硬币具有真实概率的统一假设下,硬币1比硬币2更有可能翻转头部的(后)概率是多少?“

计算可能性

JAGS使用MCMC进行此操作的方式是从所有可能的参数配置(在这种情况下,值为p1p2)的空间中取样,并按可能性每个配置都将生成观察到的数据。因此,JAGS代码需要完成的主要工作是定义在给定了这些值的情况下如何生成参数值以及如何计算数据的可能性。这是模型代码的第一部分。

计算利息值

模型部分中代码的第二部分正在测试我们提出的问题。这是通过计算一些其他变量而完成的,这些变量不会影响配置的可能性。相反,他们告诉我们有关所采样配置的信息。具体来说,diff将跟踪两个硬币概率之间的差异分布,p.value将跟踪p1大于p2的频率。

model{

## COMPUTE LIKELIHOODS
## compute likelihood that heads resulted from coins
## with given probabilities after `n` coin flips
x1 ~ dbin(p1, n) 
x2 ~ dbin(p2, n) 

## SAMPLE PARAMETERS
## randomly select coin probabilities from Beta distributions
## Note that since these are all 1, it's really just a Uniform[0,1]
p1 ~ dbeta(a1, b1)
p2 ~ dbeta(a2, b2)

## HYPOTHESIS TEST
## compute how often coin1's probability is greater than coin2's
diff <- p1 - p2 
p.value <- step(diff)
} 

## INPUT VALUES
list(n = 100, x1 = 70, x2 = 54, a1 = 1, b1 = 1, a2 = 1, b2 = 1)