【问题标题】:R: t.test and pairwise.t.test give different results?R:t.test 和pairwise.t.test 给出不同的结果?
【发布时间】:2012-07-12 08:41:05
【问题描述】:

我尝试对以下数据框使用 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-function 和pairwise.t.test-function。

为了使用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)

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

这里有什么问题?我在哪里做过某事。错了吗?


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

在许多其他情况下,您可以键入变体,例如bonfbonferronifa()factor() 等等。但是这里pooled.sd 被完全忽略了,尽管实际上是“pooled sd”。 好的,如果您仔细阅读了输出的标题,您可能会猜到 pooled.sd 未被识别,因为它仍然显示“使用池 SD 进行 t 测试”,但如果我什至不打印它怎么办,例如将输出管道传输到自写函数时?有可能永远无法识别此错误。

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

【问题讨论】:

    标签: r


    【解决方案1】:

    问题不在于 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。
    【解决方案2】:

    在获得显着结果后,您需要一个带有多重比较过程的单因素方差分析。此外,您的数据可能没有配对;例如在一个人内进行的测试前、测试后测量,数据在每个人内配对。

    【讨论】:

    • 对不起,我不明白你的意思。比较两个类别(例如结束与第二个)的单向方差分析与进行 t 检验是否相同?数据实际上是使用频率(freq)不同的某个语法类别(class)的词。频率测量来自预建的语料库。
    • 是的,你是对的,两组的 ANOVA 与合并的两样本 t 检验相同。看起来您正在对 t 检验进行所有成对比较,这可能导致测试错误率的膨胀,但这对您的应用程序可能无关紧要。为了控制误差率,执行方差分析,然后如果显着,则使用多重比较程序(例如 Tukey 最小显着性差异)来比较均值对。只有在数据点存在自然配对时才应使用配对 t 检验,配对 t 检验的扩展将是带有块的 ANOVA
    【解决方案3】:

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

    (简而言之,如果您进行多重比较,则会增加发现虚假结果的机会。对此进行调整。)

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

    (或者你也可以读一读那无懈可击的智慧字体:http://en.wikipedia.org/wiki/Multiple_comparisons

    【讨论】:

    • 我知道这一点。但我认为使用选项p.adjust.method="none" 调用pairwise.t.test 会精确地抑制任何更正。所以“无”在这里不代表“无”吗?如果我将p.adjustmethod="none" 应用于我的t.test 结果的p 值,“无”实际上意味着“无”:什么都没有改变。
    猜你喜欢
    • 2020-08-24
    • 2021-09-25
    • 2023-03-30
    • 1970-01-01
    • 2011-04-03
    • 2015-08-26
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多