这是我之前提出的一个问题所激发的一个问题:使用tapply/dapply等进行t.tests
我有一个来自 interlab 研究的数据框,如下http://pastebin.com/AD57AYD1
本质上lab=Laboratory,mat=material,fab=strength,thick=thickness
我想要 t.test 数据来比较每种材料的每个实验室。即,对于 mat=v,我想运行一个 t.test 来比较实验室 B 和实验室 S。同样对于材料 c、n 和 l。
我之前的问题是关于使用 plyr 允许我为这些组合中的每一个运行 t.tests 。然而,有人指出,需要考虑多重比较的问题。
我曾尝试对我的数据使用paired.t.test 函数,但它进行了太多比较(即,它对lab B 腈与lab S 乙烯基进行了t 检验——这无关紧要。我这样称呼它:
pairwise.t.test(interlab$fab,interaction(interlab$mat,interlab$lab),paired=FALSE, pool.sd=FALSE)
它给了我
> pairwise.t.test(interlab$fab,interaction(interlab$mat,interlab$lab),paired=FALSE, pool.sd=FALSE)
Pairwise comparisons using t tests with non-pooled SD
data: interlab$fab and interaction(interlab$mat, interlab$lab)
c.B l.B n.B v.B c.S l.S n.S
l.B 0.54484 - - - - - -
n.B 3.8e-07 1.9e-06 - - - - -
v.B 0.93881 0.22393 3.6e-07 - - - -
c.S 0.00576 0.93881 1.2e-05 0.00026 - - -
l.S 0.00067 0.48601 2.5e-05 4.6e-05 0.89883 - -
n.S 4.3e-12 2.2e-10 0.92366 5.4e-12 6.7e-10 7.7e-10 -
v.S 0.93881 0.93881 1.9e-06 0.31885 0.01217 0.00169 1.3e-10
P value adjustment method: holm
我担心这里调整后的 p 值是错误的,因为我们没有将材料 n 与 l 或 l 与 c 进行比较——在两个实验室进行测试时,我们总是在寻找相同的材料(即材料 'l'实验室“B”和“S”)。
有没有办法对数据进行子集/分组,以便对 pairwise.t.test 的适当调用只给我以下比较?
c.B l.B n.B v.B c.S l.S n.S
l.B - - - - - - -
n.B - - - - - - -
v.B - - - - - - -
c.S 0.00576 - - - - - -
l.S - 0.48601 - - - - -
n.S - - 0.92366 - - - -
v.S - - - 0.31885 - - -
问候皮特
编辑:@John 发表评论后
虽然似乎无法以这种方式使用 pairwise.t.test 函数,但可以在调用 p.adjust 函数时使用来自@droopy 的先前解决方案:
> FUN<- function(x) {
t.test(x[,"fab"] ~ x[,"lab"])$p.value
}
res<-ddply(interlab, .(mat), FUN)
res$adjpvalue<-p.adjust(res$V1)
res
mat V1 adjpvalue
1 c 0.0004798071 0.001919228
2 l 0.0607510365 0.121502073
3 n 0.1847312857 0.184731286
4 v 0.0354274420 0.106282326
感谢@John 和@droopy 在这方面的帮助。