如何在R中使用长格式数据绘制Kaplan Meier生存曲线?
用长格式数据做Kaplan-Meier模型的正确方法
不需要将数据转为宽格式,但必须先对长格式数据做个体级聚合——保留每个观测单元(id)的最终生存状态记录,因为Kaplan-Meier模型要求每个输入行对应一个个体的完整生存信息(总生存时间+结局状态)。
问题根源
你直接用原始长格式数据建模时,每个id的每日记录都会被当作独立观测,相当于把同一个商品的每一天都视为新个体,完全违背了KM模型的假设,导致结果错误。
解决步骤
1. 处理长格式数据,提取个体最终记录
用dplyr筛选每个id的最后一行(或聚合得到总上市时长与最终售出状态):
pacman::p_load(survival, ggsurvfit, dplyr) # 方法1:直接取每个id的最后一行(推荐,因为最后一行就是最终状态) sales_processed <- sales %>% group_by(id) %>% slice(n()) %>% ungroup() # 方法2:聚合计算总上市时长和最终售出状态(结果一致) sales_processed <- sales %>% group_by(id) %>% summarise( time_on_market = max(time_on_market), sold = max(sold), # 售出状态取最大值:1代表已售出,0代表未售出(删失) date = last(date) # 可选,保留最后记录的日期 ) %>% ungroup()
2. 构建KM模型并绘图
处理后的数据结构和你之前的宽格式数据一致,直接用你原来的代码即可得到正确结果:
survfit2(Surv(time_on_market, sold) ~ 1, data = sales_processed) %>% ggsurvfit() + labs(title = "商品上市未售出概率KM曲线", x = "上市天数", y = "未售出概率")
说明
- 如果存在删失数据(比如某个商品最终未售出,
sold始终为0),上述处理会自动保留其总上市时长作为删失时间,sold=0作为删失标记,完全符合KM模型的要求。 - 处理后的数据和你提供的宽格式示例结构完全匹配,建模结果会和宽格式运行的结果一致。
内容的提问来源于stack exchange,提问作者nooshrpak
相关产品推荐
相关产品推荐

