R:t.test和pairwise.t.test给出不同的结果?

时间:2012-07-12 14:51:23

标签: r

我尝试用R对以下数据帧进行t检验。

df <- structure(list(freq = c(9, 11, 14, 12, 10, 9, 16, 10, 11, 15, 
13, 12, 12, 13, 13, 9, 16, 14, 12, 15, 16, 10, 11, 13, 14, 14, 
14, 16, 8, 10, 14, 14, 11, 11, 11, 11, 13, 7, 12, 13, 14, 11, 
11, 13, 10, 14, 10, 10, 12, 8, 9, 12, 14, 11, 12, 12, 14, 14, 
14, 15, 12, 13, 14, 8, 9, 11, 10, 14, 12, 12, 9, 10, 8, 14, 11, 
14, 9, 13, 13, 13, 10, 9, 13, 10, 13, 10, 13, 12, 11, 12, 10, 
12, 8, 11, 12, 15, 12, 12, 11, 13, 12, 10, 13, 9, 11, 9, 11, 
8, 12, 12, 12, 10, 11, 12, 9, 13, 14, 11, 11, 14, 13, 12, 14, 
15, 12, 12, 12, 14), class = structure(c(3L, 3L, 2L, 2L, 2L, 
2L, 2L, 3L, 2L, 3L, 4L, 4L, 4L, 4L, 3L, 2L, 3L, 2L, 1L, 4L, 1L, 
4L, 1L, 4L, 2L, 2L, 3L, 3L, 2L, 4L, 1L, 4L, 4L, 4L, 3L, 3L, 3L, 
2L, 1L, 4L, 3L, 3L, 1L, 4L, 1L, 2L, 2L, 3L, 3L, 4L, 2L, 2L, 3L, 
3L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 4L, 1L, 1L, 1L, 2L, 2L, 3L, 
2L, 3L, 2L, 3L, 3L, 4L, 2L, 1L, 4L, 1L, 1L, 3L, 2L, 2L, 2L, 3L, 
1L, 1L, 1L, 1L, 3L, 4L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 3L, 3L, 4L, 
4L, 3L, 4L, 4L, 4L, 4L, 3L, 3L, 1L, 4L, 4L, 1L, 4L, 4L, 1L, 3L, 
1L, 2L, 2L, 1L, 2L, 1L, 1L, 3L, 3L, 2L, 1L), .Label = c("ending", 
"mobile", "stem.first", "stem.second"), class = "factor")), .Names = c("freq", 
"class"), row.names = c(NA, -128L), class = "data.frame")

当我在previous post中阅读时,在R中有多种方法可以做到这一点。 我尝试使用t.test - 函数并使用pairwise.t.test - 函数。

对于使用t.test,我按要比较的类对数据帧进行子集化,并在子集上运行后续的t检验。

ending.vs.mobile <- df[df$class=="ending"|df$class=="mobile",]
ending.vs.first <- df[df$class=="ending"|df$class=="stem.first",]
ending.vs.second <- df[df$class=="ending"|df$class=="stem.second",]
mobile.vs.first <- df[df$class=="mobile"|df$class=="stem.first",]
mobile.vs.second <- df[df$class=="mobile"|df$class=="stem.second",]
first.vs.second <- df[df$class=="stem.first"|df$class=="stem.second",]

t.test(ending.vs.mobile$freq ~ ending.vs.mobile$class, var.equal=T) 
t.test(ending.vs.first$freq ~ ending.vs.first$class, var.equal=T) 
t.test(ending.vs.second$freq ~ ending.vs.second$class, var.equal=T) 
t.test(mobile.vs.first$freq ~ mobile.vs.first$class, var.equal=T) 
t.test(mobile.vs.second$freq ~ mobile.vs.second$class, var.equal=T) 
t.test(first.vs.second$freq ~ first.vs.second$class, var.equal=T)

据我所知(这里我可能错了)pairwise.t.test在这里会更方便,因为我不需要创建所有子集并且可以在原始数据帧上运行它。 / p>

pairwise.t.test(df$freq, df$class, p.adjust.method="none", paired=FALSE, pooled.sd=FALSE)

但是我在这里得到的结果不同,比较结果与stem.second最为明显:p = 0.7使用t.test而p = 0.1使用pairwise.t.test

这里有什么问题?我在哪里做的......错?


虽然问题本身已经解决,但我认为它发生的原因,让我有点偏执(不再相信自己了): 只需键入pooled.sd而不是pool.sd,我就无法得到我期望的结果。 这不是很容易出错吗?

在许多其他情况下,您可以输入变体,例如bonfbonferronifa()factor(),依此类推。但是pooled.sd完全被忽略了,尽管“pooled sd”实际上是有意的。 好吧,如果你仔细阅读了输出的标题,你可以猜到pooled.sd没有被识别,因为它仍然说“用合并的SD测试”但是如果我甚至不打印这个,例如,将输出连接到自编函数时?有可能永远无法识别此错误。

我应该写一些R的开发者,在未来的R版本中,两种拼写变体都应该有效吗?

3 个答案:

答案 0 :(得分:4)

问题不在于p值校正,而在于(声明)方差假设。您在var.equal=T来电中使用了t.test,在pooled.sd=FALSE来电中使用了paired.t.test。但是,paired.t.test的论据是pool.sd,而不是pooled.sd。更改此值会使p值等效于对t.test

的单个调用
pairwise.t.test(df$freq, df$class, p.adjust.method="none", 
                paired=FALSE, pool.sd=FALSE)

答案 1 :(得分:2)

这里没有错。您正在进行不同的测试,因为pairwise.t.test会对p值进行修正 - 以适应您进行多重比较的事实。

(简单地说,如果你进行多次比较,你会增加发现虚假结果的机会。修正可以适应这种情况。)

?pairwise.t.test的帮助会为您指出?p.adjust,您可以在其中找到更多详细信息。

(或者你可以阅读那种绝对智慧的字体:http://en.wikipedia.org/wiki/Multiple_comparisons

答案 2 :(得分:0)

您需要一个单向ANOVA,并在显着结果后进行多重比较。此外,你的数据与它没有配对;例如在一个人内进行预测试,测试后测量,数据在每个人内配对。