R - 使用Strata从Survfit中提取汇总表

时间:2015-07-03 04:38:53

标签: r dataframe survival-analysis

我是R和生存分析的新手,我有兴趣将幸存的结果输出到数据框中。

这个网站提供了一个很好的解决方案,但没有提供有分层的人(https://stat.ethz.ch/pipermail/r-help/2014-October/422348.html)。如何使用包含分层类型的额外列附加(或堆叠)每个层。 提供的链接中的解决方案不适用于分层分组

library(survival)
data(lung)
mod <- with(lung, survfit(Surv(time, status)~ 1))
res <- summary(mod)
str(res)

# Extract the columns you want
cols <- lapply(c(2:6, 8:10) , function(x) res[x])
# Combine the columns into a data frame
tbl <- do.call(data.frame, cols)
str(tbl)

先谢谢你, R newbie

3 个答案:

答案 0 :(得分:9)

它与您在那里基本相同,只是一个额外的列

dev

答案 1 :(得分:5)

另一个选择是使用ggfortify库。

library(survival)
library(ggfortify)

# fit a survival model
mod <- survfit(Surv(futime, fustat) ~ rx, data = ovarian)
# extract results to a data.frame
res <- fortify(mod)

str(res)

'data.frame':   26 obs. of  9 variables:
$ time    : int  59 115 156 268 329 431 448 477 638 803 ...
$ n.risk  : num  13 12 11 10 9 8 7 6 5 4 ...
$ n.event : num  1 1 1 1 1 1 0 0 1 0 ...
$ n.censor: num  0 0 0 0 0 0 1 1 0 1 ...
$ surv    : num  0.923 0.846 0.769 0.692 0.615 ...
$ std.err : num  0.0801 0.1183 0.1519 0.1849 0.2193 ...
$ upper   : num  1 1 1 0.995 0.946 ...
$ lower   : num  0.789 0.671 0.571 0.482 0.4 ...
$ strata  : Factor w/ 2 levels "rx=1","rx=2": 1 1 1 1 1 1 1 1 1 1 ...

这种方法的优点是你可以得到完整的数据(即26个观察而不是12个),你可以用ggplot绘制你的生存曲线。

library(ggplot2)

ggplot(data = res, aes(x = time, y = surv, color = strata)) +
       geom_line() + 
       # plot censor marks
       geom_point(aes(shape = factor(ifelse(n.censor >= 1, 1, NA)))) + 
       # format censor shape as "+"
       scale_shape_manual(values = 3) + 
       # hide censor legend 
       guides(shape = "none") 

survival plot

答案 2 :(得分:1)

我看到的最简单的方法是使用 tidy() 包中的 broom 函数。

library(survival)
library(dplyr)
#> 
#> Attache Paket: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(broom)

survfit( Surv(futime, fustat)~rx, data=ovarian) %>% 
  tidy()
#> # A tibble: 26 x 9
#>     time n.risk n.event n.censor estimate std.error conf.high conf.low strata
#>    <dbl>  <dbl>   <dbl>    <dbl>    <dbl>     <dbl>     <dbl>    <dbl> <chr> 
#>  1    59     13       1        0    0.923    0.0801     1        0.789 rx=1  
#>  2   115     12       1        0    0.846    0.118      1        0.671 rx=1  
#>  3   156     11       1        0    0.769    0.152      1        0.571 rx=1  
#>  4   268     10       1        0    0.692    0.185      0.995    0.482 rx=1  
#>  5   329      9       1        0    0.615    0.219      0.946    0.400 rx=1  
#>  6   431      8       1        0    0.538    0.257      0.891    0.326 rx=1  
#>  7   448      7       0        1    0.538    0.257      0.891    0.326 rx=1  
#>  8   477      6       0        1    0.538    0.257      0.891    0.326 rx=1  
#>  9   638      5       1        0    0.431    0.340      0.840    0.221 rx=1  
#> 10   803      4       0        1    0.431    0.340      0.840    0.221 rx=1  
#> # … with 16 more rows

reprex package (v0.3.0) 于 2021 年 8 月 4 日创建