Выполнение нескольких t-тестов для одной и той же переменной ответа во многих группах

Я рассмотрел много похожих вопросов (например, это one), но в моем случае группы обработки не сохраняются как отдельные векторы, и мне не удалось заменить имена моих переменных в любом другом коде, который я видел по этой теме.

Я хочу сравнить средства для лечения «до» и «после» для одной и той же переменной (оценки теста) в разных местах.

Мои данные выглядят так:

  > head(my.df, n=15)
             Location     TestScore Treatment
1            4            0.7167641 Before
2            4            0.7998261 Before
3            4            0.8165880 After
4            4            0.8078955 After
5            7            0.6993413 Before
6            7            0.8404255 Before
7            7            0.7803164 Before
8            7            0.8383867 After
9            7            0.7930419 After
10           8            0.8504963 Before
11           8            0.7734653 Before
12           8            0.8408432 After
13           8            0.7980454 After
14           8            0.8407756 After
15           8            0.7837427 After

Обратите внимание, что количество ответов «до» и «после» различается как внутри, так и между локациями.

Я знаю, что могу использовать следующий код для сравнения до и после лечения во ВСЕХ местах:

t.test(TestScore ~ Treatment, data = my.df, var.equal = FALSE)

Однако я хочу сравнить значения до и после для КАЖДОГО местоположения (поскольку у меня более 100 местоположений), а не для ВСЕХ мест одновременно. В идеале я мог бы сгенерировать список или таблицу p-значений без необходимости каждый раз писать новую строку кода. Я подумал, что могу сделать что-то простое, например добавить «group_by», как показано ниже:

my.df %>% group_by(Location) %>% do(tidy(t.test(TestScore ~ Treatment, data = my.df, var.equal = FALSE)

но когда я запускаю этот код, я получаю вывод с одинаковым значением p для каждого местоположения (даже если данные разные), как показано ниже:

# A tibble: 10 x 11
# Groups:   Location [10]
   Location estimate estimate1 estimate2 statistic  p.value parameter conf.low conf.high method                  alternative
   <fct>         <dbl>     <dbl>     <dbl>     <dbl>    <dbl>     <dbl>    <dbl>     <dbl> <chr>                   <chr>      
 1 4            0.0587     0.972     0.913      15.0 1.60e-20      51.8   0.0508    0.0665 Welch Two Sample t-test two.sided  
 2 7            0.0587     0.972     0.913      15.0 1.60e-20      51.8   0.0508    0.0665 Welch Two Sample t-test two.sided  
 3 8            0.0587     0.972     0.913      15.0 1.60e-20      51.8   0.0508    0.0665 Welch Two Sample t-test two.sided  
 4 9            0.0587     0.972     0.913      15.0 1.60e-20      51.8   0.0508    0.0665 Welch Two Sample t-test two.sided  
 5 10           0.0587     0.972     0.913      15.0 1.60e-20      51.8   0.0508    0.0665 Welch Two Sample t-test two.sided  
 6 12           0.0587     0.972     0.913      15.0 1.60e-20      51.8   0.0508    0.0665 Welch Two Sample t-test two.sided  
 7 14           0.0587     0.972     0.913      15.0 1.60e-20      51.8   0.0508    0.0665 Welch Two Sample t-test two.sided  
 8 16           0.0587     0.972     0.913      15.0 1.60e-20      51.8   0.0508    0.0665 Welch Two Sample t-test two.sided  
 9 21           0.0587     0.972     0.913      15.0 1.60e-20      51.8   0.0508    0.0665 Welch Two Sample t-test two.sided  
10 27           0.0587     0.972     0.913      15.0 1.60e-20      51.8   0.0508    0.0665 Welch Two Sample t-test two.sided 

Как я могу получить отдельные p-значения, сравнивая до и после лечения для каждого места? Любая помощь приветствуется!


person AJK    schedule 13.04.2020    source источник


Ответы (1)


Вы правильно написали большую часть кода, после group_by для работы с данными внутри каждой группы нужно использовать data = . вместо 'data=my.df':

my.df %>% group_by(Location) %>% 
do(tidy(t.test(TestScore ~ Treatment, data = ., var.equal = FALSE)))

Например:

library(dplyr)
library(broom)

my.df = data.frame(Location=sample(c(4,7,8),100,replace=TRUE),
TestScore=rnorm(100,10,1),
Treatment=sample(c("Before","After"),100,replace=TRUE)

# A tibble: 3 x 11
# Groups:   Location [3]
  Location estimate estimate1 estimate2 statistic p.value parameter conf.low
     <dbl>    <dbl>     <dbl>     <dbl>     <dbl>   <dbl>     <dbl>    <dbl>
1        4   0.660       10.0      9.38     1.74   0.0926      31.0   -0.116
2        7   0.191       10.2     10.0      0.620  0.541       24.7   -0.445
3        8  -0.0720      10.1     10.2     -0.198  0.844       32.0   -0.813
person StupidWolf    schedule 13.04.2020
comment
Спасибо! Просто для пояснения, можете ли вы объяснить, что такое data = . делает в этой ситуации? Все еще довольно новичок в R. - person AJK; 14.04.2020
comment
. — это точка magrittr, magrittr.tidyverse.org/reference/pipe.html. так, например, если мы должны правильно написать do(..), это будет do(function(x)tidy(...., data=x)) , а когда вы делаете dplyr и т. д., вы можете использовать . заменить функцию (x) и т. д. - person StupidWolf; 14.04.2020
comment
вы также можете проверить это stackoverflow .com/questions/35272457/ . попробуйте написать часть do(), используя обычную функцию, например, в lapply и т. д., и вы увидите ее функцию - person StupidWolf; 14.04.2020