You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 13:30:41