生存分析长格式数据格式设置:新手的数据格式正确性验证
生存分析数据格式梳理&你的模拟数据点评
嘿,刚接触生存分析就动手模拟数据,已经超棒啦!先把你提供的模拟数据代码整理出来(注意group向量看起来没写完,我先按现有内容呈现):
id <- c(rep("1", 10), rep("2", 10), rep("3", 10), rep("4", 10), rep("5", 10)) age <- c((15:24), (35:44), (45:54), (55:64), (40:49)) event <- c(rep("0", 10), 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2) group <- c("a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "a", ...) # 此处向量未完成
接下来咱们聊聊生存分析里数据格式的核心要求,再对照你的数据捋捋问题:
一、常规生存分析的基础数据逻辑
标准生存分析数据集一般每个个体对应一行记录,核心必须包含三个字段:
- 个体标识(比如你的
id) - 生存时间:这是你目前缺失的关键项!生存分析必须知道每个个体从随访开始到事件发生/删失的时长
- 事件状态(你的
event):通常是二分类,0代表删失(没发生目标事件),1代表事件发生;如果出现2这类多分类,那属于竞争风险模型的范畴,得特殊处理
二、你的数据里需要注意的细节
- 重复记录的合理性:你给的
id每个值重复了10次,也就是每个个体有10条记录。如果这是随时间变化的协变量(比如不同随访时间点的指标变化),那这种格式是合理的,但你得补充对应的时间区间变量(比如start和stop时间);如果只是普通的单时点协变量,那每个个体只需要一行记录,重复记录会直接导致分析错误。 - 事件状态
event的取值:你的event里有0、1、2,如果2代表另一种竞争事件(比如患者既可能发生目标疾病,也可能因其他原因死亡),那要明确每个状态的定义,后续用竞争风险模型(比如cmprsk包)分析;如果是输入失误,那得修正为0/1的二分类。 - 缺失生存时间:目前代码里完全没体现生存时间变量(比如
time),这是生存分析的核心,必须补上!比如可以模拟每个个体的随访时间:
# 示例:随机模拟50条生存时间(对应你现有数据的行数) time <- sample(1:100, 50, replace = TRUE)
group变量未补全:你的group向量长度不够,得补到和id、age、event一致的50个元素,不然运行代码会直接报错。
三、调整后的示例数据(常规单记录格式)
如果是普通生存分析场景,你可以把数据改成每个个体一行的格式,比如:
# 每个个体一条记录 id <- c("1", "2", "3", "4", "5") age <- c(20, 40, 50, 60, 45) # 取每个个体年龄的均值或某个时点值 time <- c(80, 60, 40, 30, 50) # 模拟生存时间 event <- c(0, 1, 1, 1, 2) # 0=删失,1=目标事件,2=竞争事件 group <- c("a", "a", "b", "a", "b") # 整理为数据框 surv_data <- data.frame(id, age, time, event, group)
这样的格式就能直接拿来做分析了,比如用survival包构建生存对象:
library(survival) # 构建生存对象(如果是二分类event) surv_obj <- Surv(time = surv_data$time, event = surv_data$event == 1) # 绘制KM曲线 km_fit <- survfit(surv_obj ~ group, data = surv_data) plot(km_fit, lty = 1:2, col = c("red", "blue"), xlab = "Time", ylab = "Survival Probability") legend("bottomleft", legend = c("Group a", "Group b"), lty = 1:2, col = c("red", "blue")) # 如果是竞争风险场景,用cmprsk包 library(cmprsk) crr_fit <- crr(ftime = surv_data$time, fstatus = surv_data$event, cov1 = surv_data$group) summary(crr_fit)
要是你的重复记录是为了处理时依变量,随时告诉我,我再帮你梳理时依数据的格式要求~
内容的提问来源于stack exchange,提问作者T.P.
相关产品推荐
相关产品推荐

