r - 如何使用 R 生成具有时间相关协变量的生存数据

标签 r simulation survival-analysis data-generation

我想从包含时间相关协变量的 Cox 比例风险模型生成生存时间。该模型是

h(t|Xi) =h_0(t) exp(gamma*Xi + alpha*mi(t))

哪里Xi生成自 Binomial(1,0.5)mi(t)time-dependent covariate .

对于与时间无关的协变量,我生成如下
#For time independent case
# h_0(t) = 1
gamma <- -1
u <- runif(n=100,min=0,max=1)
Xi <- rbinom(n=100,size=1,prob=0.5)
T <- -log(u)/exp(gamma*Xi)

任何人都可以帮助我生成具有时变协变量的生存数据。

最佳答案

时间相关协变量通过在协变量变化时删失观察值并在时间 0 或删失时将它们重新输入队列来输入 Cox 模型。因此,基于事件观察的前/后时间段生成具有间隔的协变量矩阵,并合并非事件的多对一和事件的多对二。您可以删除事件后的协变量修改。 Cox 模型不处理协变量值和故障的并发变化,因此我们必须排除这种可能性。

为了模拟生存结果,您可以生成协变量值和切换点。然后根据基线协变量值模拟生存结果。如果第一个协变量变化时间超过失败时间,则保留失败时间并且该参与者没有协变量变化,否则在该失败时间审查观察并在审查时间使用新的协变量值将它们重新输入队列。模拟第二个协变量值变化(如果存在)和第二个可能的故障时间,迭代评估它们并仅在故障时间先于协变量变化值时结束。

对此,有人可能会提供比我更高效的代码,但一个简单的方法是使用递归。我暂时假设有一个恒定的基线风险函数(指数生存),但根据任意基线风险函数模拟生存结果的原理已在别处描述过,我把它留给你。为简单起见,我还将假设 m 是二进制的。同样,这是您总结的基础。

sim <- function(id=1:100, t0= rep(0, 100), m0=rep(0, 100), bfail=c(0,0), rchange=1) {
  tfail <- rexp(length(id), exp(bfail[1] + bfail[2]*m0))
  tchange <- rexp(length(id), rchange)
  tevent <- pmin(tfail, tchange)
  fevent <- tfail == tevent
  if (all(fevent))
    return(list(cbind('start'=t0, 'stop'=t0+tevent, 'event'=fevent, 'id'=id, 'm'=m0)))
  c(
    list(cbind('start'=t0, 'stop'=t0+tevent, 'event'=fevent, 'id'=id, 'm'=m0)), 
    sim(id = id[!fevent], t0=(t0+tevent)[!fevent], m0=1-m0[!fevent], bfail, rchange)
  )

}

可以运行一个例子:
set.seed(123)
times <- sim(id=1:1000, t0= rep(0, 1000), m0=rep(0, 1000), bfail=c(-1, -2), rchange=0.4)
times <- as.data.frame(do.call(rbind, times))
coxph(Surv(start, stop, event) ~ m, data=times)

给出以下输出:
> coxph(Surv(start, stop, event) ~ m, data=times)
Call:
coxph(formula = Surv(start, stop, event) ~ m, data = times)

    coef exp(coef) se(coef)     z      p
m -1.917     0.147    0.100 -19.1 <2e-16

Likelihood ratio test=533  on 1 df, p=0
n= 2852, number of events= 1000 

将 -1.917 系数与 -2 指数生存结果的对数风险比进行比较。

关于r - 如何使用 R 生成具有时间相关协变量的生存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24914409/

相关文章:

r - 创建一个新的数据框,其中包含前一个数据框中两列之间序列中每个值的行

r - 使用 ggplot2 绘制 1000 行

web-services - 是否有模拟 Web 服务(REST 和 SOAP)进行测试的工具?

simulation - System Verilog 仿真与执行

R - 从 Survfit with Strata 中提取汇总表

r - 观察事件有两个条件

java - 父子类之间的设计建议?

r - Cox回归中分层变量的参数估计和方差(层/生存包)

r - "survivalsvm"预测什么?

r - 在 rmarkdown 中绘制神经网络