我正在尝试学习如何在 WinBUGS 中拟合层次模型。作为练习,我在 R 中模拟了一些具有 3 个级别的剂量响应数据,然后我尝试将其输入 WinBUGS。
模拟设置:
- 3 级:
CENTER
,SUBJECT
,RESIDUAL
- 20个中心
- 每个中心有20个科目
- 每个受试者都接受了 9 个剂量水平(忽略此设计的现实方面)
- 9 个剂量水平是:
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])
(所以双变量正态分布,相关性为 0.85,方差分别为 0.1036 和ED50
0.325EMAX
)
下面我给出了我尝试过的 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