右删失生存符合 JAGS

机器算法验证 生存 马尔可夫链蒙特卡罗 锯齿 审查 威布尔分布
2022-04-01 17:18:44

更新:我运行了 JAGS 模型,这消除了我问题中令人分心的部分。这实际上是关于为 dinterval() 和 inits 正确准备数据。

当从时间向量和删失状态向量开始时​​,我找不到准备右删失生存数据以用于 JAGS 的具体示例。我见过的例子都有一个恒定的审查时间。

我的两个问题是:

  1. 当您从事件时间向量和审查/失败状态的匹配向量开始时​​,准备 dinterval(t[i], c[i]) 的正确方法是什么?
  2. 提供事件时间的初始值向量的原因是什么,其中未审查时间设置为 NA 并且审查时间设置为大于观察审查时间的值?我真的很难理解这一点。

更新:我想我有(2)的答案。显然,如果您尝试覆盖 init 向量中的值,JAGS 会抱怨,但如果该向量被初始化为 NA 它可以工作。

请注意,我对这些要求的理解来自于查看现有的在线示例。如果要求没有根据,我很乐意学习。

我使用来自生存包的 aml 数据集创建了一个简短的测试,该数据集进行生存拟合,然后尝试使用 JAGS 拟合 Weibull 分布并添加这些点以进行比较。最初我认为您必须为 dinterval(t[i], c[i]) 的 c[i] 中的未经审查的时间传递零,但这会导致错误:

节点中的错误 is.censored[1] 在初始化时观察到的节点与观察到的父节点不一致。尝试设置适当的初始值。

这是我的示例 R 脚本。有些行似乎缩进太多,不知道为什么。我将所有选项卡转换为空格,它在我的编辑窗口中看起来很干净:

# Right-censoring test
require(survival)
require(runjags)
graphics.off()
rm(fit, S, results)

# SURVIVAL FIT AND PLOT
fit <- survfit(Surv(aml$time, aml$status) ~ 1, conf.type = "log-log")
plot(fit, xlab = "time", ylab = "survival", main = "AML survival")

# JAGS WEIBULL FIT WITH CENSORING
# Model uses three different versions of observed times.
# t.orig is the original set of observed times including censored times.
# t.mod has the censored times set to NA.
# t.cens is the set I have questions about. Currently the same as t.orig
# but is that the proper choice?
#
model <- "model {
    for(i in 1:N) {
        is.censored[i] ~ dinterval(t.mod[i], t.cens[i])
        t.mod[i] ~ dweib(a, b)
        S[i] <- 1 - pweib(t.orig[i], a, b)
    }
    a ~ dgamma(3.5, 2)
    b ~ dgamma(1.5, 100)
}"

censored <- !aml$status
    t.orig <- aml$time
t.mod <- aml$time
    t.mod[censored] <- NA
    t.cens <- aml$time
# Online examples seem to indicate special treatment of the c[i]
# passed to dinterval(t[i], c[i]), changing the uncensored times.
#t.cens[!censored] <- 0 # THIS CAUSES AN ERROR

data <- dump.format(list(
    t.orig = t.orig,
    t.mod = t.mod,
    N = length(t.mod),
    t.cens = t.cens,
    is.censored = as.numeric(censored)  
))

# Apparently you must provide initial values of the time vector
# with uncensored times of NA and censored times > the observed time.
# I don't understand this requirement at all.
t.init <- rep(NA, length(t.mod))
t.init[censored] <- t.cens[censored] + 1

inits <- c(
    dump.format(list(a = 1.1, b = 3.0e-4, t.mod = t.init)),
    dump.format(list(a = 2.3, b = 0.02, t.mod = t.init))
)
results = run.jags(model, monitor=c("S", "a", "b"), data=data, inits=inits)
S <- print(results, vars="S")
points(aml$time, S[,4], col="blue", pch=19)
    segments(aml$time, S[,1], aml$time, S[,3], col="blue", lwd=2)

感谢您花时间看这个。

1个回答

我被要求从我在http://doingbayesiandataanalysis.blogspot.com/2012/01/complete-example-of-right-censoring-in.html的评论中重新发布这个答案这个答案 的细节与模型有关在该评论中,但这些概念适用于此处的主题。


审查数据的 JAGS 模型的核心是:

isCensored[i] ~ dinterval( y[i] , censorLimitVec[i] )
y[i] ~ dnorm( mu , tau )

理解 JAGS 正在做什么的关键是 JAGS 会自动为数据中未指定为常量的任何变量插补一个随机值。因此,当y[i]NA(即,缺失值,而不是常数)时,JAGS 为其估算一个随机值。

但它应该产生什么价值?

上面模型的第二行表示,它y[i]应该是从具有平均 mu 和精度 tau 的正态分布随机生成的。

但是,上面模型的第一行对随机生成的值施加了另一个约束y[i]该行表示,无论 的值y[i]是随机生成的,它都必须落在censorLimitVec[i]由 的值决定的一侧isCensored[i]

为了理解这部分,让我们解压dinterval()发行版。假设其中censorLimitVec有 3 个值,而不仅仅是 1:

censorLimitVec = c(10,20,30)

然后随机生成的值dinterval(y,c(10,20,30))将是 0、1、2 或 3,具体取决于是否是的<10,10<是的<20,20<是的<30, 或者30<是的. 因此,如果是的=15,dinterval(y,c(10,20,30))有输出1有 100% 的概率。诀窍是:我们改为指定 的输出,并估算一个可以产生它dinterval的随机值。y因此,如果我们说

1 ~ dinterval(y,c(10,20,30))

然后y被估算为 10 到 20 之间的随机值。

将两个模型语句放在一起,

1 ~ dinterval( y , censorLimit )

y ~ dnorm( mu , tau )

表示y来自正常密度并且y必须低于censorLimit.

希望有帮助!!