R:tidy_add_n() 在使用 reformulate/as.formula 循环 Cox 模型的许多列时不起作用

R: tidy_add_n() doesn't work when looping over many columns for Cox models with reformulate/as.formula

提问人:trinhtran 提问时间:9/19/2023 最后编辑:trinhtran 更新时间:9/19/2023 访问量:26

问:

我想为 Cox 模型运行一个循环,该模型针对协变量的不同子集进行调整。期望的产出应包括事件数、人年、风险比和 95% CI。如果我直接调用,则可以完美地工作,但是当我在循环中使用任何一个或时,该函数不会创建n_event和曝光两列,而是创建一个名为 n 的新列,该列仅包含缺失值。任何解决此问题或解决方法的想法或建议将不胜感激。谢谢!coxphtidy_add_nreformulateas.formula

以下是可重现的代码。

test1 <- list(time = c(4,3,1,1,2,2,3), 
              status = c(1,1,1,0,1,1,0), 
              x1 = as.factor(c(0,2,1,1,1,0,0)), 
              x2 = as.factor(c(0,0,0,0,1,1,1)))

#the function works if I call coxph directly 
coxph(Surv(time, status) ~ x1 + x2, test1) %>%
tidy_and_attach()%>%
tidy_add_reference_rows() %>%
tidy_add_estimate_to_reference_rows() %>%
tidy_add_header_rows() %>%
tidy_add_n()


#tidy_add_n does not work when I use reformulate or as.formula.
surv <- "Surv(time, status)"
c("x1","x2")%>%
reformulate(response = surv)%>%
coxph(data = test1)%>%
tidy_and_attach()%>%
tidy_add_reference_rows() %>%
tidy_add_estimate_to_reference_rows() %>%
tidy_add_header_rows() %>%
tidy_add_n()
Tidyverse Cox回归 扫帚

评论


答:

0赞 gladys_c_hugh 9/19/2023 #1

我不知道为什么,但这与 magrittr 管道与新的原生管道有关.%>%|>

model <- coxph(Surv(time, status) ~ x1 + x2, test1) %>%
  tidy_and_attach()%>%
  tidy_add_reference_rows() %>%
  tidy_add_estimate_to_reference_rows() %>%
  tidy_add_header_rows() %>%
  tidy_add_n()


surv <- "Surv(time, status)"
model2 <- c("x1","x2") |> 
  reformulate(response = surv)  |> 
  coxph(data = test1) |> 
  tidy_and_attach() |> 
  tidy_add_reference_rows() |> 
  tidy_add_estimate_to_reference_rows()  |> 
  tidy_add_header_rows() |> 
  tidy_add_n()

all.equal(model %>% data.frame(), model2 %>% data.frame())

你得到输出:

[1] TRUE

(将两者转换为 data.frame() 会删除属性,尽管生成的 tibbs 在控制台中看起来相同,但由于某种原因,这些属性仍然不同)。

具有更多 R 知识的人可能会发现这有助于诊断发生这种情况的原因。但是,如果您只是想要修复 - 请使用新管道。

编辑:

只有输出需要更改为本机管道才能使“修复”起作用:reformulate

model2 <- c("x1","x2") %>% 
  reformulate(response = surv) |>  
  coxph(data = test1) %>%
  tidy_and_attach() %>%
  tidy_add_reference_rows() %>%
  tidy_add_estimate_to_reference_rows()  %>% 
  tidy_add_header_rows() %>%
  tidy_add_n()


all.equal(model %>% data.frame(), model2 %>% data.frame())

[1] TRUE 

评论

0赞 trinhtran 9/19/2023
这非常有效!谢谢!