Comment fonctionne dinterval () pour les données censurées par intervalles dans JAGS?

8

J'essaie de comprendre comment dinterval () fonctionne dans JAGS pour les données censurées. Je modélise des données grossières où je n'ai que des limites supérieures et inférieures pour chaque point de données (pas la vraie valeur). Voici un exemple simple de la façon dont je pense que cela devrait fonctionner:

Quelques limites supérieures et inférieures pour chaque point:

> 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

Une fonction pour écrire le modèle (en supposant que les données proviennent d'une normale avec une moyenne et une variance communes):

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)

Quelques fonctions et affectations pour l'appel 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")

Et exécutez le modèle:

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

Que se passe-t-il lorsque je lance ceci?

1) mon estimation de mu oscille autour de 0 alors qu'il devrait être de 15

2) il ne fonctionnera pas si DIC = TRUE:

error: "Erreur dans jags.samples (model, variable.names, n.iter, thin, type =" trace ",: impossible de définir le moniteur de trace pour la déviance du nœud

Remarque: je peux obtenir un modèle similaire en cours d'exécution dans OpenBUGS en omettant la ligne dinterval () et en ajoutant I (Lower, Upper) à dnorm.

scottyaz
la source

Réponses:

6

Voici une réponse de Martyn Plummer:

Tel qu'écrit, votre modèle n'a aucun résultat observé. Vous avez probablement remarqué qu'il fonctionne vraiment très vite. En effet, il s'agit d'un échantillonnage direct de l'a priori. C'est pourquoi votre moyenne postérieure pour mu est la même que la moyenne antérieure de 0. Le nom de variable "is.censored" est approprié pour les données censurées à gauche ou à droite, comme dans l'analyse de survie, mais pas pour votre problème. Je vais donc le renommer "y". Si tu as

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

et lim [j] a deux colonnes, alors y [j] peut prendre trois valeurs possibles

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] 

Pour modéliser des données censurées par intervalles, vous devez fournir y [j] comme données dans votre modèle. Dans votre cas, vous savez que t [j] se situe toujours entre lim [j, 1] et lim [j, 2], donc vos données devraient l'être.

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

Le problème avec DIC est assez profond. Étant donné que votre modèle ne contient aucune donnée de résultat, la déviance n'est pas définie. Cependant, même si vous fournissez des données de résultat, vous n'obtiendrez toujours pas les statistiques de déviance que vous souhaitez (y compris pD). La déviance sera nulle et la fonction "jags" retombera sur l'heuristique Gelman pour pD (je n'ai pas écrit ceci alors ne me demandez pas de l'expliquer), qui sera également nulle. La probabilité que vous vouliez vraiment est

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

Mais JAGS vous donne

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

qui est toujours 1. Le "focus" de DIC est faux. Je ne sais pas ce que fait WinBUGS dans ces circonstances. Peut-être qu'il a des règles spéciales pour les variables censurées.

scottyaz
la source