关于用simmer R结合DES方法从删失数据模拟事件发生时间的技术咨询
结合simmer与flexsurv实现带协变量的事件时间模拟
完全可以将simmer(离散事件模拟工具)与flexsurv(生存建模工具)结合,实现从带协变量的删失患者数据中模拟事件发生时间,这是生存分析与离散事件模拟交叉场景下的常用做法。以下是具体的实现思路和代码示例:
核心步骤
- 用flexsurv拟合带协变量的生存模型(基于你的删失患者数据)
- 将拟合好的模型整合到simmer的模拟流程中,动态生成个体事件时间
代码示例
1. 加载依赖包
library(simmer) library(flexsurv) library(survival)
2. 准备删失生存数据(替换为你的真实数据)
这里先模拟一组带协变量的删失数据,用于后续模型拟合:
set.seed(123) n <- 200 # 生成协变量 cov1 <- rnorm(n) # 连续协变量 cov2 <- factor(sample(c("A", "B"), n, replace = TRUE)) # 分类协变量 # 生成真实事件时间(Weibull分布,受协变量影响) true_time <- rweibull(n, shape = 2, scale = exp(0.5 + 0.3*cov1 + 0.2*(cov2 == "B"))) # 生成删失时间 cens_time <- runif(n, 5, 10) # 构建观测数据(时间+事件指示) obs_time <- pmin(true_time, cens_time) event <- as.integer(true_time <= cens_time) data <- data.frame(time = obs_time, event = event, cov1 = cov1, cov2 = cov2)
3. 用flexsurv拟合生存模型
以Weibull模型为例,你可以根据数据特性选择其他分布(如指数、对数正态等):
# 拟合带协变量的Weibull生存模型 fit <- flexsurvreg(Surv(time, event) ~ cov1 + cov2, data = data, dist = "weibull") print(fit)
4. 整合到simmer模拟中
定义患者轨迹,动态生成协变量并基于拟合模型计算事件时间:
# 创建模拟环境 sim_env <- simmer("Survival Event Simulation") # 定义患者轨迹:生成协变量 → 计算事件时间 → 等待至事件发生 patient_traj <- trajectory("Patient Flow") %>% # 为新患者生成协变量(可替换为真实患者的协变量数据) set_attribute("cov1", function() rnorm(1)) %>% set_attribute("cov2", function() sample(c("A", "B"), 1)) %>% # 根据协变量从拟合模型生成事件时间 timeout(function() { # 获取当前患者的协变量值 cov_val1 <- get_attribute(sim_env, "cov1") cov_val2 <- as.integer(get_attribute(sim_env, "cov2") == "B") # 基于模型参数计算Weibull分布的scale参数 scale_val <- exp(fit$coefficients["(Intercept)"] + cov_val1*fit$coefficients["cov1"] + cov_val2*fit$coefficients["cov2B"]) # 生成事件时间 rweibull(1, shape = fit$coefficients["shape"], scale = scale_val) }) %>% log_("Event occurred for patient") # 添加患者到达逻辑:每1单位时间到达1名患者 sim_env %>% add_generator("patient_", patient_traj, at(seq(0, 10, 1))) %>% run(until = 20)
关键说明
- 模型适配性:如果你的数据更适合Cox比例风险模型,可使用
flexsurvreg的dist="coxph",再通过逆变换法(基于个体生存函数)生成事件时间 - 协变量来源:示例中模拟了协变量,实际项目中可直接导入真实患者的协变量数据,替换轨迹中的协变量生成逻辑
- 删失处理:flexsurv在拟合模型时已自动考虑删失数据,因此生成的事件时间是基于模型的无偏估计
内容的提问来源于stack exchange,提问作者margauxto
相关产品推荐
相关产品推荐

