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

为扩展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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 22:41:26