如何在同一张图中绘制多个cmprsk包的cuminc对象?
问题:在同一张图中绘制多个cmprsk包的cuminc对象曲线
我有几个来自cmprsk包的cuminc对象,想要将它们绘制在同一张图中。但plot.cuminc似乎无法与lines函数配合使用,尝试了以下代码:
library(cmprsk) data1<-data.frame(status=c(rep(0,20),rep(1,20),rep(2,20)),time=runif(n=60, min=1, max=20)) data2<-data.frame(status=c(rep(0,15),rep(1,35),rep(2,10)),time=runif(n=60, min=1, max=20)) a<-cuminc(data1$time,data1$status) b<-cuminc(data2$time,data2$status) plot(a[1]) lines(b[1])
运行后出现错误:
Error in xy.coords(x, y) :
'x' is a list, but does not have components 'x' and 'y'
我也尝试过使用ggcompetingrisks(a)和ggcompetingrisks(b),但无法将两条曲线放在同一张图中,只能用cowplot等工具将它们放在同一个大图的不同子图中。
补充:我已经可以通过tidycmprsk::cuminc结合tidy()将结果转为数据框后绘图,但希望能不使用该包和额外处理实现需求。
解决方案:直接从cuminc对象提取数据手动绘图
cuminc对象的每个事件类型对应一个子列表,里面包含time(时间点)和est(累积发生率)两个核心向量。我们可以直接提取这些向量,用基础R的plot和lines函数完成绘图:
library(cmprsk) set.seed(123) # 设置随机种子保证结果可重复 data1<-data.frame(status=c(rep(0,20),rep(1,20),rep(2,20)),time=runif(n=60, min=1, max=20)) data2<-data.frame(status=c(rep(0,15),rep(1,35),rep(2,10)),time=runif(n=60, min=1, max=20)) # 生成cuminc对象 a<-cuminc(data1$time,data1$status) b<-cuminc(data2$time,data2$status) # 提取第一个事件(status=1)的时间和累积发生率数据 # 注意事件对应的名称是数字,需要用反引号包裹 a_time <- a$`1`$time a_est <- a$`1`$est b_time <- b$`1`$time b_est <- b$`1`$est # 绘制第一条曲线,同时设置坐标轴范围覆盖两条曲线的所有数据点 plot(a_time, a_est, type = "l", col = "blue", lwd = 2, xlab = "时间", ylab = "累积发生率", xlim = range(c(a_time, b_time)), # x轴范围包含两个数据集的时间 ylim = range(c(a_est, b_est))) # y轴范围包含两个数据集的发生率 # 添加第二条曲线 lines(b_time, b_est, type = "l", col = "red", lwd = 2, lty = 2) # 添加图例区分两条曲线 legend("topleft", legend = c("数据集1", "数据集2"), col = c("blue", "red"), lty = c(1, 2), lwd = 2)
关键说明:
a[1]返回的是一个子列表,而非lines能识别的x/y数据结构,所以必须直接提取子列表里的time和est向量。- 如果需要绘制其他事件(比如status=2),只需提取
a$2$time、a$2$est对应的数据即可,重复lines步骤添加。 - 设置
xlim和ylim是为了确保两条曲线的所有数据点都能显示在图中,避免部分内容被截断。
内容的提问来源于stack exchange,提问作者scott9
相关产品推荐
相关产品推荐

