gtsummary: несколько непрерывных переменных в виде столбцов, а затем стратифицируются по двум категориальным переменным

#r #gtsummary

Вопрос:

Я пытаюсь суммировать три непрерывные переменные одной категориальной переменной. Вот некоторые фиктивные данные :

     test <-
  data.frame(
    score_1= sample(c("low","medium","high"),50, replace = T),
    land=rnorm(50,5,1),
    water=rnorm(50,300,1),
    fire=rnorm(50,3,1)
  ) 
 

Я могу легко стратифицировать данные по тертилям:

 table<- test %>% 
  tbl_summary(
    by=score_1,
    statistic = all_continuous()~  "{mean} ({sd})"
  ) %>% 
  print()

 

Что сделает эту таблицу:

введите описание изображения здесь

Однако мне нужно перенести эту таблицу: непрерывные переменные должны быть столбцами. Причина этого в том, что мне на самом деле нужно добавить еще два балла, поэтому данные на самом деле выглядят так:

 test2 <-
  data.frame(
    score_1= sample(c("low","medium","high"),50, replace = T),
    score_2= sample(c("low","medium","high"),50, replace = T),
    score_3= sample(c("low","medium","high"),50, replace = T),
    land=rnorm(50,5,1),
    water=rnorm(50,300,1),
    fire=rnorm(50,3,1)
  ) 
 

Я подумал о том, чтобы создать три таблицы, по одной для каждой оценки (с непрерывными переменными в виде столбцов), а затем объединить их с помощью tbl_stack. Но я не знаю, как сделать первую таблицу (и возможно ли это вообще с помощью gtsummary).
Надеюсь, в этом есть смысл.

Ответ №1:

В следующем выпуске gtsummary (v.1.5.0) в пакете будет функция, предназначенная для создания таблиц, подобных той, которую вы запрашиваете. Пока эта новая функция проверяется, вы можете использовать аналогичную (но не такую простую в использовании) функцию из пакета bstfun (на GitHub). bstfun-это пакет, в котором рождаются некоторые функции gtsummary, и когда они созревают, они переносятся в gtsummary. Пример кода ниже!

 # remotes::install_github("ddsjoberg/bstfun")
library(gtsummary)

test <-
  data.frame(
    score_1= sample(c("low","medium","high"),50, replace = T),
    land=rnorm(50,5,1),
    water=rnorm(50,300,1),
    fire=rnorm(50,3,1),
    all_one = 1L
  )

df_pvalues <-
  c("land", "water", "fire") %>% 
  purrr::imap_dfc(
    ~aov(
      formula = glue::glue("{.x} ~ score_1") %>% as.formula(),
      data = test
    ) %>%
      broom::tidy() %>%
      dplyr::slice(1) %>%
      dplyr::select(p.value) %>%
      dplyr::mutate_all(style_pvalue) %>%
      setNames(glue::glue("stat_1_{.y}"))
  ) %>%
  mutate(label = "ANOVA p-value")
df_pvalues
#> # A tibble: 1 x 4
#>   stat_1_1 stat_1_2 stat_1_3 label        
#>   <chr>    <chr>    <chr>    <chr>        
#> 1 0.12     0.6      >0.9     ANOVA p-value


tbl <-
  c("land", "water", "fire") %>%
  purrr::map(
    ~test %>%
      bstfun::tbl_2way_summary(score_1, all_one, con = all_of(.x),
                               statistic = "{mean} ({sd})") %>%
      modify_header(all_stat_cols() ~ paste0("**", .x, "**"))
  ) %>%
  tbl_merge() %>%
  modify_spanning_header(everything() ~ NA) %>%
  modify_table_body(
    ~.x %>% 
      dplyr::bind_rows(df_pvalues)
  )
 

введите описание изображения здесь
Создано 2021-08-25 пакетом reprex (версия v2.0.1)

Комментарии:

1. Спасибо, Дэниел! это немного сбивало меня с толку, но я думаю, что понял. Есть ли способ добавить статистический тест в виде строки ниже? Я попробовал «add_p», но, очевидно, это не сработало.

2. какие значения вы хотите сравнить в значении p? Есть ли разница в среднем по шкале score_1, и в итоговой таблице будет 3 p-значения в новой строке?

3. Да, именно, еще один вариант, который приходит мне на ум, — это добавление звезд значимости.

4. Вау, большое спасибо, это очень полезно и поучительно для меня (и, надеюсь, для других).