在WinBUGS中拟合多级分层模型 - 涉及多变量分布

时间:2015-01-06 11:07:41

标签: model hierarchical winbugs

我正在尝试学习如何在WinBUGS中使用分层模型。作为练习,我在R中模拟了3个等级的剂量反应数据,然后我尝试将其输入WinBUGS。

模拟设置:

  • 3个级别:CENTERSUBJECTRESIDUAL
  • 20个中心
  • 每个中心有20个科目
  • 每个受试者已经接受了9个剂量水平(忽略了这个设计的现实方面)
  • 9个剂量水平为:125102550100200500
  • 日志(主题i在剂量j)的响应= log(exp(l.E0) + exp(l.EMAX)*(Dose/( exp(l.ED50) + Dose))) + residvar
  • l.E0 = 0.693(固定效果)
  • l.ED50 = l.ED50.MEAN + RANDOM.SUBJECT.ED50 (因此特定主题l.ED50效果)
  • l.EMAX = l.EMAX.MEAN + RANDOM.CENTER.EMAX + RANDOM.SUBJECT.EMAX (因此,中心和主题特定的l.EMAX效果)
  • l.ED50.MEAN = 3.22(固定效果)
  • l.EMAX.MEAN = 5.706(固定效果)
  • RANDOM.CENTER.EMAX ~ N(0, 1.14)
  • RANDOM.SUBJECT.ED50 + RANDOM.SUBJECT.EMAX ~ MVN([0,0], [0.1036, 0.156, 0.156, 0.325]) (因此,ED50EMAX的双变量正态分布为0.85相关,0.1036和0.325方差

在下面我给出了我尝试过的WinBUGS代码和数据。该模型在语法上是正确的,但在编译数据后,我收到一些我不理解的错误消息。

我想知道是否有人能告诉我:

  • 如何更正我的代码
  • 或者如果我对多级多变量分布进行编码的尝试是错误的,并且有更好的方法可以做到这一点。

提前感谢您的任何反馈。

氪, 罗埃尔

model {
  for (k in 1:nobs) {
    #model for observed data
    yobs.log.prop[k] ~ dnorm(yobs.log.prop.hat[k], tau)          
    # likelihood        
    yobs.log.prop.hat[k] <- log(exp(mu.l.E0) + exp(l.ID.EMAX[nsub.unique.from1[k]]) * (dose[k]/(dose[k] + exp(l.ID.ED50[nsub.unique.from1[k]]))))
    l.ID.EMAX[nsub.unique.from1[k]] <- mu.l.EMAX + u.EMAX.CENTER[ncenter[k]] + u.ID[nsub.unique.from1[k], 1]
    l.ID.ED50[nsub.unique.from1[k]] <- mu.l.ED50 + u.ID[nsub.unique.from1[k], 2]
  }
  for (j in 1:20) {
    #intercenter variability: level1
    u.EMAX.CENTER[j] ~ dnorm(0, tau.l.EMAX)
    u.EMAX.CENTER.pred[j] ~ dnorm(0, tau.l.EMAX)
  }
  for (i in 1:400) {
    #intersubject variability: level 2
    u.ID[i, 1:2] ~ dnorm(zero2[1:2], tau.u2[1:2, 1:2])
  }
  #Priors fixed effects
  mu.l.E0 ~ dunif(-2, 5)
  mu.l.EMAX ~ dunif(1, 10)
  mu.l.ED50 ~ dunif(-2, 5)
  tau <- 1/(sigma*sigma)
  sigma ~ dunif(0,1000)
  #Prior for CENTER effect
  tau.l.EMAX <- 1/(omega.l.EMAX * omega.l.EMAX)
  omega.l.EMAX ~ dunif(0, 100)
  #omega.l.EMAX ~ dnorm(0,0.01)I(0,)
  #Prior for ID effect
  for (m in 1:2) {
    zero2[m] <- 0
  }
  tau.u2[1:2, 1:2] ~ dwish(R[1:2,1:2],2) 
  sigma.u2[1:2, 1:2] <- inverse(tau.u2[1:2, 1:2])
  rho <- sigma.u2[1, 2]/sqrt(sigma.u2[1,1]*sigma.u2[2, 2])
  #omega.l.EMAX~dnorm(0,0.01)I(0,)
}

我想要包含数据,但收到的消息是我用过的很多字符。因此,我只展示了开头(使用Wishart R矩阵的规范)和我的数据的子集。

list(nobs=3600, R = structure(.Data = c(1, 0.85, 0.85, 1), .Dim = c(2, 2)),
     yobs.log.prop=c(4.29774919346511, ...), #... are the remaining 3599 responses
     dose=c(1,  ...), #... are the remaining 3599 dose values
     ncenter=c(1, ....), #... are the remaining 3599 center identifications
     nsub.unique.from1=c(1...)) #... are the remaining 3599 subject identifications

0 个答案:

没有答案