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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:28:19