为扩展Cox模型与JM模型创建起始/终止年份变量的技术问询
解决扩展Cox与JM模型的起始/终止年份变量创建及时间一致性验证问题
步骤1:验证纵向观测时间与生存时间的一致性
首先需要确认每个受试者的最后一次纵向观测时间与生存时间匹配:事件发生的受试者,最后观测时间应等于生存时间;截尾受试者的最后观测时间不能超过生存时间。
假设你的纵向数据集名为long_data,包含字段:id(受试者ID)、obs_time(纵向观测时间,已转成年)、surv_time(生存时间,已转成年)、event(事件状态:1=发生事件,0=截尾)。用以下代码验证:
library(dplyr) # 分组计算每个受试者的关键时间点 time_check <- long_data %>% group_by(id) %>% summarize( max_obs = max(obs_time), surv_time = first(surv_time), event = first(event) ) # 检查一致性(允许微小浮点误差) time_check <- time_check %>% mutate( is_consistent = case_when( event == 1 ~ abs(max_obs - surv_time) < 1e-6, event == 0 ~ max_obs <= surv_time + 1e-6 ) ) # 查看不一致的记录,需先修正这些数据 time_check %>% filter(!is_consistent)
如果存在不一致的记录,需要先修正数据:比如事件发生的受试者最后观测时间晚于生存时间,需删除该观测;截尾受试者的观测时间超过生存时间,也需删除对应记录:
# 过滤掉不符合逻辑的观测记录 long_data_clean <- long_data %>% group_by(id) %>% filter(obs_time <= surv_time + 1e-6) %>% ungroup()
步骤2:创建起始(start)与终止(stop)年份变量
针对每个受试者的11次重复观测,按观测时间排序后,用前一次观测时间作为当前区间的起始,当前观测时间作为终止;事件发生的受试者,最后一次区间的终止时间需替换为生存时间,确保与结局一致:
# 按受试者ID和观测时间排序 long_data_clean <- long_data_clean %>% arrange(id, obs_time) # 生成start和stop变量 long_data_final <- long_data_clean %>% group_by(id) %>% mutate( # 第一次观测的起始时间为0,后续为前一次的观测时间 start = lag(obs_time, default = 0), # 默认终止时间为当前观测时间 stop = obs_time, # 修正事件发生受试者的最后一次终止时间 stop = ifelse(row_number() == n() & event == 1, surv_time, stop) ) %>% ungroup()
结果验证
检查最终数据的合理性:
# 验证事件发生受试者的最后一次stop是否等于生存时间 long_data_final %>% group_by(id) %>% filter(row_number() == n() & event == 1) %>% select(id, stop, surv_time) # 查看每个受试者的时间区间是否连续 long_data_final %>% group_by(id) %>% mutate(interval_gap = start - lag(stop, default = 0)) %>% filter(interval_gap > 1e-6)
内容的提问来源于stack exchange,提问作者Festus Akwasi Boakye
相关产品推荐
相关产品推荐

