如何在BUGS中指定贝叶斯混合效应模型

机器算法验证 回归 贝叶斯 重复测量 多层次分析 物流
2022-04-03 23:54:08

我在本周早些时候发布了这个问题,然后当我找到一个好的来源时撤回了这个问题,不想浪费人们的时间。恐怕我没有取得太大进展。为了在这里成为一个好公民,我会尽可能地把问题说清楚。我怀疑接受者会很少。

我在 RI 中有一个数据框,希望在 BUGS 或 R 中进行分析。它是长格式的。它由对 120 个人的多次观察组成,共有 885 行。我正在检查一个分类结果的发生 - 但这在这里并不相关。问题是关于更深层次的东西。

我一直使用的模型是

  mymodel<-gee(Category ~ Predictor 1 + Predictor 2..family=binomial(link="logit"),
  data=mydata, 
   id=Person)

边缘模型基本上考虑了患者的聚类。然后我检查了

 mymodel<-gee(Category ~ Predictor 1 + Predictor 2.. , family=binomial(link="logit"), 
  corstr = "AR-M", 
  data=mydata, id=Person)

为了说明对个人的观察的时间顺序。

这并没有太大变化。

然后我尝试使用以下一组 MCMCPack 命令对它们进行建模:

 mymodel<-MCMCglmm(category~  Predictor1 + Predictor2..,  
 data=mydata, family=binomial(link="logit"))

对输出的检查令人兴奋,显示出许多预测变量的统计意义。我称赞自己是一个新转换的贝叶斯主义者,直到我意识到我没有考虑到患者体内的重复测量。

我知道我必须对此负责。我知道这可能意味着为每个人设置一个超先验——对吗?这在 BUGS 中会采取什么形式?

这是一个基本的日志注册模型:(对 Kruschke, J., Indiana 表示敬意)

    model {
  for( i in 1 : nData ) {
    y[i] ~ dbern( mu[i] )
    mu[i] <- 1/(1+exp(-( b0 + inprod( b[] , x[i,] ))))
  }
  b0 ~ dnorm( 0 , 1.0E-12 )
   for ( j in 1 : nPredictors ) {
    b[j] ~ dnorm( 0 , 1.0E-12 )
  }
}

但是,对于个人来说,这里没有超先验。这是迄今为止我在个人内部设计中的最佳尝试,考虑到人们内部的重复测量:

这是杰克曼的 JAGS 模型

1 model{
2 ## loop over data for likelihood
3 for(i in 1:n){
4  y[i] ~ dbern( mu[i] )
    mu[i] <- 1/(1+exp(-( b0 + inprod( b[] , x[i,] ))))
6 }
7 sigma ˜ dunif(0,20) ## prior on standard deviation
8 tau <- pow(sigma,-2) ## convert to precision
9
10 ## hierarchical model for each state’s intercept & slope
11 for(p in 1:50){
12 beta[p,1:2] ˜ dmnorm(mu[1:2],Tau[,]) ## bivariate normal
13 }
14
15 ## means, hyper-parameters
16 for(q in 1:2){
17 mu[q] ˜ dnorm(0,.0016)

}

这是我的 BUGS 混蛋模型

1 model{
2 ## loop over data for likelihood
3 for(i in 1:n){
4 mu.y[i] <- alpha + beta[s[i],1] + beta[s[i],2]*(j[i]-jbar)
5 demVote[i] ˜ dnorm(mu.y[i],tau)
6 }
7 sigma ˜ dunif(0,20) ## prior on standard deviation
8 tau <- pow(sigma,-2) ## convert to precision
9
10 ## hierarchical model for each state’s intercept & slope
11 for(p in 1:120){
12 beta[p,1:2] ˜ dmnorm(mu[1:2],Tau[,]) ## bivariate normal
13 }
14
15 ## means, hyper-parameters
16 for(q in 1:2){
17 mu[q] ˜ dnorm(0,.0016)
  }

有人可以让我知道我是否朝着正确的方向前进。我对此的理解正在增长,但速度很慢。请温柔一点。我是医生,不是统计员!我已经使用了很多 R,但我是 BUGS 的新手,也是贝叶斯的新手。

谢谢,

R

1个回答

你(曾经)几乎在那里。只是一些评论 - 您不必将beta[,1:2]参数的先验设为联合 MV 正常;您可以使先验使得beta[i,1]beta[i,2]是独立的,这可以简化事情(例如,不需要指定先验协方差。)请注意,这样做并不意味着它们在后验中将是独立的。

其他评论:由于您有一个常数项 -alpha在回归中,组件beta[,1]在先验中的均值应该为零。alpha此外,您在代码中没有先验。

这是一个具有分层截距和斜率项的模型;考虑到更改,我已尝试尽可能保留您的先验和符号:

model {
  for(i in 1:n){
    mu.y[i] <- alpha + beta0[s[i]] + beta1[s[i]]*(j[i]-jbar)
    demVote[i] ~ dnorm(mu.y[i],tau)
  }

  alpha ~ dnorm(0, 0.001) ## prior on alpha; parameters just made up for illustration
  sigma ~ dunif(0,20) ## prior on standard deviation
  tau <- pow(sigma,-2) ## convert to precision

  ## hierarchical model for each state’s intercept & slope
  for (p in 1:120) {
     beta0[p] ~ dnorm(0, tau0)
     beta1[p] ~ dnorm(mu1, tau1)
  }

  ## Priors on hierarchical components; parameters just made up for illustration
  mu1 ~ dnorm(0, 0.001) 
  sigma0 ~ dunif(0,20)
  sigma1 ~ dunif(0,20)
  tau0 <- pow(sigma0,-2)
  tau1 <- pow(sigma1,-2)
}

Gelman 和 Hill是分层模型的一个非常有用的资源,包括一些加速收敛的“技巧”

(答案有点晚,但可能对未来的提问者有所帮助。)