如何使用 {gtsummary} tbl_summary 包含比例的置信区间?

How to include confidence intervals for proportion using {gtsummary} tbl_summary?

刚开始在 Whosebug 上发帖(但不是阅读),所以请耐心等待我的技能。

我正在使用 {gtsummary} 包,特别是 tbl_summary 函数。

我想包括每个 by 和所有包含的分类和连续 variables.

的比例的 95% 置信区间

搜索之前的帖子,我没有找到解决确切问题的方法。

我的基本输出是使用以下内容创建的:

tbl <- df %>% 
  select(group, var_cont, var_cat_1, var_cat_2, var_cat_3, var_cat_4) %>% 
  tbl_summary(
    by = group,
    statistic =
      list(
        all_continuous() ~ "{mean} ({sd})",
        all_dichotomous() ~ "{n}/{N} ({p}%)"
      ),
    missing = "no",
    digits = all_continuous() ~ 1
  )

根据我的数据生成以下内容: tbl_summary output

我的大部分分类变量都是逻辑类型(即 TRUE、FALSE、NA) 我现在想为每个包含 95% 置信区间的 group 级列添加一列,形式为 "{ci_lower}%, {ci_upper}%"

在我的许多尝试中,并从其他帖子中获得灵感,我创建了一个使用 {freqtables} 包的 freq_table() 函数的自定义函数。我制作了函数,因此它适合 {gtsummary} tbl_summary.

add_stat 函数
ci_function <- function(data, variable, by, ...) {
  
  variable <- enquo(variable)
  by <- enquo(by)
  
  data %>% 
    freq_table(!!by, !!variable) %>% 
    filter %>% 
    filter(col_cat == TRUE) %>% 
    select(row_cat, col_var, n, n_row, percent_row, lcl_row, ucl_row) %>% 
    mutate(
      lcl_row = format(lcl_row, digits = 2),
      ucl_row = format(ucl_row, digits = 2),
      stat = str_glue("{lcl_row}%, {ucl_row}%")
      ) %>% 
    select(stat) %>% 
    t() %>% 
    as_tibble()  %>% 
    set_names(paste0("add_stat_", seq_len(ncol(.))))  
}

单独使用 ci_function 选择上述变量会得到以下结果:

# A tibble: 1 x 3
  add_stat_1   add_stat_2   add_stat_3  
  <chr>        <chr>        <chr>       
1 0.19%,  9.3% 2.53%, 16.9% 0.34%, 16.3%

当我尝试将 ci_function 应用于 add_stat 时,通过:

tbl <- stack_overflow %>% 
    select(group, var_cont, var_cat_1, var_cat_2, var_cat_3, var_cat_4) %>% 
    tbl_summary(
      by = group,
      statistic =
        list(
          all_continuous() ~ "{mean} ({sd})",
          all_dichotomous() ~ "{n}/{N} ({p}%)"
        ),
      missing = "no",
      digits = all_continuous() ~ 1
    ) %>% 
  add_stat(everything() ~ "ci_function") %>%
  modify_table_body(
    dplyr::relocate, add_stat_1, .after = stat_1
  ) %>%
  modify_header(starts_with("add_stat_") ~ "**95% CI**")

.. 我收到错误消息(对于连续变量而言是预期的):

There was an error for variable 'var_cont':
Error: `nm` must be `NULL` or a character vector the same length as `x`
There was an error for variable 'var_cat_1':
Error: `nm` must be `NULL` or a character vector the same length as `x`
There was an error for variable 'var_cat_2':
Error: `nm` must be `NULL` or a character vector the same length as `x`
There was an error for variable 'var_cat_3':
Error: `nm` must be `NULL` or a character vector the same length as `x`
There was an error for variable 'var_cat_4':
Error: `nm` must be `NULL` or a character vector the same length as `x`

.. 输出不足 tbl_summary output

我是 {gtsummary} 包及其定制可能性的忠实粉丝。

任何人都可以帮助我如何更正我的自定义函数 ci_function 以便它适用于分类变量和连续变量,并帮助我如何在 add_stat 函数中实现此函数 {gtsummary}?

干杯!

斯蒂芬

更新 2022-02-13 解决方案现在使用 add_ci() 函数显着减少代码量。

使用 add_ci() 函数添加置信区间列。

library(gtsummary)
packageVersion("gtsummary")
#> [1] '1.5.2'

tbl <-
  trial %>%
  select(trt, age, response, grade) %>%
  tbl_summary(
    by = trt,
    missing =  "no",
    statistic = list(all_categorical() ~ "{n}/{N} ({p}%)",
                     all_continuous() ~ "{mean} ({sd})")
  ) %>%
  add_ci()

reprex package (v2.0.1)

创建于 2022-02-13