区间删失数据的dinterval()?

时间:2011-08-03 00:01:35

标签: r jags

我是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“,:   无法为节点偏差设置跟踪监视器

我确信我正在做一些愚蠢的事情,如果有人能帮助我走上正轨,我将不胜感激。

1 个答案:

答案 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在这种情况下做了什么。也许它对审查变量有特殊的规则。