R: t-test en todas las columnas

Intenté hacer t-test en todas las columnas (dos a la vez) de mi dataframe, y extraer solo el valor p. Esto es lo que se me ocurrió:

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) } 

Mis preguntas son: 1. ¿hay alguna manera de hacerlo sin un bucle? 2. cómo capturar los resultados de la prueba t.

Prueba este

 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 

Yo recomendaría convertir su dataframe a formato largo y usar pairwise.t.test con p.adjust apropiado:

 > 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 

Aquí hay otra solución, con outer .

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

Suponiendo que su dataframe se ve así:

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

el siguiente

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

le dará pruebas para cada conjunto de columnas. Tenga en cuenta que esto solo le dará una prueba t para a & b, c & d, y e & f. si quisiera a & b, b & c, c & d, d & e, y e & f, entonces tendría que hacer:

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

finalmente si, digamos que solo quieres los valores P de tus pruebas, entonces puedes hacer esto:

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

Si no está seguro de cómo trabajar con un objeto, intente escribir summary (tests) y str (tests [[1]]) – en este caso test es una lista de objetos htest, y desea conocer la estructura del objeto htest, no necesariamente la lista.

Espero que esto haya ayudado!

Yo corro esto:

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

Me tomó un tiempo adivinar el truco "vapply" para sacar los pvals de la lista de objetos de resultado t.test. (He editado esto de 'sapply' por el comentario de Henrik a continuación)

Si se trata de una prueba t pareada, puede restar y probar para means = 0, que da exactamente el mismo resultado (eso es todo lo que hace un t.test):

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

Nuevamente, esta es una prueba t por fila sobre todas las columnas.