Bagaimana cara dinterval () untuk data censored interval bekerja di JAGS?

8

Saya mencoba memahami bagaimana dinterval () bekerja di JAGS untuk data yang disensor. Saya memodelkan data kasar di mana saya hanya memiliki batas atas dan bawah untuk setiap titik data (bukan nilai sebenarnya). Berikut adalah contoh sederhana tentang bagaimana saya pikir itu harus berfungsi:

Beberapa batas atas dan bawah untuk setiap titik:

> 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

Fungsi untuk menulis model (dengan asumsi data berasal dari normal dengan mean dan varian umum):

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)

Beberapa fungsi dan tugas untuk panggilan 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")

Dan jalankan model:

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

Apa yang terjadi ketika saya menjalankan ini?

1) perkiraan mu melayang tepat di sekitar 0 padahal seharusnya 15

2) itu tidak akan berjalan jika DIC = BENAR:

kesalahan: "Kesalahan dalam jags.samples (model, variable.names, n.iter, thin, type =" trace ",: Gagal menyetel monitor jejak untuk penyimpangan simpul

Catatan: Saya dapat menjalankan model serupa di OpenBUGS dengan menghilangkan garis dinterval () dan menambahkan I (Bawah, Atas) ke dnorm.

scottyaz
sumber

Jawaban:

6

Ini jawaban dari Martyn Plummer:

Seperti yang ditulis, model Anda tidak memiliki hasil yang diamati. Anda mungkin memperhatikan bahwa ini berjalan sangat cepat. Ini karena merupakan sampling maju dari sebelumnya. Itulah sebabnya rata-rata posterior Anda untuk mu sama dengan rata-rata sebelumnya dari 0. Nama variabel "is.censored" sesuai untuk data yang disensor kiri atau kanan, seperti yang ditemukan dalam analisis survival, tetapi tidak untuk masalah Anda. Jadi saya akan menamainya menjadi "y". Jika Anda memiliki

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

dan lim [j] memiliki dua kolom, maka y [j] dapat mengambil tiga nilai yang mungkin

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] 

Untuk memodelkan data yang disensor interval, Anda perlu menyediakan y [j] sebagai data dalam model Anda. Dalam kasus Anda, Anda tahu bahwa t [j] selalu berada di antara lim [j, 1] dan lim [j, 2] sehingga data Anda seharusnya.

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

Masalah dengan DIC cukup dalam. Karena model Anda tidak memiliki data hasil, penyimpangan tidak ditentukan. Namun, bahkan jika Anda memberikan data hasil, Anda masih tidak akan mendapatkan statistik penyimpangan yang Anda inginkan (termasuk pD). Penyimpangan akan menjadi nol dan fungsi "jags" akan jatuh kembali pada heuristik Gelman untuk pD (saya tidak menulis ini jadi jangan minta saya untuk menjelaskannya), yang juga akan menjadi nol. Kemungkinan yang Anda inginkan adalah

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

Tapi JAGS memberimu

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

yang selalu 1. "Fokus" DIC salah. Saya tidak tahu apa yang dilakukan WinBUGS dalam situasi ini. Mungkin ia memiliki aturan khusus untuk variabel yang disensor.

scottyaz
sumber