如何在指定时间范围填充两条长度不同的Kaplan-Meier曲线间区域
填充Kaplan-Meier曲线指定时间范围内的区域
由于两条KM曲线的时间点(x轴)不统一,直接填充会因为长度不匹配报错,解决思路是先将两条曲线的生存概率插值到统一的时间序列上,再用polygon()函数填充区域。
以下是完整实现代码:
library(survival) data(cancer) # 拟合KM模型 km <- survfit(Surv(time, status) ~ x, data = aml) # 先绘制基础的KM曲线 plot(km, col = 1:2, main = "KM曲线与填充区域", xlab = "时间", ylab = "生存概率") # 1. 定义需要填充的时间上限 fill_x_max <- 40 # 2. 生成统一的时间序列:包含两条曲线的所有时间点,且不超过fill_x_max all_times <- sort(unique(c(km[1]$time, km[2]$time))) all_times <- all_times[all_times <= fill_x_max] # 加入0点,保证填充区域从y轴起始位置开始 all_times <- c(0, all_times) # 3. 对两条曲线的生存概率做线性插值,得到统一时间点对应的surv值 # 曲线1的插值:初始生存概率为1,对应时间0 surv1 <- approx(x = c(0, km[1]$time), y = c(1, km[1]$surv), xout = all_times)$y # 曲线2的插值 surv2 <- approx(x = c(0, km[2]$time), y = c(1, km[2]$surv), xout = all_times)$y # 4. 用polygon填充两条曲线之间的区域 # 构造闭合区域的坐标:正序取曲线1的点,逆序取曲线2的点 x_poly <- c(all_times, rev(all_times)) y_poly <- c(surv1, rev(surv2)) polygon(x_poly, y_poly, col = rgb(0.5, 0.5, 1, 0.3), border = NA) # 可选:添加图例 legend("topright", legend = c(levels(aml$x)[1], levels(aml$x)[2]), col = 1:2, lty = 1, bty = "n")
代码说明
approx()函数用于线性插值,解决两条曲线时间点不匹配的问题,保证每个时间点都有对应的生存概率值。polygon()通过连接正序的曲线1和逆序的曲线2形成闭合区域,rgb()参数可自定义填充颜色和透明度(最后一个参数为透明度,0完全透明,1完全不透明)。- 加入0点是为了避免填充区域在y轴处出现空白缺口。
内容的提问来源于stack exchange,提问作者Miguel Angel Arnau
相关产品推荐
相关产品推荐

