В R при представлении данных (RCT) в таблице (желательно gtsummary) как включить тесты значимости как внутри группы, так и между группами? [картинка]

Я учусь анализировать данные и представлять результаты РКИ с использованием R. Я пробовал читать документацию пакета и искал в Интернете, но не нашел решения для этой проблемы. У меня есть две группы участников, и я хочу выразить исходные данные для обеих групп, изменения в каждой группе (от исходного уровня до конечной точки) и разницу между конечными точками - все это для каждого результата - в одной таблице. Ниже я прикрепил пример таблицы.

Я смоделировал фрейм данных, попробовал написать код и буду обсуждать проблемы здесь.

ID <- seq(1:50)
data <- data.frame(ID)
data$drug <- rbinom(n = 50, 1, prob = 0.5)
data$drug <- factor(data$drug, levels = c(0, 1), 
                    labels = c("Drug X", "Drug Y"))
data$wt_0 <- rnorm(n = 50, mean = 70, sd = 5)
data$wt_12 <- rnorm(50, 68, 4.9)
head(data)

library(gtsummary)
library(gt)
subset(data, select = -ID) %>%
  tbl_summary(by = drug) %>% 
  add_p()

Я попытался добавить изменение в столбце веса вручную.

data_new <- data
data$wt_change <- data$wt_0 - data$wt_12
subset(data_new, select = -ID) %>%
  tbl_summary(by = drug) %>% 
  add_p()

Мне нужна таблица, подобная той, что показана вначале. При этом каждая строка должна соответствовать только одному результату. Возможно ли использовать пакет gtsummary() или любой другой пакет в R? Было бы здорово, если бы кто-нибудь помог, потому что это может быть распространенный сценарий.

Примечание. Да, корректировка множественности как таковая не нарушается, мы заявим, что остальные тесты (кроме первичного теста) являются исследовательскими и не должны интерпретироваться как таковые.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы получить только одну строку для каждой переменной (вес, ИМТ и т. д.), может потребоваться использовать измененный фрейм данных:

df <- data %>%
  tidyr::pivot_longer(starts_with("wt"), 
               names_to = "week", values_to = "weight", names_prefix = "wt_")

# A tibble: 100 x 4
      ID drug   week  weight
   <int> <fct>  <chr>  <dbl>
 1     1 Drug X 0       66.3
 2     1 Drug X 12      70.2
 3     2 Drug X 0       72.3
 4     2 Drug X 12      69.6
 5     3 Drug X 0       78.2

Затем вы можете использовать tbl_summary с «по=неделе» внутри функции tbl_strata, стратифицируя препарат, а затем добавляя add_difference(), чтобы получить столбец «Среднее изменение» для каждого препарата.

tbl_1 <- df |> 
  select(-ID) |>
  tbl_strata(strata = drug,
      .tbl_fun = ~ tbl_summary(.x, by = week,
                    label=list(weight~"Weight (kg)"),
                    digits=list(everything() ~ 2),
                    statistic = list(all_continuous() ~ "{mean} ({sd})")) |>
        add_difference(estimate_fun = weight~function(x) style_number(x, digits = 2)), 
      .header = "**{strata}**") |>
  modify_header(all_stat_cols() ~ "**{level} weeks**",
                estimate_1 ~"**Mean change**",
                estimate_2 ~"**Mean change**")
tbl_1

К сожалению, add_difference() вычисляет группу 1 — группу 2, хотя вам, вероятно, нужна группа 2 — группа 1.

Чтобы получить столбец «Т-тест», в котором сравниваются изменения между двумя препаратами с течением времени, вы снова можете использовать add_difference().

tbl_2 <- mutate(data, weight=wt_0 - wt_12) |>
  select(drug, weight) |>
  tbl_summary(by=drug,
              label=list(weight~"Weight (kg)"),
              digits=list(everything() ~ 2)) |>
  add_difference(estimate_fun=weight~function(x) style_number(x, digits = 2)) |>
  modify_column_hide(c(stat_1, stat_2)) 

tbl_2

И поскольку мы гарантировали, что имена и метки двух вычисляемых переменных были одинаковыми, мы можем использовать tbl_merge, чтобы объединить эти два объекта gtsummary:

tbl_merge(list(tbl_1, tbl_2)) |>
  modify_spanning_header(ends_with("1_1")~"**Drug X**",
                         ends_with("2_1")~"**Drug Y**",
                         ends_with("_2")~"**T-Test**")


Данные:

set.seed(123) # data created by OP.

Большое спасибо, это помогло мне решить проблему, и я мог бы добавить и четвертую таблицу. Мне было интересно (как вы заметили), есть ли какой-нибудь способ вместо этого вычислить разницу между группой 2 и группой 1 (B минус A) наоборот? Это обычная ситуация, потому что в фармацевтической промышленности или других исследованиях в области медико-биологических наук мы часто измеряем изменения по сравнению с базовым уровнем. Можем ли мы добавить отрицательный знак (или умножить на -1, т. е. минус 1) числовые значения, используемые для вывода в столбцах оценки и ci? Кажется, должен быть обходной путь, но я не знаю, как, спасибо

Muhammad Aaqib Shamim 21.05.2024 17:18

Возможно, @Daniel D. Sjoberg сможет с этим помочь.

Edward 28.05.2024 04:11

Другие вопросы по теме