如何用R的dplyr/tmerge实现带延迟进入的时变协变量生存模型数据处理?
解决方案:生成带时变协变量的延迟进入生存分析数据框
针对你的需求,以下提供两种实现方式:一种基于dplyr/tidyr的纯tidyverse操作,另一种是正确使用survival包的tmerge函数处理延迟进入场景。
方法一:使用dplyr/tidyr拆分时间区间
这种方法通过手动拆分每个研究对象的随访区间,明确处理时变协变量和结局事件的赋值:
library(dplyr) library(tidyr) # 合并基础数据,处理无效的癌症时间 combined_df <- df1 %>% left_join(df2, by = "id") %>% # 将NA或超出随访区间的癌症时间设为随访结束后,避免无效拆分 mutate(stop_time_cancer = case_when( is.na(stop_time_cancer) ~ stop_time + 1, stop_time_cancer < start_time | stop_time_cancer > stop_time ~ stop_time + 1, TRUE ~ stop_time_cancer )) # 生成时间区间并赋值变量 df_temp <- combined_df %>% rowwise() %>% # 收集关键时间点并排序 mutate(time_points = list(sort(unique(c(start_time, stop_time_cancer, stop_time))))) %>% unnest(time_points) %>% group_by(id) %>% # 生成每个区间的起始和结束时间 mutate(start_time = lag(time_points, default = first(time_points)), stop_time = time_points) %>% # 过滤零长度区间 filter(start_time != stop_time) %>% # 赋值时变协变量:癌症发生后区间状态为对应值,之前为0 mutate(cancer_event = ifelse(start_time >= stop_time_cancer, cancer_status, 0)) %>% # 赋值结局事件:仅最后一个区间保留原事件状态,其余为0 mutate(event = ifelse(stop_time == max(stop_time), event, 0)) %>% select(id, start_time, stop_time, cancer_event, event) %>% ungroup() # 输出结果 df_temp
方法二:正确使用tmerge处理延迟进入
你之前使用tmerge失败可能是未正确适配延迟进入的格式,以下是正确的实现方式:
library(survival) # 重命名基础数据列以适配tmerge的要求 base_df <- df1 %>% rename(tstart = start_time, tstop = stop_time) # 整理癌症事件的时间数据 cancer_df <- df2 %>% filter(!is.na(stop_time_cancer)) %>% rename(tstop = stop_time_cancer) %>% mutate(cancer_event = cancer_status) # 使用tmerge合并生成时变数据 df_temp_tmerge <- tmerge(base_df, base_df, id = id, # 定义结局事件 event = event(tstart, tstop, event), # 定义时间依赖协变量:tdc表示时间点触发协变量变化 cancer_event = tdc(tstop, cancer_event)) %>% as_tibble() %>% # 重命名列匹配目标格式 rename(start_time = tstart, stop_time = tstop) %>% # 将未触发癌症事件的区间状态设为0 mutate(cancer_event = replace_na(cancer_event, 0)) # 输出结果 df_temp_tmerge
两种方法生成的结果均与你提供的df_temp一致,可直接用于带延迟进入的时变协变量生存分析。
内容的提问来源于stack exchange,提问作者laus0204
相关产品推荐
相关产品推荐

