¿Cómo funciona dinterval () para datos censurados por intervalo en JAGS?

8

Estoy tratando de entender cómo funciona dinterval () en JAGS para datos censurados. Estoy modelando datos gruesos donde solo tengo límites superiores e inferiores para cada punto de datos (no el valor verdadero). Aquí hay un ejemplo simple de cómo creo que debería funcionar:

Algunos límites superior e inferior para cada punto:

> 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

Una función para escribir el modelo (suponiendo que los datos provienen de una normal con una media y varianza común):

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)

Algunas funciones y asignaciones para la llamada 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")

Y ejecuta el modelo:

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")

¿Qué sucede cuando ejecuto esto?

1) mi estimación de mu ronda alrededor de 0 cuando debería ser 15

2) no se ejecutará si DIC = TRUE:

error: "Error en jags.samples (modelo, variables.nombres, n.iter, thin, type =" trace ",: Error al establecer el monitor de seguimiento para la desviación del nodo

Nota: Puedo obtener un modelo similar ejecutándose en OpenBUGS omitiendo la línea dinterval () y agregando I (Lower, Upper) a dnorm.

scottyaz
fuente

Respuestas:

6

Aquí hay una respuesta de Martyn Plummer:

Tal como está escrito, su modelo no tiene ningún resultado observado. Probablemente hayas notado que corre muy, muy rápido. Esto se debe a que es un muestreo directo del anterior. Es por eso que su media posterior para mu es la misma que la media anterior de 0. El nombre de la variable "is.censored" es apropiado para los datos censurados hacia la izquierda o hacia la derecha, como se encuentra en el análisis de supervivencia, pero no para su problema. Así que voy a cambiarle el nombre a "y". Si usted tiene

y[j] ~ dinterval(t[j], lim[j,]) 

y lim [j] tiene dos columnas, entonces y [j] puede tomar tres valores posibles

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] 

Para modelar datos censurados por intervalos, debe proporcionar y [j] como datos en su modelo. En su caso, sabe que t [j] siempre se encuentra entre lim [j, 1] y lim [j, 2], por lo que sus datos deberían estar.

data <- list("lim"=lim, "y"=rep(1,nrow(lim))) 

El problema con DIC es bastante profundo. Debido a que su modelo no tiene datos de resultados, la desviación no está definida. Sin embargo, incluso si proporciona datos de resultados, aún no obtendrá las estadísticas de desviación que desea (incluido pD). La desviación será cero y la función "jags" recurrirá a la heurística de Gelman para pD (no escribí esto, así que no me pidas que lo explique), que también será cero. La probabilidad que realmente quieres es

 p(lim[j,1] < t[j] <= lim[j,2] | mu, tau) 

Pero JAGS te está dando

p(y[j] | t[j]) 

que siempre es 1. El "enfoque" de DIC está mal. No sé qué hace WinBUGS en estas circunstancias. Quizás tiene reglas especiales para las variables censuradas.

scottyaz
fuente