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

Я попытался выполнить 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-теста.

Попробуй это

 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 XY -5.598 92.74744 0.000 2 2 XZ -9.361 90.12561 0.000 3 3 YZ -3.601 97.62511 0.000 

Я бы рекомендовал преобразовать ваш фрейм данных в длинный формат и использовать p.adjust с соответствующим 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 abcdeb 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 abcde 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 

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

 outer( 1:ncol(Data), 1:ncol(Data), Vectorize( function (i,j) t.test(Data[,i], Data[,j])$p.value ) ) 

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

 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 object, не обязательно список.

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

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

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

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

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

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

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

  • Автоматически создавать формулы для всех возможных линейных моделей
  • Функция очистки консоли в R и RStudio
  • Как назначить значения динамическим именам переменных
  • Использование '[' квадратная скобка как функция для lapply в R
  • Возьмите сумму переменной, если комбинация значений в двух других столбцах уникальна
  • Удаление пустых строк файла данных в R
  • Как увидеть исходный код функции R .Internal или .Primitive?
  • Найти повторяющиеся значения в R
  • Как узнать R как язык программирования?
  • Вычислить разницу между значениями в последовательных строках по группам
  • условие имеет длину> 1, и только первый элемент будет использоваться в if else statement
  • Давайте будем гением компьютера.