我希望代码在两个
的设置中生成生存曲线目标是证明计费方法如何影响人寿保险政策失效。它很复杂
在阅读关于时间相关协变量的小插图后,我不知道如何从具有两个时间相关协变量和时变系数的模型生成生存曲线。
library(survival)
Samp <- data.frame(
id = c(143,151,680,134),
time = c(17,16,17,18) ,
censor= rep(1,4) ,
covariate = seq(5,20,length.out = 4))
# Lookup provides the values of a tdc
Lookup <- data.frame(
id =c(rep(134,2),680,143,rep(151,3)) ,
billing.mode = c("INV",rep("EFT",2),rep("INV",2),"EFT","INV") ,
switch.time = c(0,3,rep(0,3),2,7))
# create the tdc
Samp.tdc <- tmerge(data1=Samp,data2=Samp,id=id,
lapse=event(time,censor))
Samp.tdc <- tmerge(data1=Samp.tdc,data2=Lookup,id=id,
billing.mode=tdc(switch.time,billing.mode))
Samp.tdc$inv = as.numeric(Samp.tdc$billing.mode == "INV")
# the call looks something like this
fit <-coxph(Surv(tstart, tstop, lapse) ~ inv + tt(inv) +
covariate*inv, data = Samp.tdc,
tt = function(x, t, ...) x * t)
当我说我想生成生存曲线时,我指的是一组固定时间和协变量值的预测生存率。让我们说下面的LpsData
。
LpsData <- data.frame(
tstart = rep(c(0,16,17),times=4),
tstop = rep(16:18,times=4) ,
lapse = 0 ,
covariate = rep(c(10,20),each=3,times=2) ,
inv = rep(c(0,1),each=6) ,
curve=rep(c('eft','inv'), each=6)
)
答案 0 :(得分:1)
这是一个相对复杂的问题,我个人发现
survival
软件包在这方面受到限制。例如你必须
预先指定时变的功能形式。另一种方法是
使用Piece-wise exponential Additive Models (PAMMs),可以通过
mgcv::gam
,因此继承了所有的灵活性
(+对非线性效应(包括时变效应)的惩罚估计)。
通常,您必须决定要适合哪种类型的模型。
让z
是您的时间相关协变量。比潜在的模型要多
mgcv
公式:+ z * t +
)+ s(z, by = t) +
)+ s(t, by = z) +
)+ te(t, z) +
)以下是使用 pbc
包中的survival
数据的示例,
随时间变化的协变量也存在于生存小插图中
(另请参见https://adibender.github.io/pammtools/articles/tdcovar.html
与PAMM的比较):
library(survival)
library(ggplot2)
theme_set(theme_bw())
library(pammtools)
library(mgcv)
首先,我将数据转换为分段指数数据(PED)格式:
pbc <- pbc %>% filter(id <= 312) %>%
select(id:sex, bili, protime) %>%
mutate(status = 1L * (status == 2))
## Transform to piece-wise exponential data (PED) format
pbc_ped <- as_ped(
data = list(pbc, pbcseq),
formula = Surv(time, status)~. | concurrent(bili, protime, tz_var = "day"),
id = "id") %>% ungroup()
pbc_ped <- pbc_ped %>%
mutate(
log_bili = log(bili),
log_protime = log(protime))
在这里,我拟合了带有2个时间相关协变量和线性协变量的模型 非线性时变(虽然估计值几乎是线性的) 由于受到惩罚)
pbc_pam <- gam(ped_status ~ s(tend, k = 10) + s(tend, by = log_bili) +
s(tend, by = log_protime),
data = pbc_ped, family = poisson(), offset = offset)
为了预测我
log_bili
的时间相关值add_surv_prob
添加生存概率预测+ CI ndf <- make_newdata(pbc_ped, tend = unique(tend)) %>%
mutate(log_bili = runif(n(), min(log_bili), max(log_bili))) %>%
add_surv_prob(pbc_pam)
ggplot(ndf, aes(x = tend, y = surv_prob)) +
geom_surv() +
geom_ribbon(aes(ymin = surv_lower, ymax = surv_upper), alpha = 0.3) +
ylim(c(0, 1))
```
由reprex package(v0.2.1)于2018-12-08创建