R:对所有列进行t检验

时间:2012-03-12 03:39:20

标签: r

我尝试对我的数据框的所有列(一次两个)进行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 个答案:

答案 0 :(得分:16)

我建议您将数据框格转换为长格式,并使用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

{{1}}

答案 1 :(得分:15)

试试这个

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

答案 2 :(得分:4)

这是另一种解决方案,outer

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

答案 3 :(得分:2)

假设您的数据框看起来像这样:

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

将为您提供每组列的测试。请注意,这只会给你一个&。 b,c&amp; d和e&amp; F。 如果你想要一个&amp; b,b&amp; c,c&amp; d,d&amp; e和e&amp; 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})

如果您不确定如何使用对象,请尝试键入summary(tests)和str(tests [[1]]) - 在这种情况下test是一个htest对象列表,并且您想知道htest对象的结构,不一定是列表。

希望这有帮助!

答案 4 :(得分:0)

我跑了这个:

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

我花了一些时间来理解“vapply”技巧,将pval从t.test结果对象列表中拉出来。 (由于Henrik在下面的评论,我从'sapply'编辑了这个)

如果是配对t检验,你可以减去并测试均值= 0,这得到完全相同的结果(这就是所有配对的t.test):

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

同样,这是对所有列的每行t检验。