R 在多个组中对同一响应变量执行多个t检验

R 在多个组中对同一响应变量执行多个t检验,r,tidyr,hypothesis-test,R,Tidyr,Hypothesis Test,我看过许多类似的问题(比如一个),但在我的例子中,治疗组并没有保存为单独的向量,我也没有成功地将我的变量名替换到我在这个主题上看到的任何其他代码中 我想在多个地点比较同一变量(测试分数)的“之前”和“之后”治疗的平均值 我的数据如下所示: > head(my.df, n=15) Location TestScore Treatment 1 4 0.7167641 Before 2 4

我看过许多类似的问题(比如一个),但在我的例子中,治疗组并没有保存为单独的向量,我也没有成功地将我的变量名替换到我在这个主题上看到的任何其他代码中

我想在多个地点比较同一变量(测试分数)的“之前”和“之后”治疗的平均值

我的数据如下所示:

  > 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)
# 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值都相同(即使数据不同),如下所示:

my.df %>% group_by(Location) %>% do(tidy(t.test(TestScore ~ Treatment, data = my.df, var.equal = FALSE)
# 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 
#一个tible:10 x 11
#分组:地点[10]
位置估计估计1估计2统计p值参数形态低形态高方法备选方案
1 4 0.0587 0.972 0.913 15.0 1.60e-20 51.8 0.0508 0.0665韦尔奇双样本t检验双侧
2 7 0.0587 0.972 0.913 15.0 1.60e-20 51.8 0.0508 0.0665韦尔奇双样本t检验双侧
3 8 0.0587 0.972 0.913 15.0 1.60e-20 51.8 0.0508 0.0665韦尔奇双样本t检验双侧
4 9 0.0587 0.972 0.913 15.0 1.60e-20 51.8 0.0508 0.0665韦尔奇双面双样本t检验
5 10 0.0587 0.972 0.913 15.0 1.60e-20 51.8 0.0508 0.0665韦尔奇双面双样本t检验
6 12 0.0587 0.972 0.913 15.0 1.60e-20 51.8 0.0508 0.0665韦尔奇双面双样本t检验
7 14 0.0587 0.972 0.913 15.0 1.60e-20 51.8 0.0508 0.0665韦尔奇双面双样本t检验
8 16 0.0587 0.972 0.913 15.0 1.60e-20 51.8 0.0508 0.0665韦尔奇双面双样本t检验
9 21 0.0587 0.972 0.913 15.0 1.60e-20 51.8 0.0508 0.0665韦尔奇双面双样本t检验
10270.0587 0.972 0.913 15.0 1.60e-2051.8 0.0508 0.0665韦尔奇双样本t检验双侧

如何比较每个部位治疗前后的p值?非常感谢您的帮助

大多数代码都是正确的,在分组之后,要处理每个分组中的数据,需要使用
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
库(dplyr)
图书馆(扫帚)
my.df=data.frame(位置=样本(c(4,7,8),100,replace=TRUE),
测试分数=rnorm(100,10,1),
处理=样品(c(“之前”、“之后”),100,替换=真实)
#一个tibble:3x11
#分组:地点[3]
位置估计估计值估计值1估计值2统计p.value参数conf.low
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

您获得了大部分正确的代码,在分组之后,要处理每个分组中的数据,您需要使用
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
库(dplyr)
图书馆(扫帚)
my.df=data.frame(位置=样本(c(4,7,8),100,replace=TRUE),
测试分数=rnorm(100,10,1),
处理=样品(c(“之前”、“之后”),100,替换=真实)
#一个tibble:3x11
#分组:地点[3]
位置估计估计值估计值1估计值2统计p.value参数conf.low
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

谢谢!为了澄清一下,你能解释一下“data=”在这种情况下做了什么吗?对R来说还是相当新的。the.是magrittr点。因此,例如,如果我们要正确地编写do(..),它将是do(function(x)tidy(..,data=x)),当你执行dplyr等操作时,你可以使用。来替换函数(x)Etcy你也可以检查一下。试着用一个普通函数(如Lappy等)编写do()部分,你会看到它的函数谢谢!为了澄清一下,你能解释一下“data=”在这种情况下做了什么吗?对R来说还是相当新的。是magrittr点。例如,如果我们要编写do(…)正确地说,它应该是do(function(x)tidy(..,data=x)),当您执行dplyr等操作时,您可以使用。要替换function(x)etcy,您也可以检查这一点。尝试使用普通函数(如lappy等)编写do()部分,您将看到它的函数