我是JAGS的新手,我正在尝试了解dinterval()如何在JAGS中处理删失数据。我正在建模粗数据,其中我只有每个数据点的上限和下限(不是真值)。这是一个我认为应该如何工作的简单示例:
每个点的上限和下限:
> head(lim)
L U
[1,] 14.98266 15.68029
[2,] 21.21827 21.91590
[3,] 18.34953 19.04716
[4,] 19.00186 19.69949
[5,] 15.39891 16.09654
[6,] 17.81705 18.51468
编写模型的函数(假设数据来自具有共同均值和方差的法线):
playmodel <- function(){
for (i in 1:50){
is.censored[i] ~ dinterval(t[i], lim[i,])
t[i] ~ dnorm(mu,tau)
}
mu ~ dnorm(0,.001)
tau ~ dgamma(.01,.01)
}
filename <- "toymod.bug"
write.model(toymod,filename)
jags调用的一些函数和赋值:
data <- list("lim"=lim)
inits <- list(mu=rnorm(1),tau=rgamma(1,.01,.01),t=as.vector(apply(lim,1,mean)))
#last part is to ensure the starting value is between the upper and lower limit
#each chain will start at the same place for t but this is just for this case
params <- c("mu","tau")
运行模型:
playmodel.jags <- jags(data,inits, params, model.file="toymod.bug", n.chains=3,
n.iter=50000,n.burnin=30000, n.thin=1, DIC=TRUE,
working.directory=NULL,refresh = 50000/50, progress.bar = "text")
运行时会发生什么?
1)我对mu的估计大约在0左右时应该是15
2)如果DIC = TRUE,它将无法运行:
错误:“jags.samples中的错误(model,variable.names,n.iter,thin,type =”trace“,: 无法为节点偏差设置跟踪监视器
我确信我正在做一些愚蠢的事情,如果有人能帮助我走上正轨,我将不胜感激。
答案 0 :(得分:2)
以下是Martyn Plummer的回复:
如上所述,您的模型没有任何观察到的结果。您可能已经注意到它运行得非常快。这是因为它是先前的正向采样。这就是为什么mu的后验均值与先前均值为0的原因相同。变量名称“is.censored”适用于生存分析中的左删除或右删失数据,但不适用于您的问题。所以我要把它重命名为“y”。如果你有
y[j] ~ dinterval(t[j], lim[j,])
和lim [j]有两列,然后y [j]可以取三个可能的值
y[j] = 0 if t[j] <= lim[j,1]
y[j] = 1 if lim[j,1] < t[j] <= lim[j,2]
y[j] = 2 if lim[j,2] < t[j]
要对区间删失数据建模,您需要在模型中提供y [j]作为数据。在你的情况下,你知道t [j]总是落在lim [j,1]和lim [j,2]之间,所以你的数据应该是。
data <- list("lim"=lim, "y"=rep(1,nrow(lim)))
DIC的问题相当严重。由于您的模型没有任何结果数据,因此未定义偏差。但是,即使您提供结果数据,您仍然无法获得所需的偏差统计数据(包括pD)。偏差将为零,“jags”函数将回归到pD的Gelman启发式(我没有写这个,所以不要求我解释它),这也将为零。你真正想要的可能性是
p(lim[j,1] < t[j] <= lim[j,2] | mu, tau)
但是JAGS正在给你
p(y[j] | t[j])
总是1.DIC的“焦点”是错误的。我不知道WinBUGS在这种情况下做了什么。也许它对审查变量有特殊的规则。