【问题标题】:Running multiple Cox-PH models with tidyr使用 tidyr 运行多个 Cox-PH 模型
【发布时间】:2020-08-19 13:30:32
【问题描述】:

我有一个来自survival 包的常规Surv 对象;

s <- Surv(sample(100:150, 5), sample(c(T, F), 5, replace = T))

还有一个多变量矩阵;

df <- data.frame(var1 = rnorm(5),
                 var2 = rnorm(5),
                 var3 = rnorm(5))

我需要分别为每个变量拟合 Cox-PH 模型。我的代码目前使用如下循环:

for (v in colnames(df)) {
    coxph(s ~ df[[v]])
}

当然,实际上有成千上万个变量,这个过程需要一点时间。我想关注the answer given here 尝试用tidyr 完成这一切,但我有点难过,因为预测不是一个因素,它是一个生存对象,所以我不太清楚如何处理它作为一部分一个小玩意儿。

【问题讨论】:

  • 错字?模型应该有 s 作为响应吧?
  • 是的,已更正。

标签: r survival-analysis tibble tidy survival


【解决方案1】:

假设您对生存模型的响应是 s,您可以使用与您链接到的答案类似的嵌套数据框,然后将模型映射到不同的变量:

图书馆(tidyverse)

df_nested <- df %>% pivot_longer(cols = var1:var3) %>% group_by(name) %>% nest()


surv_model <- function(df) {
  coxph(s ~ df$value)
}

df_nested <- df_nested %>% mutate(model = map(data, surv_model))

df_nested
# A tibble: 3 x 3
# Groups:   name [3]
  name  data             model  
  <chr> <list>           <list> 
1 var1  <tibble [5 x 1]> <coxph>
2 var2  <tibble [5 x 1]> <coxph>
3 var3  <tibble [5 x 1]> <coxph>

【讨论】:

  • 那么 tibble 中的列本身就是一个列表?这听起来像是我无法真正使用的东西......但是如果我将函数更改为只返回模型中的 3 个值呢?是否可以将其直接映射到 3 列?
  • 它是一个模型列表。您不必以这种方式存储数据,但您要求使用 tidyr 替代 for 循环,这是一种方法。查看purrr::mapbroom 包以了解如何使用它们。
  • 您可以将 3 个模型的预测映射到 3 列中。查看add_predictions函数
猜你喜欢
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多