R中多行的T检验

T-test for multiple rows in R

我有一个包含 40 多列和 200.000 多行的 table。 像这样:

ID GROUP-A1 GROUP-A2 GROUP A3...A20   GROUP-B1 GROUP-B2 GROUP-B3...B20
1  5        6        3     5....3     10       21       9          15
2  3        4        6     2....13    23       42       34         23
3  5        3        1     0....12    10       12       43         15 
4  0        0        2     5....3     10       21       23         15 

我想 运行 对两组 A (1..20) 和 B (1..20) 的每个测量值(每一行)进行 t 检验,它们是独立的.并且可能,将生成的统计数据放在每一行旁边的 table 中或单独的 table 中,这样我就可以轻松地 select 重要的统计数据。

我查看了几个 R 包,但它们大多需要重新格式化我拥有的 table,以便将测量值和组放在列中,在那种情况下我需要 200.000 多个单独的 table .

有什么想法吗?

是这样的吗?

apply(df,1,function(x){t.test(x[2:21],x[22:41])})

要在新列中保存检验统计量或 p 值,您可以这样做

df$st=apply(df,1,function(x){t.test(x[2:21],x[22:41])$stat})

$p.value

您可以运行使用以下代码进行所有测试。

i_group_a <- grep("GROUP.A", names(df1), ignore.case = TRUE)
i_group_b <- grep("GROUP.B", names(df1), ignore.case = TRUE)

ttest_list <- lapply(seq_along(i_group_a), function(k){
  i <- i_group_a[k]
  j <- i_group_b[k]
  t.test(df1[[i]], df1[[j]])
})

ttest_list[[1]]
#
#   Welch Two Sample t-test
#
#data:  df1[[i]] and df1[[j]]
#t = -2.8918, df = 3.7793, p-value = 0.04763
#alternative hypothesis: true difference in means is not equal to 0
#95 percent confidence interval:
# -19.826402  -0.173598
#sample estimates:
#mean of x mean of y 
#     3.25     13.25 

例如,要提取 p 值:

pval <- sapply(ttest_list, `[[`, 'p.value')
pval
#[1] 0.04762593 0.04449075 0.04390115 0.00192454

数据.

df1 <- read.table(text = "
ID GROUP-A1 GROUP-A2 GROUP-A3 GROUP-A20   GROUP-B1 GROUP-B2 GROUP-B3   GROUP-B20
1  5        6        3        5           10       21       9          15
2  3        4        6        2           23       42       34         23
3  5        3        1        0           10       12       43         15 
4  0        0        2        5           10       21       23         15
", header = TRUE)

您可以通过 tidyverse 使用 purrr 来完成此操作。但是,它确实需要以不同方式格式化您的数据。这是一个例子:

require(tidyverse)
set.seed(314)

模拟您的数据


df <- data.frame(ID = rep(1:5,each = 20),
                 participant = rep(rep(1:10,2),5),
                 group = rep(rep(c('A','B'),each = 10),5),
                 answer = sample(1:10,100, replace = T))

dfflat <- df %>% 
  unite(column, group,participant) %>%
  spread(column,answer)

dfflat:

  ID A_1 A_10 A_2 A_3 A_4 A_5 A_6 A_7 A_8 A_9 B_1 B_10 B_2 B_3 B_4 B_5 B_6 B_7 B_8 B_9
1  1   1    8   3   8   3   3   4   3   4   6   4    4   2   3   3   6   4   8   6   1
2  2   7    6   5   6   3   1   6   4   1   3   3    6   7   1   5   5   2  10  10   6
3  3   4    3   8   5   9   7   9   7   3   1   8    2   7   6   8   3   5   6   9   4
4  4   5    4   8   2   4   1   4   6   2   2   1    1   7  10   6   9   7   7  10   1
5  5   4    1   5  10   3   5   3  10   8   3   7    3   4   6   6   9  10   7   4   5

长格式的等价物:

dfflat %>%
  gather(participant,answer,-ID) %>%
  separate(participant,c('group','number'))

    ID group number answer
1    1     A      1      1
2    2     A      1      7
3    3     A      1      4
4    4     A      1      5
5    5     A      1      4
6    1     A     10      8
7    2     A     10      6
8    3     A     10      3
9    4     A     10      4
10   5     A     10      1
11   1     A      2      3
12   2     A      2      5
13   3     A      2      8
14   4     A      2      8
15   5     A      2      5
16   1     A      3      8
17   2     A      3      6
18   3     A      3      5
19   4     A      3      2
20   5     A      3     10
...

根据IDt.test检验假设并提取p.value

dfflat %>%
  gather(participant,answer,-ID) %>%
  separate(participant,c('group','number')) %>%
  group_by(ID) %>%
  nest() %>%
  mutate(test = map(data, ~ with(.x, t.test(answer[group == 'A'],answer[group == 'B']))),
         p.value = map_dbl(test,pluck,'p.value')) 

结果:

# A tibble: 5 x 4
     ID data              test        p.value
  <int> <list>            <list>        <dbl>
1     1 <tibble [20 x 3]> <S3: htest>   0.841
2     2 <tibble [20 x 3]> <S3: htest>   0.284
3     3 <tibble [20 x 3]> <S3: htest>   0.863
4     4 <tibble [20 x 3]> <S3: htest>   0.137
5     5 <tibble [20 x 3]> <S3: htest>   0.469