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

在R中创建含时变协变量的计数过程数据集的技术问询

从个体级数据创建计数过程数据集(适配时变协变量的Cox模型)

我太懂这种卡在数据格式转换上的感觉了!你在复现Singer和Willett《应用纵向数据分析》第15章的时变协变量Cox模型时,找不到现成的R示例确实闹心——我结合书中的思路,用模拟数据给你一步步拆解怎么把个体级纵向数据转成计数过程格式,帮你打通这个卡点。

第一步:模拟个体级纵向数据

先构建一个贴合书中场景的模拟数据集:每个个体有多次随访测量(时变协变量),同时包含生存结局(事件发生时间/删失状态)。

library(survival)
library(dplyr)
library(tidyr)

# 模拟100个个体,每个个体有3次随访(时间点:0、2、4年)
set.seed(123)
individual_data <- tibble(
  id = rep(1:100, each = 3),
  time_measure = rep(c(0, 2, 4), 100), # 随访测量时间点
  bp = rnorm(300, mean = 120 + time_measure*2, sd = 8) # 时变协变量:随时间上升的血压
) %>%
  group_by(id) %>%
  # 生成个体的事件发生时间(基于血压水平)和结局状态
  mutate(
    event_time = rweibull(1, shape = 1.5, scale = exp(0.02*first(bp) + 0.05*mean(bp))),
    event = ifelse(event_time <= 4, 1, 0) # 4年内发生事件标记为1,否则删失
  ) %>%
  ungroup()

第二步:转换为计数过程格式

计数过程格式的核心是每个个体的随访区间对应一行数据,区间内携带该阶段的协变量值,同时标记该区间是否发生事件。

count_process_data <- individual_data %>%
  group_by(id) %>%
  arrange(time_measure) %>%
  # 1. 生成每个区间的起点和终点
  mutate(
    start = lag(time_measure, default = 0), # 区间起点:上一次随访时间,首次区间起点为0
    end = pmin(time_measure, event_time) # 区间终点:取随访时间和事件时间的较小值
  ) %>%
  # 2. 过滤掉事件发生后的无效区间
  filter(start < event_time) %>%
  # 3. 标记当前区间是否为事件发生区间
  mutate(status = ifelse(end == event_time & event == 1, 1, 0)) %>%
  # 4. 保留关键列并调整命名,适配survival包要求
  select(id, start, end, bp, status) %>%
  ungroup()

第三步:验证数据并拟合时变协变量Cox模型

转换完成后,就可以用计数过程格式的数据拟合时变协变量的Cox模型了:

# 查看转换后的计数过程数据示例
head(count_process_data)

# 拟合时变协变量Cox模型
cox_time_varying <- coxph(Surv(start, end, status) ~ bp, data = count_process_data)
summary(cox_time_varying)

关键注意事项

  • 一定要按个体的随访时间排序,否则lag()生成的区间起点会出错;
  • 区间终点必须取pmin(time_measure, event_time),避免出现区间覆盖事件发生时间的情况;
  • 事件状态status仅在事件发生的区间标记为1,其他区间均为0,确保模型识别正确的事件时点。

内容的提问来源于stack exchange,提问作者llewmills

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:59:35