Проведите несколько t.test одновременно на приборных данных в R - PullRequest
0 голосов
/ 28 июня 2018

У меня есть набор данных, который выглядит следующим образом:

id  samediff  factor  value
1   S         give    3
1   S         impact  4
2   S         give    2
2   S         impact  5   
3   D         give    1
3   D         impact  4
4   D         give    3
4   D         impact  5 

Я хотел бы провести несколько t-тестов, чтобы сравнить средние значения для каждого фактора в условии S (samediff) со средними значениями для того же фактора в условии D (samediff).

Я знаю, что могу сделать это следующим образом:

dfgive<-filter(df, factor == "give")
t.test(value~samediff, dfgive)

dfimpact<-filter(df, factor == "impact")
t.test(value~samediff, dfimpact) 

Есть ли способ провести несколько тестов в меньшее количество строк? В фактическом наборе данных есть еще несколько факторов, которые включены здесь. Я хотел бы иметь возможность проводить все необходимые t.test без создания отдельных фреймов данных так же, как я показал выше.

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Мы можем разделить данные на factor и применить t.test по одному. Окончательный результат - список. Мы можем получить доступ к результату lst$give или lst$impact.

library(tidyverse)

lst <- df %>%
  split(.$factor) %>%
  map(~t.test(value ~ samediff, .x))

DATA

df <- read.table(text = "id  samediff  factor  value
1   S         give    3
1   S         impact  4
2   S         give    2
2   S         impact  5   
3   D         give    1
3   D         impact  4
4   D         give    3
4   D         impact  5 ",
                 header = TRUE, stringsAsFactors = FALSE)
0 голосов
/ 28 июня 2018

Чтобы дополнить существующие ответы, вы можете использовать broom::tidy, чтобы привести в порядок вывод из t.test, например,

library(tidyverse)
library(broom)
df %>%
  group_by(factor) %>%
  summarise(ttest = list(t.test(value ~ samediff))) %>%
  mutate(ttest = map(ttest, tidy)) %>%
  unnest() %>%
  select(factor, estimate, estimate1, estimate2, p.value)
# # A tibble: 2 x 5
#   factor estimate estimate1 estimate2 p.value
#   <chr>     <dbl>     <dbl>     <dbl>   <dbl>
# 1 give       -0.5       2         2.5   0.712
# 2 impact      0         4.5       4.5   1  

Вот подход base-R:

results <- lapply(split(df, df$factor), function(X) {
  out <- t.test(value ~ samediff, X)
  data.frame(diff = out$statistic,
             mean1 = out$estimate[1],
             mean2 = out$estimate[2],
             pval = out$p.value)
})
do.call(rbind, results)
#              diff mean1 mean2      pval
# give   -0.4472136   2.0   2.5 0.7117228
# impact  0.0000000   4.5   4.5 1.0000000
0 голосов
/ 28 июня 2018

Мы можем сгруппировать по 'фактору' и summarise выводу t.test в list

library(dplyr)
out <- df %>% 
        group_by(factor) %>% 
        summarise(ttest = list(t.test(value ~ samediff)))

out
# A tibble: 2 x 2
#  factor ttest      
#  <chr>  <list>     
#1 give   <S3: htest>
#2 impact <S3: htest>

Вывод сохраняется в столбце list, который можно извлечь с помощью $ или [[

identical(out$ttest[[1]], t.test(value ~ samediff, dfgive))
#[1] TRUE
...