如何使用相同的参考向量在R中执行多个成对t.test?

时间:2015-08-19 21:38:09

标签: r loops vector

让我们考虑数据帧中的以下向量:

ctrl <- rnorm(50)
x1 <- rnorm(30, mean=0.2)
x2 <- rnorm(100,mean=0.1)
x3 <- rnorm(100,mean=0.4)

x <- data.frame(data=c(ctrl,x1,x2,x3),
            Group=c(
              rep("ctrl", length(ctrl)),
              rep("x1", length(x1)),
              rep("x2", length(x2)),
              rep("x3", length(x3))) )

我知道我可以使用

pairwise.t.test(x$data,
            x$Group,
            pool.sd=FALSE)

获得成对比较,如

 Pairwise comparisons using t tests with non-pooled SD 

data:  x$data and x$Group 

   ctrl    x1      x2     
x1 0.08522 -       -      
x2 0.99678 0.10469 -      
x3 0.00065 0.99678 2.8e-05

P value adjustment method: holm 

但是我对每种可能的载体组合都不感兴趣。我正在寻找一种方法来比较ctrl向量与其他所有向量,并考虑到alpha通胀。我想避免

t.test((x$data[x$Group=='ctrl']), (x$data[x$Group=='x1']), var.equal=T)
t.test((x$data[x$Group=='ctrl']), (x$data[x$Group=='x2']), var.equal=T)
t.test((x$data[x$Group=='ctrl']), (x$data[x$Group=='x3']), var.equal=T)

然后执行手动校正以进行多重比较。最好的方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以使用p.adjust对多个p值进行Bonferroni调整。你不应该在不同的adataframe中捆绑不等长度的向量,而是使用一个列表。

ctrl <- rnorm(50)
x1 <- rnorm(30, mean=0.2)
x2 <- rnorm(100,mean=0.1)
x3 <- rnorm(100,mean=0.4)

> lapply( list(x1,x2,x3), function(x) t.test(x,ctrl)$p.value)
[[1]]
[1] 0.2464039

[[2]]
[1] 0.8576423

[[3]]
[1] 0.0144275

> p.adjust( .Last.value)
[1] 0.4928077 0.8576423 0.0432825

答案 1 :(得分:0)

@BondedDust的答案看起来很棒。如果你真的需要使用数据帧,我会提供一些更复杂的解决方案。

<post is="{{ currentView }}"></post>

PS:使用p值和alpha校正总是很有趣。如何处理这个问题并且有些人同意和其他人不同意这是一个哲学问题。就个人而言,我倾向于根据我在实验后可以做的所有可能的比较来纠正alpha,因为你永远不知道你什么时候回来调查其他对。想象一下如果将来人们决定你必须回去比较胜利组(让x1说x1)和x2和x3,会发生什么。您将专注于这些对,并且您将再次根据这些对象纠正alpha。但总的来说,除了x2和x3之外,你还进行了所有可能的比较!您可以编写报告或发布对Alpha校正应该更严格的发现。