在简化的R中进行多个T测试

时间:2019-02-28 06:34:00

标签: r dataframe hypothesis-test

我希望在R中进行多个t检验,而不必进行每个测试的复制粘贴。当查看“ Level_#”时,每个测试将确定“类型”中是否存在差异(无论是“左”还是“右”)。目前,我可能有:

t.test(Level_1 ~ Type, alternative="two.sided", conf.level=0.99)
t.test(Level_2 ~ Type, alternative="two.sided", conf.level=0.99)

Type Level_1 Level_2 Level_3
Left      17      50      98
Right     18      65      65
Left      23       7      19
Left      65       7     100
Right     9       13      17

问题是我有数百个“ Level_#”,并且想知道如何自动执行此过程并输出结果的数据帧。我的想法是以某种方式合并应用功能。

1 个答案:

答案 0 :(得分:2)

您可以使用tidyverse方法以及purrrbroom软件包来做到这一点。

require(tidyverse)
require(broom)

df %>% 
  gather(var, level, -type) %>% 
  nest(-var) %>%
  mutate(model = purrr::map(data, function(x) { 
    t.test(level ~ type, alternative="two.sided", conf.level=0.99, 
           data = x)}), 
    value = purrr::map(model, tidy), 
    conf.low = purrr::map(value, "conf.low"),
    conf.high = purrr::map(value, "conf.high"),
    pvalue = purrr::map(value, "p.value")) %>% 
  select(-data, -model, -value)

输出:

     var  conf.low conf.high    pvalue
1 level1 -3.025393  4.070641 0.6941518
2 level2 -3.597754  3.356125 0.9260015
3 level3 -3.955293  3.673493 0.9210724

样本数据:

set.seed(123)
df <- data.frame(type = rep(c("left", "right"), 25), 
                 level1 = rnorm(50, mean = 85, sd = 5), 
                 level2 = rnorm(50, mean = 75, sd = 5), 
                 level3 = rnorm(50, mean = 65, sd = 5))