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) 检验的是每对差值的均值,它消除了个体之间的差异,通常比把两组当作独立样本的检验功效高得多。