Menu

R 语言 t 检验:单样本、双样本和配对 t.test()

用 t.test() 做单样本、双样本和配对 t 检验,更重要的是读懂输出的每一行:t 值、自由度、p 值和置信区间。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

t 检验在问什么

所有 t 检验回答的都是同一个根本问题:均值之间的这个差异是真实的,还是只是随机波动?样本总会波动:把十个人的反应时间测两次,即使什么都没变,你也会得到两个不同的平均值。t 检验把你观察到的差异和随机波动预期的幅度相比较,并告诉你:如果真实差异为零,你的数据会有多出人意料。

三种类型,一个函数:

  • 单样本:这一组的均值和某个固定值不同吗?
  • 双样本:这两个独立组的均值不同吗?
  • 配对:同一批对象在两次测量之间有变化吗?

单样本:t.test(x, mu = ...)

假设某个流程的平均耗时应为 5.0 秒,你记录了十次运行的时间:

样本均值是 5.61,但只有十次运行,比目标高出 0.61 有意义吗,还是在正常波动范围之内?输出回答的正是这个问题。

逐行读懂输出

这一节最有价值:每种 t.test() 的输出格式都一样,所以学会读一次就够了。运行上面的代码块,对照每一行:

  • t = 4.26:检验统计量,即观察到的差异(5.61 − 5 = 0.61)除以均值的标准误(约 0.143)。它表明样本均值距离假设值四个多标准误。|t| 越大,在原假设下就越出人意料。
  • df = 9:自由度,这里是 n − 1。自由度小意味着样本小,检验就需要更大的 t 才会认可差异。
  • p-value ≈ 0.002:如果真实均值确实是 5,抽到一个均值离 5 至少这么远(无论哪个方向)的样本,概率约为 0.2%。这就是它的全部含义。它不是真实均值为 5 的概率,p 值小也不能证明你偏爱的解释,它只是说“很难归因于偶然”。按常用的 0.05 阈值,这里应拒绝原假设。
  • alternative hypothesis:重述“拒绝”意味着什么。not equal to 5 确认这是双侧检验。
  • 95 percent confidence interval: 5.29 to 5.93:与数据相容的真实均值范围。注意 5 在区间之外,这和 p < 0.05 是同一个结论,只是用数据本身的单位来表述,而且它还告诉你效应可能有多大,这是 p 值永远做不到的。
  • sample estimates:观察到的均值,让读者能看到被检验的原始事实。

如果需要在程序中取用各个部分:result <- t.test(times, mu = 5),然后用 result$p.value、result$conf.int、result$estimate。

双样本:比较独立的两组

对于两个独立组,公式写法读起来就像问题本身。ToothGrowth 记录了豚鼠在以橙汁(OJ)或抗坏血酸(VC)形式摄入维生素 C 后的牙齿生长情况:

把它读作“按 supp 分组检验 len”。现在输出显示两个样本估计值(每组的均值,约 20.7 对 17.0),置信区间针对的是两者之间的差异。这里 p ≈ 0.061,区间约为 −0.17 至 7.57:它跨过了零,所以在 0.05 水平下你无法排除“没有差异”。不过区间一直延伸到 +7.6,也提醒你不要断言差异不存在。“不显著”的意思是没有被证明,而不是被证明不存在。

默认是 Welch,这是好事

看输出的标题:Welch Two Sample t-test,自由度是小数(约 55.3)。经典的 Student t 检验假设两组方差相等;Welch 版本去掉了这个假设,并调整自由度来弥补。方差确实相等时,Welch 给出的结果基本相同;方差不等时,Student 检验可能严重失准,而 Welch 依然可靠。所以 R 的默认值是稳妥的选择,很少有理由去改它。

“先检验方差是否相等,再选择检验方法”的老套路已经过时了,直接用 Welch 就好。

配对:前后对比

当两次测量来自同一批对象时,两组就不是独立的,把它们当作独立样本会浪费检验的功效。下面是八个人参加培训课程前后的分数:

paired = TRUE 检验的是每个人前后差值的均值(这里平均提高 2.75 分,p ≈ 0.001)。为什么配对能改变一切:人与人之间的差异远大于培训给任何人带来的变化,从 65 到 80 的个体差异,在非配对检验中会淹没 2 到 3 分的提升。求差值会减去每个人的基线,只留下变化本身。规则是:如果数据天然具有“同一单位测量两次”的结构,就做配对。(反过来,当两组确实相互独立时,绝不要用 paired = TRUE,那样的配对是虚构的。)

单侧检验:谨慎使用

默认情况下检验是双侧的:任一方向的差异都算作证据。如果在看到数据之前,你的假设只在一个方向上才有意义,就可以这样指定:

与双侧检验相比,p 值减半,这正是诱惑所在:偷看数据之后再改成单侧检验就是 p 值操纵(p-hacking)。只有在方向确实是事先确定的情况下,才使用 alternative = "greater" 或 "less";拿不准时,坚持用双侧检验。

前提假设与备选方法

t 检验假设观测值相互独立,并且样本均值近似服从正态分布。当数据本身大致正态,或者样本足够大时,这个条件就成立(中心极限定理起了主要作用;每组 n ≈ 30 以上时,中等程度的非正态完全不是问题)。用一个简单的直方图或箱线图检查分布形状即可。至于独立性,任何检验都救不了它,它取决于数据是如何收集的。

对于数据明显偏斜或有极端离群值的小样本,标准的非参数备选方法只需一行:wilcox.test(len ~ supp, data = ToothGrowth),它通过秩而不是均值来比较分布。

本节要点

  • 单样本用 t.test(x, mu = ),双样本用 t.test(y ~ group, data = ),前后对比用 paired = TRUE。
  • p 值的含义是“如果真实差异为零,这样的数据有多出人意料”,仅此而已;置信区间则用实际单位告诉你效应可能有多大。
  • R 的双样本默认是 Welch 检验(自由度为小数),保留它就好。
  • 配对能消除个体之间的噪声;只要同一单位测量了两次,就用配对。
  • 只有事先确定了方向才使用单侧检验;wilcox.test() 是基于秩的备选方法。

下一节:一次比较三组或更多组的均值,即用 aov() 做方差分析(ANOVA)。

常见问题

R 中如何做 t 检验?

用 t.test()。单个样本与固定值比较:t.test(x, mu = 5)。两个独立组:t.test(value ~ group, data = df)。同一批对象的前后测量:t.test(after, before, paired = TRUE)。

R 中 t 检验的 p 值怎么解读?

它是在真实差异为零的前提下,观察到至少和你的结果一样大的差异的概率。p 值很小(惯例是低于 0.05)说明数据很难用随机波动来解释,于是你拒绝原假设。它不是原假设为真的概率,也说明不了差异有多大、有多重要,这些要看置信区间。

为什么 R 默认报告 Welch t 检验?

R 的双样本 t.test() 默认使用 Welch 版本,它不假设两组方差相等,所以自由度会是小数。方差相等时,Welch 检验与经典的 Student t 检验结果几乎一样;方差不等时,它更可靠,所以默认值就是正确的选择。只有课程作业明确要求经典的合并方差检验时,才使用 var.equal = TRUE。

R 中什么时候该用配对 t 检验?

当两组测量值天然成对时:同一对象的前后测量,或同一物品用两种方法评分。t.test(after, before, paired = TRUE) 检验的是每对差值的均值,它消除了个体之间的差异,通常比把两组当作独立样本的检验功效高得多。

Coddy 编程语言插图

和 Coddy 一起学编程

开始