r - 无法使用 ggsurvplot 列表中的 survfit 对象绘制 kaplan-meier 曲线

标签 r survival-analysis purrr survival

我正在尝试使用 survminer 包中的 ggsurvplot 绘制 Kaplan-Meyer 曲线。当我传递保存在列表中的 survfit 对象时,我无法绘制它。

让我以肺部数据集为例。下面一切正常:

library("survival")
library("survminer")
fit <- survfit(Surv(time, status) ~ sex, data = lung)
ggsurvplot(fit,
          conf.int = TRUE,
          risk.table.col = "strata", 
          palette = c("#E7B800", "#2E9FDF"),
          xlim = c(0, 600))

现在我对两个变量进行生存拟合并将模型结果保存在列表中。然后尝试用ggsurvplot制作KM图。

vars <- c('sex', 'ph.ecog')
l<- map (vars, ~survfit(Surv(time, status)~ get(.x),data = lung ))
l<- set_names(l, vars)
ggsurvplot(l$sex,
          conf.int = TRUE,
          risk.table.col = "strata", 
          palette = c("#E7B800", "#2E9FDF"),
          xlim = c(0, 600))

我收到这样的错误消息:

Error in eval(inp, data, env) : object '.x' not found

有人知道为什么吗?我该如何解决这个问题?非常感谢!

最佳答案

第一个需要加载所需的一个或多个包。我想现在许多用户认为运行 R 意味着每个人都应该拥有 tidyverse,但事实并非如此。

 library(tidyverse)
 # run both your code segments, since you will need a small piece of first one
str(l$sex)
List of 14
 $ n        : int [1:2] 138 90
 $ time     : num [1:206] 11 12 13 15 26 30 31 53 54 59 ...
 $ n.risk   : num [1:206] 138 135 134 132 131 130 129 128 126 125 ...
 $ n.event  : num [1:206] 3 1 2 1 1 1 1 2 1 1 ...
 $ n.censor : num [1:206] 0 0 0 0 0 0 0 0 0 0 ...
 $ surv     : num [1:206] 0.978 0.971 0.957 0.949 0.942 ...
 $ type     : chr "right"
 $ strata   : Named int [1:2] 119 87
  ..- attr(*, "names")= chr [1:2] "get(.x)=1" "get(.x)=2"
 $ std.err  : num [1:206] 0.0127 0.0147 0.0181 0.0197 0.0211 ...
 $ upper    : num [1:206] 1 0.999 0.991 0.987 0.982 ...
 $ lower    : num [1:206] 0.954 0.943 0.923 0.913 0.904 ...
 $ conf.type: chr "log"
 $ conf.int : num 0.95
 $ call     : language survfit(formula = Surv(time, status) ~ get(.x), data = lung)
 - attr(*, "class")= chr "survfit"

所以当你看到strata时“名称”属性,它有一个 get( - 调用它,这似乎阻碍了 ggsurvplot 的逻辑。使用attr<-将其替换为更具信息性的内容(并且较少“语言-y”)。

attr(l[['sex']][['strata']], "names") <- c("sex=1", "sex=2")

该表达式也位于“call”叶中,因此您需要将其替换为更容易处理的内容。我认为通过将其替换为 "call" leaf from the first 很容易做到适合你制作的对象:

l$sex$call <- fit$call
ggsurvplot(l$sex,
          conf.int = TRUE,
          risk.table.col = "strata", 
          palette = c("#E7B800", "#2E9FDF"),
          xlim = c(0, 600))

enter image description here

关于r - 无法使用 ggsurvplot 列表中的 survfit 对象绘制 kaplan-meier 曲线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45872703/

相关文章:

r - ggplots 条件色标

r - 为数据框的每一列计算一个样本 t 检验,并将结果汇​​总在表格中

r - 分箱数据的生存

r - 在 R 中使用 msSurv 包

r - 如何使用 purrr 从列表中提取元素?

r - 使用 purrr 函数并行迭代两个嵌套列表

r - 在 R 中查找聚类结果

r - 如何使 'for loop' 跳过其中显示错误的一些迭代?

r - 如何使用风险表 (R) 在生存图中添加垂直线和注释

r - 如何从列表中删除 try 函数产生错误的元素?