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

5

我尝试在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")

正如我在之前的帖子中所读到的,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 更加方便,因为我不需要创建所有的子集,可以直接在原始数据框上运行。
pairwise.t.test(df$freq, df$class, p.adjust.method="none", paired=FALSE, pooled.sd=FALSE)

然而,我在这里得到不同的结果,最明显的是比较结束与词干.second:使用 t.test 得出 p=0.7,使用 pairwise.t.test 得出 p=0.1。
出了什么问题?我做错了什么吗?
虽然问题本身已经解决,但我认为它发生的原因让我有点偏执(不再信任自己):
仅仅因为打错了 pooled.sd 而不是 pool.sd,我得不到我期望的结果。难道这不容易出错吗?
在许多其他情况下,您可以输入变体,例如 bonfbonferronifa()factor() 等等。但是,在这里,pooled.sd 完全被忽略了,尽管实际上是想要 "pooled sd"。
好吧,如果您仔细阅读输出的标题,您就可以猜到 pooled.sd 没有被识别,因为它仍然说 "t tests with pooled SD",但是如果我甚至不打印它,例如当将输出导入自编写的函数时,会发生什么呢?有可能这个错误永远不会被发现。
我应该写信给 R 的一些开发者,在将来的版本中,这两个拼写变体都应该是有效的吗?
3个回答

6
问题不在于p值校正,而在于(声明)方差假设。您在t.test调用中使用了var.equal=T,并在pairwise.t.test调用中使用了pooled.sd=FALSE。然而,pairwise.t.test的参数是pool.sd而不是pooled.sd。更改此参数将给出与单独调用t.test相当的p值。
pairwise.t.test(df$freq, df$class, p.adjust.method="none", 
                paired=FALSE, pool.sd=FALSE)

非常感谢,问题已解决。我错误地输入了 pooled.sd 而不是 pool.sd。 - absurd

2
这里没有问题。您正在进行不同的测试,因为pairwise.t.test对p值进行了校正-以调整您进行多次比较的事实。
简单地说,如果您进行多次比较,则增加了发现虚假结果的可能性。校正可以解决这个问题。 ?pairwise.t.test的帮助将指向?p.adjust,在那里您可以找到更多详细信息。
(或者您可以阅读那个无误智慧的字体:http://en.wikipedia.org/wiki/Multiple_comparisons

4
我知道这一点。但我之前认为使用pairwise.t.test函数,并选择选项p.adjust.method="none",可以确切地抑制任何校正。那么这里的“none”不是真正的“none”吗?如果我对t.test结果的p值应用p.adjust并使用method="none",那么“none”确实意味着“none”:什么也不会改变。 - absurd

1
您需要进行一元方差分析,并在显著结果后进行多重比较程序。此外,您的数据可能没有配对,例如单个人员内的预测试、后测试测量,数据在每个人员内是配对的。

抱歉,我不明白你的意思。难道单向方差分析比较两个类别(例如结束 vs 第二)不就相当于做t检验吗?实际上,这些数据是某种语法类别(class)的单词,它们在使用频率(freq)上有所不同。频率测量值来自预先构建的语料库。 - absurd
是的,你说得对,两组的方差分析与汇总的双样本 t 检验相同。看起来你正在进行所有成对比较的 t 检验,这可能会导致测试的错误率膨胀,但这可能对你的应用程序没有影响。为了控制误差率,进行方差分析,然后如果是显著的,则使用多重比较过程,例如 Tukey 最小显著差来比较均值对。仅当数据点存在自然配对时才应使用配对 t 检验,扩展的配对 t 检验将是带有块的方差分析。 - user1521694

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接