2012-03-12 177 views
4

我试图对我的数据框的所有列(每次两个)进行t检验,并只提取p值。以下是我想出了:R:对所有列进行t检验

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检验的结果。

回答

12

试试这个

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 
+1

MYassen208的回答比较好。一般来说,应尽可能使用plyr包装。死的方便! – 2012-03-12 04:02:50

+1

也只是意识到,如果你想要所有的成对组合,那么MYaseen208的答案还会告诉你如何使用combn() – 2012-03-12 04:05:53

+0

谢谢,这就像魅力。我确实有一个后续问题:http:// stackoverflow。com/q/9669411/612191 – ery 2012-03-12 14:58:15

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

会给你每一组列的测试。请注意,这只会给你一个t.test一个& b,c & d和e & f。 如果你想要一个& B,B & C,C & d,d & E,和E &男,那么你就必须做:

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对象的结构,不一定是l IST。

希望这有助于!

4

这是另一种解决方案,与outer

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

我会推荐给你的数据帧转换为长格式和使用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 
0

我运行此:

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

我花了一段时间来占卜“vapply”技巧将pvals从t.test结果对象列表中提取出来。 (由于下面Henrik的评论我编辑了'sapply')

如果它是一个配对t检验,你可以减去并测试means = 0,它给出完全相同的结果(这是一个配对t。测试是):

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

再次,这是对所有列进行的每行t检验。

+1

不要使用'sapply',使用'vapply'。你不需要'unlist',并且如果数据不符合预期,它将会出错。此外,你可以使用''[[“'以及。所以我会这样做:'vapply(tres,“[[”,0,i =“p.value”)'('0'只是表示应该返回一个数字) – Henrik 2012-09-21 20:36:12