3

我是 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 的估计在 15 左右徘徊在 0 左右

2) 如果 DIC=TRUE,它将不会运行:

错误:“jags.samples 中的错误(模型,variable.names,n.iter,thin,type = “trace”,:无法为节点偏差设置跟踪监视器

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

4

1 回答 1

3

以下是 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 在这种情况下会做什么。也许它对删失变量有特殊的规则。

于 2011-08-09T10:49:17.877 回答