Wie funktioniert dinterval () für intervallzensierte Daten in JAGS?

8

Ich versuche zu verstehen, wie dinterval () in JAGS für zensierte Daten funktioniert. Ich modelliere grobe Daten, bei denen ich nur Ober- und Untergrenzen für jeden Datenpunkt habe (nicht den wahren Wert). Hier ist ein einfaches Beispiel, wie es meiner Meinung nach funktionieren sollte:

Einige Ober- und Untergrenzen für jeden Punkt:

> 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

Eine Funktion zum Schreiben des Modells (unter der Annahme, dass die Daten von einer Normalen mit einem gemeinsamen Mittelwert und einer gemeinsamen Varianz stammen):

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)

Einige Funktionen und Zuweisungen für den Jags-Aufruf:

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

Und führen Sie das Modell aus:

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

Was passiert, wenn ich das ausführe?

1) Meine Schätzung von mu schwebt genau um 0, wenn es 15 sein sollte

2) es wird nicht ausgeführt, wenn DIC = TRUE:

Fehler: "Fehler in jags.samples (model, variable.names, n.iter, thin, type =" trace ",: Trace-Monitor für Knotenabweichung konnte nicht festgelegt werden

Hinweis: Ich kann ein ähnliches Modell in OpenBUGS ausführen, indem ich die Zeile dinterval () weglasse und I (Lower, Upper) an dnorm anhänge.

Scottyaz
quelle

Antworten:

6

Hier ist eine Antwort von Martyn Plummer:

Wie geschrieben, hat Ihr Modell keine beobachteten Ergebnisse. Sie haben wahrscheinlich bemerkt, dass es wirklich sehr, sehr schnell läuft. Dies liegt daran, dass es sich um eine Vorwärtsabtastung vom vorherigen handelt. Aus diesem Grund ist Ihr posteriorer Mittelwert für mu der gleiche wie der vorherige Mittelwert von 0. Der Variablenname "is.censored" eignet sich für links- oder rechtszensierte Daten, wie sie in der Überlebensanalyse gefunden wurden, jedoch nicht für Ihr Problem. Also werde ich es "y" umbenennen. Wenn Sie haben

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

und lim [j] hat zwei Spalten, dann kann y [j] drei mögliche Werte annehmen

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] 

Um intervallzensierte Daten zu modellieren, müssen Sie y [j] als Daten in Ihrem Modell angeben. In Ihrem Fall wissen Sie, dass t [j] immer zwischen lim [j, 1] und lim [j, 2] liegt, also sollten Ihre Daten sein.

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

Das Problem mit DIC ist ziemlich tief. Da Ihr Modell keine Ergebnisdaten enthält, ist die Abweichung nicht definiert. Selbst wenn Sie Ergebnisdaten angeben, erhalten Sie dennoch nicht die gewünschte Abweichungsstatistik (einschließlich pD). Die Abweichung ist Null und die Funktion "Zacken" greift auf die Gelman-Heuristik für pD zurück (ich habe dies nicht geschrieben, also bitte mich nicht, es zu erklären), die ebenfalls Null ist. Die Wahrscheinlichkeit, die Sie wirklich wollen, ist

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

Aber JAGS gibt dir

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

Das ist immer 1. Der "Fokus" von DIC ist falsch. Ich weiß nicht, was WinBUGS unter diesen Umständen macht. Vielleicht gibt es spezielle Regeln für zensierte Variablen.

Scottyaz
quelle