R: t-тест по всем столбцам - PullRequest
       21

R: t-тест по всем столбцам

4 голосов
/ 12 марта 2012

Я попытался выполнить t-тест для всех столбцов (по два за раз) моего фрейма данных и извлечь только значение p.Вот что я придумала:

for (i in c(5:525) ) {

t_test_p.value =sapply( Data[5:525], function(x) t.test(Data[,i],x, na.rm=TRUE)$p.value)

}

Мои вопросы: 1. Есть ли способ сделать это без цикла?2. как зафиксировать результаты t-теста.

Ответы [ 5 ]

16 голосов
/ 12 марта 2012

Я бы рекомендовал преобразовать ваш фрейм данных в длинный формат и использовать pairwise.t.test с соответствующими p.adjust:

> library(reshape2)
> 
> df <- data.frame(a=runif(100),
+          b=runif(100),
+          c=runif(100)+0.5,
+          d=runif(100)+0.5,
+          e=runif(100)+1,
+          f=runif(100)+1)
> 
> d <- melt(df)
Using  as id variables
> 
> pairwise.t.test(d$value, d$variable, p.adjust = "none")

    Pairwise comparisons using t tests with pooled SD 

data:  d$value and d$variable 

  a      b      c      d      e   
b 0.86   -      -      -      -   
c <2e-16 <2e-16 -      -      -   
d <2e-16 <2e-16 0.73   -      -   
e <2e-16 <2e-16 <2e-16 <2e-16 -   
f <2e-16 <2e-16 <2e-16 <2e-16 0.63

P value adjustment method: none 
> pairwise.t.test(d$value, d$variable, p.adjust = "bon")

    Pairwise comparisons using t tests with pooled SD 

data:  d$value and d$variable 

  a      b      c      d      e
b 1      -      -      -      -
c <2e-16 <2e-16 -      -      -
d <2e-16 <2e-16 1      -      -
e <2e-16 <2e-16 <2e-16 <2e-16 -
f <2e-16 <2e-16 <2e-16 <2e-16 1

P value adjustment method: bonferroni 
15 голосов
/ 12 марта 2012

Попробуйте это

X <- rnorm(n=50, mean = 10, sd = 5)
Y <- rnorm(n=50, mean = 15, sd = 6)
Z <- rnorm(n=50, mean = 20, sd = 5)
Data <- data.frame(X, Y, Z)

library(plyr)

combos <- combn(ncol(Data),2)

adply(combos, 2, function(x) {
  test <- t.test(Data[, x[1]], Data[, x[2]])

  out <- data.frame("var1" = colnames(Data)[x[1]]
                    , "var2" = colnames(Data[x[2]])
                    , "t.value" = sprintf("%.3f", test$statistic)
                    ,  "df"= test$parameter
                    ,  "p.value" = sprintf("%.3f", test$p.value)
                    )
  return(out)

})



  X1 var1  var2 t.value       df p.value
1  1   X      Y  -5.598 92.74744   0.000
2  2   X      Z  -9.361 90.12561   0.000
3  3   Y      Z  -3.601 97.62511   0.000
4 голосов
/ 12 марта 2012

Вот еще одно решение, с outer.

outer( 
  1:ncol(Data), 1:ncol(Data), 
  Vectorize(
    function (i,j) t.test(Data[,i], Data[,j])$p.value
  ) 
)
2 голосов
/ 12 марта 2012

Предполагая, что ваш фрейм данных выглядит примерно так:

df = data.frame(a=runif(100),
                b=runif(100),
                c=runif(100),
                d=runif(100),
                e=runif(100),
                f=runif(100))

следующие

tests = lapply(seq(1,length(df),by=2),function(x){t.test(df[,x],df[,x+1])})

даст вам тесты для каждого набора столбцов. Обратите внимание, что это даст вам только t.test для a & b, c & d и e & f. если вы хотите a & b, b & c, c & d, d & e и e & f, то вам нужно будет сделать:

tests = lapply(seq(1,(length(df)-1)),function(x){t.test(df[,x],df[,x+1])})      

наконец, если, скажем, вам нужны только значения P из ваших тестов, вы можете сделать это:

pvals = sapply(tests, function(x){x$p.value})

Если вы не уверены, как работать с объектом, попробуйте набрать резюме (тесты) и str (тесты [[1]]) - в этом случае тест представляет собой список объектов htest, и вы хотите знать структура объекта htest, не обязательно список.

Надеюсь, это помогло!

0 голосов
/ 22 сентября 2012

Я запускаю это:

tres<-apply(x,1,t.test)
pval<-vapply(tres, "[[", 0, i = "p.value")

Мне потребовалось некоторое время, чтобы придумать трюк "vapply", чтобы вытащить pvals из списка объектов результата t.test.(Я отредактировал это из 'sapply' из-за комментария Хенрика ниже)

Если это парный t-тест, вы можете просто вычесть и проверить для средних = 0, что дает точно такой же результат (это все парныеt.test is):

tres<-apply(y-x,1,t.test)
pval<-vapply(tres, "[[", 0, i = "p.value")

Опять же, это t-тест для каждой строки по всем столбцам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...