Как выполнить итерацию t-теста в R с данными, имеющими более двух аргументов или категориальных переменных? - PullRequest
0 голосов
/ 26 марта 2020

У меня есть набор данных, который включает наблюдения на поле с двумя разными годами (год1, год2), в котором сравниваются 3 обработки (A, B, C). Длинный список идентичных переменных (var1, var2, var3 ... var20) был измерен для каждой обработки за оба года.

пример структуры данных

Я бы хотел бы узнать, как выполнить итерацию t-критерия, который будет оценивать разницу между средними значениями между year1 и year2, для каждой обработки и каждой переменной, один за другим.

Я не смог найти способ сопряжения лечение: «t-критерий для var1 для лечения A в год1 с лечением A в год2»; 't-тест для var1 B в год1 с B в год2'; et c.

Было бы идеально, если бы p-значения t-критерия могли быть агрегированы в таблице, чтобы упростить экспорт результата.

Спасибо !!

1 Ответ

0 голосов
/ 26 марта 2020

Допустим, ваши данные - это data.frame с именем df, как показано ниже:

df = data.frame(year=sample(1:2,100,replace=TRUE),
treatment=sample(LETTERS[1:3],100,replace=TRUE),
var1=rnorm(100),var2=rnorm(100))

df$year = factor(df$year)

Один из вариантов - использовать genefilter, который выполняет t.test для каждого столбца, и вы сначала делитесь на обработайте и примените эту функцию для каждого подмножества:

library(genefilter)
result = by(df,df$treatment,function(x){
test = colttests(x=as.matrix(x[,c("var1","var2")]),fac=x$year)
data.frame(
treatment = unique(x$treatment),
var = rownames(test),
pvalue=test$p.value
)
})

head(result)
    treatment  var     pvalue
A.1         A var1 0.60966026
A.2         A var2 0.70644999
B.1         B var1 0.29378349
B.2         B var2 0.63731701
C.1         C var1 0.91665543
C.2         C var2 0.06207974

В противном случае, используйте dplyr, метлу, и вам нужно повернуть ее так, чтобы мы могли применить одну и ту же формулу value ~ year для каждой группы:

library(dplyr)
library(broom)
library(tidyr)

df %>% pivot_longer(-c(year,treatment)) %>% 
group_by(treatment,name) %>% 
do(tidy(t.test(value ~ year,data=.)))

# A tibble: 6 x 12
# Groups:   treatment, name [6]
  treatment name  estimate estimate1 estimate2 statistic p.value parameter
  <fct>     <chr>    <dbl>     <dbl>     <dbl>     <dbl>   <dbl>     <dbl>
1 A         var1    0.159    0.0225    -0.136      0.518  0.609       23.1
2 A         var2    0.126    0.216      0.0899     0.386  0.703       23.8
3 B         var1   -0.364   -0.142      0.222     -1.03   0.317       16.7
4 B         var2    0.209    0.00951   -0.199      0.444  0.663       15.2
5 C         var1   -0.0387  -0.176     -0.137     -0.103  0.919       29.7
6 C         var2    0.651    0.488     -0.162      1.85   0.0744      27.6
# … with 4 more variables: conf.low <dbl>, conf.high <dbl>, method <chr>,
#   alternative <chr>
...