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-теста.
- Последовательные / подвижные суммы в векторе в R
- нумерация по группам
- Отправка электронной почты в R через Outlook
- Евклидово расстояние двух векторов
- Есть ли такой «colsd» в R?
- В R, как получить имя объекта после его отправки в функцию?
- Отбор проб в R из вектора различной длины
- Извлечение элементов, общих во всех группах столбцов
- Как вставить элементы в вектор?
- R: gsub, pattern = vector и replacement = vector
- Укажите количество последовательных значений
- Извлечение строк для первого вхождения переменной в фрейм данных
- Матрица корреляции сюжетов в граф
Попробуй это
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-тест каждой строки по всем столбцам.