0

我已经根据以下数据在 OpenBUGs 中实现了一个模型:

在此处输入图像描述

数据包括 10 项独立研究——2 种不同药物的 5 次试验(Med = 0 或 1),然后是该试验的感染参与者总数(感染)——以及试验的参与者总数。

bugsData(list(y = df$Infected, n = 10, J = 5 , t = df$Total, x = df$Med) , file="Bugs_Data.txt")

我的原始模型可以写成:

Y[i]|mu[i],t[i] ~ Bin(mu[i], t[i]), i = 1,.....10
logit(mu[i]) = Beta0 + Beta1*x[i]

我可以像这样在 OpenBUGS 中实现:

model {
## LIKELIHOOD
  for (i in 1:n) {
    y[i] ~ dbin(mu[i], t[i])
    logit(mu[i]) <- Beta0 + Beta1*(x[i])
  }
  ## NORMAL PRIORS 
  Beta0 ~ dnorm(0, 0.0001)
  Beta1 ~ dnorm(0, 0.0001)
}

但是,然后我想实现一个分层模型,其中 s(i) 表示从观察 i 的列试验中进行的试验:

Y[i]|mu[i],t[i] ~ Bin(mu[i], t[i]), i = 1,.....10
logit(mu[i]) = Beta0,s(i) + Beta1*x[i]
Beta0,j ~ Normal(mu_bo, sigma2_b0), j = 1,....5

我已经尽我所能尝试了一个模型,但到目前为止还没有成功。

model {
## LIKELIHOOD
  for (j in 1:J) {
    for (i in 1:n) {
      y[i] ~ dbin(mu[i], t[i])
      logit(mu[i]) <- Beta0[j] + Beta1*(x[i])
    Beta0[j] ~ dnorm(mu_b0, tau_b0)
    }
  }
  
  ## PRIORS 
  mu_b0 ~ dnorm(0, 0.0001)
  tau_b0 ~ dgamma(0.0001, 0.0001)
  sigma2_b0 <- 1 / tau_b0
  Beta1 ~ dnorm(0, 0.0001)
}

当前模型无法按原样使用我的数据进行编译。

4

1 回答 1

0

您需要提供一个长度向量,n用于索引组数据点i所属的组。

model {
## LIKELIHOOD
for (i in 1:n) {
  y[i] ~ dbin(mu[i], t[i])
  logit(mu[i]) <- Beta0[group_vec[i]] + Beta1*(x[i])
}
## PRIORS 
mu_b0 ~ dnorm(0, 0.0001)
tau_b0 ~ dgamma(0.0001, 0.0001)
sigma2_b0 <- 1 / tau_b0
Beta1 ~ dnorm(0, 0.0001)
for(j in 1:J){
  Beta0[j] ~ dnorm(mu_b0, tau_b0)
}
}

group_vec长度为n,取数据点i所属组的整数。例如,如果我们有 21 个数据点和 3 个组。

groups <- factor(rep(c("A", "B", "C"), each = 7))

那么我们可以构造group_vec

group_vec <- as.numeric(groups)
[1] 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3

这称为嵌套索引,它是指定分层模型的一种非常常见的方法,您只需将其与数据一起提供即可。在您的情况下,您已经将试用作为整数。因此,您可以group_vec在数据中设置为试验列,或者group_vec在模型中将其重命名为Trial,无论您喜欢哪种方式。

于 2021-06-06T17:55:15.690 回答