Como funciona dinterval () para dados censurados por intervalo no JAGS?

8

Estou tentando entender como dinterval () funciona no JAGS para dados censurados. Estou modelando dados grosseiros, onde só tenho limites superior e inferior para cada ponto de dados (não o valor verdadeiro). Aqui está um exemplo simples de como acho que deve funcionar:

Alguns limites superior e inferior para cada ponto:

> 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

Uma função para escrever o modelo (supondo que os dados sejam normais, com média e variância comuns):

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)

Algumas funções e atribuições dos jags chamam:

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

E execute o 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")

O que acontece quando eu corro isso?

1) minha estimativa de mu fica em torno de 0 quando deveria ser 15

2) não será executado se DIC = TRUE:

error: "Erro no jags.samples (model, variable.names, n.iter, thin, type =" trace ",: Falha ao configurar o monitor de rastreamento para desvio de nó

Nota: Posso obter um modelo semelhante em execução no OpenBUGS, omitindo a linha dinterval () e anexando I (Lower, Upper) ao dnorm.

scottyaz
fonte

Respostas:

6

Aqui está uma resposta de Martyn Plummer:

Conforme escrito, seu modelo não possui nenhum resultado observado. Você provavelmente percebeu que ele é realmente muito rápido. Isso ocorre porque é uma amostragem direta do anterior. É por isso que sua média posterior para mu é igual à média anterior de 0. O nome da variável "is.censored" é apropriado para dados censurados à esquerda ou à direita, conforme encontrado na análise de sobrevivência, mas não para o seu problema. Então, eu vou mudar o nome "y". Se você tem

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

e lim [j] tem duas colunas, então y [j] pode assumir três valores possíveis

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 dados censurados por intervalo, você precisa fornecer y [j] como dados em seu modelo. No seu caso, você sabe que t [j] sempre fica entre lim [j, 1] e lim [j, 2], portanto seus dados devem estar.

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

O problema com o DIC é bastante profundo. Como seu modelo não possui dados de resultado, o desvio não é definido. No entanto, mesmo que você forneça dados de resultados, ainda não obterá as estatísticas de desvio desejadas (incluindo pD). O desvio será zero e a função "jags" recairá na heurística Gelman para pD (eu não escrevi isso, então não me peça para explicá-lo), que também será zero. A probabilidade que você realmente deseja é

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

Mas o JAGS está lhe dando

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

que é sempre 1. O "foco" do DIC está errado. Não sei o que o WinBUGS faz nessas circunstâncias. Talvez tenha regras especiais para variáveis ​​censuradas.

scottyaz
fonte