生存函数图中的哪条曲线是哪条曲线?

Which curve is which in Survival Function plot?

我正在用生存包绘制生存函数。一切正常,但我怎么知道哪条曲线是哪条曲线?我怎样才能将它添加到图例中?

  url <- "http://socserv.mcmaster.ca/jfox/Books/Companion/data/Rossi.txt"
  Rossi <- read.table(url, header=TRUE)[,c(1:10)]
  km <- survfit(Surv(week, arrest)~race, data=Rossi)
  plot(km, lty=c(1 ,2))

不幸的是,plot.survival 函数似乎没有提供一个很好的标记曲线的选项。文档说曲线是按照它们在 print 中出现的顺序绘制的,因此当您改变线条类型或颜色时,您可以弄清楚哪个是哪个。但这不利于分享。

一种替代方法是使用 rms 中的 survplot 函数,它会标记曲线。这是您的示例和 CI 关闭绘图的情况。 (请注意,survplot 不会采用 survfit 对象,因此您必须使用可以读取其结果的函数重新进行估计——此处为 npsurv。)

library(rms)
survplot(npsurv(Surv(week, arrest)~race, data=Rossi), conf = "none")

查看文档以了解调整图表其他方面的方法,包括用图例替换图中的标签。

how do I know which curve is which?

使用 str() 你可以看到哪些元素在 km 中。 km$strata 显示有 48 个和 10 个元素。这与 km$surv

中前 48 项和后 10 项的下降模式一致
km$surv[1:48]
km$surv[49:58]

所以除了 print() 中顺序的提示之外,对于这个特定的数据集,我们还可以确定前 48 个元素属于 race=black

And how can I add it to a legend?

不像其他模型输出 km 不容易转换为 data.frame。但是,我们可以自己提取元素并创建一个data.frame,然后自己绘制它。

首先,我们创建一个涉及阶层的因素:48 名黑人和 10 名其他人

race <- as.factor(c(rep("black", 48), rep("other", 10)))
df <- data.frame(surv = km$surv, race = race, time = km$time)

接下来我们可以像往常一样绘制它(在我的例子中,使用 ggplot2)。

library(ggplot2)
ggplot(data = df, aes(x = time, y = surv)) + 
    geom_point(aes(colour = race)) + 
    geom_line(aes(colour = race)) +
    theme_bw()

感谢 Richard 的回答,我找到了一种将正确的名称绘制到正确的曲线上的方法,使用 plot.survfit:

中使用的基本绘图方式
legend_values <- names(km$strata)
plot(km)
legend(
  "topright",
  legend=legend_values,
  col=1:2,
  lty = c(1,1),
  horiz=FALSE,
  bty='n')

我更喜欢 ggplot 绘图方式,但我喜欢保留 plot.survfit 中的逐步呈现方式。