2016-12-15 27 views
1

我试图按照Hui,Ibrahim和Sinha(1999)提出的方法实施一个具有治愈率的Weibull比例风险模型 - 具有存活分数的新的生存数据贝叶斯模型。但是,我不确定是否可以为JAGS中的循环定义一个随机限制。是否可以为JAGS中的循环定义一个随机限制?

library(R2OpenBUGS) 
library(rjags) 

set.seed(1234) 
censored <- c(1, 1) 
time_mod <- c(NA, NA) 
time_cens <- c(5, 7) 
tau <- 4 
design_matrix <- rbind(c(1, 0, 0, 0), c(1, 0.2, 0.2, 0.04)) 

jfun <- function() { 

    for(i in 1:nobs) { 
    censored[i] ~ dinterval(time_mod[i], time_cens[i]) 
    time_mod[i] <- ifelse(N[i] == 0, tau, min(Z)) 

    for (k in 1:N[i]){ 
     Z[k] ~ dweib(1, 1) 
    } 

    N[i] ~ dpois(fc[i]) 
    fc[i] <- exp(inprod(design_matrix[i, ], beta)) 

    } 

    beta[1] ~ dnorm(0, 10) 
    beta[2] ~ dnorm(0, 10) 
    beta[3] ~ dnorm(0, 10) 
    beta[4] ~ dnorm(0, 10) 
} 

inits <- function() { 
    time_init <- rep(NA, length(time_mod)) 
    time_init[which(!status)] <- time_cens[which(!status)] + 1 
    out <- list(beta = rnorm(4, 0, 10), 
       time_mod = time_init, 
       N = rpois(length(time_mod), 5)) 
    return(out) 
} 

data_base <- list('time_mod' = time_mod, 'time_cens' = time_cens, 
        'censored' = censored, 'design_matrix' = design_matrix, 
        'tau' = tau, 
        'nobs' = length(time_cens[!is.na(time_cens)])) 


tc1 <- textConnection("jmod", "w") 
write.model(jfun, tc1) 
close(tc1) 

# Calling JAGS 
tc2 <- textConnection(jmod) 
j <- jags.model(tc2, 
       data = data_base, 
       inits = inits(), 
       n.chains = 1, 
       n.adapt = 1000) 

我看到下面的错误:

Error in jags.model(tc2, data = data_base, inits = inits(), n.chains = 1, : 
    RUNTIME ERROR: 
Compilation error on line 6. 
Unknown variable N 
Either supply values for this variable with the data 
or define it on the left hand side of a relation. 
+0

只是好奇:BR呢? –

回答

1

我不能完全肯定,但我敢肯定,你不能在一般的BUGS声明节点的随机数,所以它不会是一个特定的JAGS的怪癖。

尽管如此,你可以解决这个问题。

由于BUGS是一个说明性语言,而不是程序性的,它足以声明一个任意但确定性节点数目(比方说“足够大”),然后只有随机数他们与关联一个分布和观测数据,剩下的节点是确定性的。

一旦你观察到的N[i](比方说N.max)的最大值,你可以把它作为一个参数到JAGS,然后改变你的这段代码:

for (k in 1:N[i]){ 
    Z[k] ~ dweib(1, 1) 
} 

到这一点:

for (k in 1:N.max){ 
    if (k <= N[i]){ 
    Z[k] ~ dweib(1, 1) 
    } else { 
    Z[k] <- 0 
    } 
} 

我希望这会在你的情况下做到这一点。所以请给出反馈意见。

不用说,如果你有一些不为零时,观察到的关联确定性Z[k]数据,然后所有的地狱破散里面尖齿...

+1

谢谢。最后,我找到了一个统计解决方案,将我的潜在变量进行整合。 –

+0

很好。至少,你有一个新的窍门来掖着你的袖子。 –

相关问题