本节摘要:推断统计回答"样本上的差异能不能推广到总体"。本节走完假设检验全流程:设置原假设、理解标准误与 t 统计量、配对与独立设计的分岔、读解 t.test 输出,最后用"效应量加置信区间"的格式写下结案陈述。
10 个人、两药、平均差 1.58 小时。这个差是信号,但样本有随机波动(噪声)。t 统计量的本质就是一个比值:
t =(观测到的均值差)÷(这种差异纯粹由抽样运气造成的典型幅度)
分母的名字叫标准误。它与标准差的区别是全章最重要的概念分界:标准差描述样本内部的分散;标准误描述"重复抽样时统计量本身的波动"。样本量翻四倍,标准误减半——这就是为什么大样本能把小差异检验出来。
sleep 数据的 10 名受试者每人各试两药——这是配对设计,同一个人的两次观测天然可比,检验对象是"每人前后之差":
# 配对 t 检验:paired 参数是关键 t.test(extra ~ group, data = sleep, paired = TRUE)
输出要点逐行读:
mean of the differences: 1.58 # 效应量:平均差 1.58 小时 t = 4.0621, df = 9 # 信号噪声比 4.06,配对后自由度 9 p-value = 0.002833 # 若两药等效,见到此差异的概率约千分之三 95 percent confidence interval: # 真实差异的合理范围 0.8997642 2.2617425
若误用独立样本检验(paired 缺省为 FALSE),把同一个人的两次观测当两个没关系的样本,个体差异被算进噪声,t 值缩水、p 值变大——设计认错,证据强度白打折。这正是分岔的代价。
# 对照:误当独立样本的后果 t.test(extra ~ group, data = sleep) # t 明显变小,p 变大
结案:两药睡眠增量差 1.58 小时(配对 t 检验,t 等于 4.06,自由度 9,p 约 0.003),95% 置信区间 0.90 至 2.26 小时,不含零。结论:药物效果差异有统计学意义,且幅度在 1 至 2 小时量级。
三个要素一个不能少:统计量加 p 值(证据强度)、效应量(差异多大)、置信区间(不确定性范围)。只报"p 小于 0.05,显著"是残缺的结案词。
⚠️ 常见坑:把"p 等于 0.06"读成"无效"。p 值偏大只说明证据不足以拒绝原假设,不证明两药等效;同理 p 极小也不代表差异在业务上重要——一百万样本能把 0.01 小时的差异也检验"显著"。统计显著与实践重要是两码事。
t.test 一行出结果,但"信号除以噪声"到底怎么算,值得亲手拆一次。配对设计的对象是每人的前后差:
# 第一步:构造配对差——同一受试者的两次观测相减 wide <- data.frame( drug1 = sleep$extra[sleep$group == 1], drug2 = sleep$extra[sleep$group == 2] ) wide$diff <- wide$drug2 - wide$drug1 # 第二步:三个零件 d_bar <- mean(wide$diff) # 平均差(信号) s_d <- sd(wide$diff) # 差值的标准差 n <- nrow(wide) # 配对数 se <- s_d / sqrt(n) # 标准误(噪声) # 第三步:组装 t 并与 t.test 对照 t_manual <- d_bar / se t_manual # 约 4.06 t.test(wide$diff)$statistic # 一样——黑箱拆开就是这样
看清三件事:配对检验的自由度是 9(对子数减一),不是 18;标准误随样本量平方根收缩,10 对变 40 对,噪声减半;t.test 里那个默认区间 95% 对应着 t 分布双侧 0.025 分位点,换成 conf.level = 0.99 区间会放宽。
t 检验的前提是"差值近似正态"。小样本下这个前提需要检查,不满足时换非参数检验:
# 正态性检查:直方图加 Shapiro 检验 hist(wide$diff) shapiro.test(wide$diff) # p 大于 0.05 → 不拒绝正态假设,t 检验可用 # 备胎:Wilcoxon 符号秩检验,不要求正态 wilcox.test(wide$diff)
Wilcoxon 对的是"差值的中位数是否为零",报告时要相应改口。选择顺序是规矩:设计定方法(配对 对 独立),分布定家族(参数 对 非参数),顺序不能倒。
如果同一样本上连做二十次检验,即使全无真实差异,也几乎必然撞出一两个"显著"。这就是多重比较问题,处方是校正:
p_raw <- c(0.012, 0.031, 0.048, 0.20, 0.33) # 五个问题各检一次 p.adjust(p_raw, method = "bonferroni") # 阈值除以 5,从严 p.adjust(p_raw, method = "BH") # 控错误发现率,较温和
原始 p 值 0.012 经 Bonferroni 校正后变 0.06,不再显著——结论当场改写。凡是"一口气检验很多组"的场景(第 2 章 32 组生还率对比若要逐一检验就会撞上),必须带着校正读结果。
再补一条与上一章的呼应:可视化负责"看见差异",检验负责"给差异定罪",两者顺序不可颠倒——先看图再检验,图会告诉你该检验什么(组差?趋势?);只检验不看图,前提被违反了都浑然不觉。本章与第 4 章合起来,才是一套完整的定量推理装备。