我正在尝试学习如何在WinBUGS中使用分层模型。作为练习,我在R中模拟了3个等级的剂量反应数据,然后我尝试将其输入WinBUGS。
模拟设置:
CENTER
,SUBJECT
,RESIDUAL
1
,2
,5
,10
,25
,50
,100
,200
和500
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])
(因此,ED50
和EMAX
的双变量正态分布为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