如何转换死亡率 table 以生成 Kaplan-Meier 图

How to convert a mortality table to generate a Kaplan-Meier plot

我一直在使用 R 中的生存包,使用 tables 的死亡率数据生成 Kaplan-Meier 图。我现在正在尝试使用不同格式的新数据生成相同类型的图。我想转换数据,使其与我用来成功制作 Kaplan-Meier 图的输入数据格式相同。

我的数据通常有以下格式:

ID Entry_type Departure_type Birth_date Death_date  Lifespan
234 B 1 2008-05-01 2020-01-20 10.986995
549 B 1 2014-05-25 2016-02-09 1.711157
235 B 1 2015-02-01 2017-08-01 2.496920ID

此数据每行一个人,由他们的 ID 指定。最后一列是那个人的寿命

我可以使用以下代码从这个 table 生成 Kaplan-Meier 图:

survival_plot <- ggsurvplot(
    fit = survfit(Surv(Lifespan, Depart.Type) ~ 1, data = life_span_table), 
    xlab = "Years", 
    ylab = "Overall survival probability",
    surv.median.line = "hv",
    title = "Survival Curve",
    legend.title="")

但是我现在有人口普查记录数据,我正在跟踪 1905 年出生的人群。 数据如下所示:

Year Age Total BirthYear CumDeath
1905  0 9262 1905 9262
1906 1 1335 1905 10597
1907 2 514 1905 11111

列的解释器:

Year: The year being recorded.
Age: The age of the individual from the 1905 cohort in that year.
Total: The number of individuals born in 1905 who died in the recorded year.
BirthYear: Always 1905 for this cohort (redundant information)
CumDeath: The total number of people from the cohort who have died at the point of recording (cumulative death). 

所以这种数据格式不像以前那样每行一个人。 我觉得使用这些数据制作相同的 Kaplan-Meier 图的唯一方法是重新格式化它,以便每行有一个人,并将他们的寿命数据添加为新列以适应我通常使用的格式。

寿命可以计算为 Year 和 Birthyear 之间的差值,但我需要使每个寿命的行数等于每年的总条目数。然后我可以为每一行添加一个 Entry_Type 和 Departure_Type 列,对于 Entry_type 始终为 'B' 并且对于 Departure_type.[=15= 始终为“1” ]

我通常使用 dplyr 来重新格式化 tables,但我不确定以总条目为条件为每个生命周期添加新行的最佳方法。 dplyr 可以这样做还是我最好使用循环或 lapply 函数?

非常感谢任何帮助。

事实证明,使用 R data.frame 行索引是一项相当简单的练习。考虑这个玩具示例(与您的非常相似):

tt = data.frame(name=c('a', 'b', 'c'), 
                count=c(1, 2, 3))
# extract counts specifying how many times to replicate each row
counts = tt$count
# construct row indexes
row_positions = seq_along(counts)
# or
row_positions = seq(1, nrow(tt))
# inflate vector of row indexes according to the counts
row_pos_replicated = rep(row_positions, counts)
# use inflated indexes to expand frame rows per `count` values
tt_replicated = tt[row_pos_replicated,]

我们刚刚根据 count 列将 tt 中的行扩展到新框架 tt_replicated 中:

> tt_replicated
       name  count
1      a     1
2      b     2
2.1    b     2
3      c     3
3.1    c     3
3.2    c     3

基于上述并使用更简洁语法的框架解决方案:

census_data = read.csv(text = "Year Age Total BirthYear CumDeath
1905 0 9262 1905 9262
1906 1 1335 1905 10597
1907 2 514 1905 11111", sep="")

census_data_for_KMplot = census_data[rep(seq(1,
                                             nrow(census_data)),
                                         census_data$CumDeath),]

让我们计算每个 Year 的行数(使用 data.table):

> data.table::setDT(census_data_for_KMplot)[, .N, by=Year]
   Year     N
1: 1905  9262
2: 1906 10597
3: 1907 11111

使用 data.table 提高速度和更简单的语法(注意行索引时 fread 中没有 sep= 并且 [] 中没有 ,

library(data.table)

census_data = fread(text = "Year Age Total BirthYear CumDeath
1905 0 9262 1905 9262
1906 1 1335 1905 10597
1907 2 514 1905 11111")

census_data_for_KMplot = census_data[rep(seq_along(census_data$CumDeath), 
                                     census_data$CumDeath)]
census_data_for_KMplot[, .N, by=Year]

   Year     N
1: 1905  9262
2: 1906 10597
3: 1907 11111