Два образца t-теста в нескольких группах с несколькими переменными / метриками с использованием пакета tidyverse и broom

#r #tidyverse #t-test #broom

#r #tidyverse #t-тест #broom

Вопрос:

Используя следующие данные

 df <- data.frame(category = sample(1:3, replace = TRUE, 50),
                testgroup = sample(c('A', 'B'), replace = TRUE, 50),
                var_1 = rnorm(50),
                var_2 = rnorm(50),
                var_3 = rnorm(50)
)
  

Я хотел бы применить 2-выборочный t-тест в каждой категории, сравнивая разницу в средних значениях между A и B по всем 3 переменным.

В идеале выходные данные генерируются с использованием пакетов tidyverse и broom.

Я слишком долго боролся с подходом разделения-применения-объединения, и я думаю, что уже есть хорошее решение с несколькими строками кода.

Большое спасибо за вашу поддержку!

Ответ №1:

Общее эмпирическое правило состоит в том, чтобы получить аргументы для желаемой функции ( t.test в данном случае) в параллельных столбцах. В вашем случае мы стремимся иметь A и B бок о бок:

 X <- df %>% group_by( category, testgroup ) %>%
    summarize( across(starts_with("var"), list) ) %>%
    ungroup() %>%
    pivot_longer( starts_with("var"), "variable", values_to="values" ) %>%
    pivot_wider( names_from="testgroup", values_from="values" )
# # A tibble: 9 x 4
#   category variable A          B
#      <int> <chr>    <list>     <list>
# 1        1 var_1    <dbl [3]>  <dbl [3]>
# 2        1 var_2    <dbl [3]>  <dbl [3]>
# 3        1 var_3    <dbl [3]>  <dbl [3]>
# 4        2 var_1    <dbl [11]> <dbl [9]>
# 5        2 var_2    <dbl [11]> <dbl [9]>
# ...
  

Теперь у нас есть все возможности для применения t-теста с двумя выборками и обработки результатов с помощью broom :

 X %>% mutate(test   = map2(A, B, t.test),
             result = map(test, broom::tidy) ) %>%
    unnest( result )
# # A tibble: 9 x 15
#    category variable A     B     test  estimate estimate1 estimate2 statistic
#       <int> <chr>    <lis> <lis> <lis>    <dbl>     <dbl>     <dbl>     <dbl>
#  1        1 var_1    <dbl… <dbl… <hte…    1.07    0.400    -0.665       1.08
#  2        1 var_2    <dbl… <dbl… <hte…   -0.376   0.350     0.726      -0.415
#  3        1 var_3    <dbl… <dbl… <hte…   -0.701  -0.102     0.599      -0.434
#  4        2 var_1    <dbl… <dbl… <hte…   -0.276  -0.335    -0.0587     -0.531
#  5        2 var_2    <dbl… <dbl… <hte…    0.727   0.689    -0.0374      1.74
# ...