dinterval () для данных, подвергнутых цензуре с интервалом? - PullRequest
3 голосов
/ 03 августа 2011

Я новичок в JAGS и пытаюсь понять, как dinterval () работает в JAGS для цензурированных данных. Я моделирую грубые данные, где у меня есть только верхняя и нижняя границы для каждой точки данных (не истинное значение). Вот простой пример того, как я думаю, что это должно работать:

Некоторые верхние и нижние границы для каждой точки:

> 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

Функция для записи модели (при условии, что данные получены из нормали с общим средним и дисперсией):

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)

Некоторые функции и назначения для вызова 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")

И запустить модель:

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

Что происходит, когда я запускаю это?

1) моя оценка мю колеблется прямо около 0, когда она должна быть 15

2) он не будет работать, если DIC = TRUE:

ошибка: "Ошибка в jags.samples (model, variable.names, n.iter, thin, type =" trace ",: Не удалось настроить монитор трассировки для отклонения узла

Я уверен, что я делаю что-то глупое, и был бы признателен, если бы кто-то мог помочь поставить меня на правильный путь.

1 Ответ

2 голосов
/ 09 августа 2011

Ниже приводится ответ Мартина Пламмера:

Как написано, ваша модель не имеет наблюдаемых результатов. Вы, наверное, заметили, что он работает очень быстро. Это потому, что это прямая выборка из предыдущего. Вот почему ваше последующее среднее значение для mu совпадает с предыдущим средним значением 0. Имя переменной «is.censored» подходит для данных, подвергнутых левой или правой цензуре, как показано в анализе выживания, но не для вашей проблемы. Поэтому я собираюсь переименовать его в «у». Если у вас есть

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

и lim [j] имеет два столбца, тогда y [j] может принимать три возможных значения

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] 

Чтобы смоделировать данные, подвергнутые цензуре с интервалом, вам необходимо указать y [j] в качестве данных в вашей модели. В вашем случае вы знаете, что t [j] всегда находится между lim [j, 1] и lim [j, 2], поэтому ваши данные должны быть такими.

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

Проблема с DIC довольно глубокая. Поскольку ваша модель не имеет данных о результатах, отклонение не определено. Однако, даже если вы предоставите данные о результатах, вы все равно не получите желаемую статистику отклонений (включая pD). Отклонение будет равно нулю, а функция "зазубрин" будет опираться на эвристику Гельмана для pD (я не писал этого, поэтому не просите меня объяснить), что также будет равно нулю. Вероятность, которую вы действительно хотите, составляет

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

Но JAGS дает вам

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

, который всегда равен 1. «Фокус» DIC неправильный. Я не знаю, что WinBUGS делает в этих условиях. Возможно, у него есть специальные правила для цензурированных переменных.

...