多层模型实践 · 第 10 章

方法对比与结论

第 1 章末尾留过一道伏笔:朴素 OLS 给出"小班 +8 分、p≈0p \approx 0"的结论看起来干净利落,但它把 5,786 名学生当成了 5,786 个独立观测。从那以后本书做的所有事,都是在把这个伏笔拆开。第 2 章引入组内相关 ICC,看清同班学生为什么不独立;第 3 章讲清空模型的方差分解;第 4 到第 6 章在 Level-1 与 Level-2 加入协变量与随机斜率;第 7 章用跨层交互检验"小班对低 SES 学生是否有特殊作用";第 8 章把学校层独立出来,跑完整三层模型;第 9 章诊断主模型并做 leave-one-out 敏感性分析。

每一章都给出过一个对应的"小班效应"估计。把这些估计排成一列,能看到一张完整的方法漂移图谱。本章的任务就是把这张图谱铺开,回答几个相互关联的问题——七种方法的小班效应到底差多少,差距来自哪里,哪种模型在这份数据上最合适,最终的结论是什么,读者拿到一份新数据时应该怎么挑模型。

七种方法的终极对比

把本书所有出现过的小班效应估计放在同一张表里。包括两种 OLS(朴素与 + 学生协变量)、两种二层模型(仅 cltype 与 + 学生协变量)、两种三层模型(仅 cltype 与 + 学生协变量)、最后再加一种三层 + 跨层交互,共七种。

表 10·1 全书七种方法的小班效应估计与方差分量

方法small β\betaSE95% CIσsch2\sigma^2_{\text{sch}}σclass2\sigma^2_{\text{class}}σresid2\sigma^2_{\text{resid}}
OLS 朴素8.211.56[5.15, 11.27]——2,264
OLS + 学生协变量8.131.50[5.18, 11.07]——2,104
二层 (1|tch)7.903.75[0.55, 15.26]—6831,597
二层 + 学生协变量7.683.63[0.57, 14.79]—6381,492
三层 (1|sch/tch)8.912.67[3.67, 14.14]3662881,598
三层 + 学生协变量8.842.63[3.68, 14.00]3652831,492
三层 + 跨层交互9.102.98[3.26, 14.94]3652841,492
七种方法的小班效应森林图
七种方法的小班效应森林图。横轴是小班相对常班的数学分数提升;红点是点估计,蓝色误差棒是 95% CI。
不同模型的方差分量分配对比
不同模型的方差分量分配。二层模型把学校层方差并入班级层;三层模型把它独立出来,班级层方差从 638 降到 283。

读这张表的方法是分两步看。先看点估计(small β\beta 列),七种方法给出的小班效应在 7.68 到 9.10 之间漂移,跨度 1.4 分。这个漂移不是统计噪声,而是不同模型对"如何分摊学校层方差"做出的不同决定造成的。OLS 不区分嵌套,把所有学生当独立观测;二层模型承认班级层但忽略学校层,把学校层差异塞进班级层;三层模型把学校层独立出来,让处理变量的方差归位。

再看标准误(SE 列)。OLS 的两种版本 SE 都在 1.5 左右,远小于多层模型的 2.6 到 3.8。这个差距直接决定了 95% CI 的宽度:OLS 的 CI 大约 [5, 11][5,\, 11],二层 CI [0.6, 15][0.6,\, 15],三层 CI [3.7, 14][3.7,\, 14]。OLS 的 CI 最窄,但这种"精确"建立在独立观测假设之上,而该假设在嵌套数据里不成立。多层模型给的 CI 更宽,是诚实承认"5,768 个学生不是 5,768 个独立信息单位"的代价。

为什么二层 CI 反而比三层更宽([0.6, 15][0.6,\, 15] vs [3.7, 14][3.7,\, 14])?因为二层模型把学校层方差塞给班级层,让处理变量的标准误"扛"了更多它本不该扛的方差。三层模型把学校层方差独立出来后,班级层方差从 638 降到 283,处理变量的标准误下降。这是结构正确性带来的精度收益:模型层级越贴合数据真实嵌套,估计越精确。

模型选择:AIC / BIC / LRT

定义模型选择标准
def:model-selection

AIC(Akaike Information Criterion)= −2log⁡L+2k-2 \log L + 2k,BIC(Bayesian Information Criterion)= −2log⁡L+klog⁡n-2 \log L + k \log n,其中 log⁡L\log L 是模型对数似然、kk 是参数个数、nn 是样本量。两者都是"惩罚复杂度"的拟合优度,越小越好。AIC 倾向选择有更好预测能力的模型,BIC 因为惩罚项里有 log⁡n\log n,在大样本下更倾向选择简单模型。

LRT(似然比检验)适用于嵌套模型对比,统计量 χ2=−2(log⁡L0−log⁡L1)\chi^2 = -2(\log L_0 - \log L_1) 在零假设(简化模型成立)下渐近服从 χdf2\chi^2_{df} 分布,dfdf 等于两模型参数差。LRT 给出 pp 值,AIC / BIC 给出排序,三者可以联合判断"加复杂度值不值"。

把第 8 章给出的二层 + 学生协变量与三层 + 学生协变量两个主要候选放在 ML 拟合下做正式对比。

library(tidyverse)
library(lme4)
library(lmerTest)
library(here)

d <- read_csv(here::here("data", "star_k.csv"), show_col_types = FALSE) |>
  filter(!is.na(math), !is.na(cltype), !is.na(tch), !is.na(sch),
         !is.na(sx), !is.na(eth), !is.na(ses)) |>
  mutate(
    sex_F  = ifelse(sx == "F", 1, 0),
    eth_B  = ifelse(eth == "B", 1, 0),
    ses_F  = ifelse(ses == "F", 1, 0),
    cltype = factor(cltype, levels = c("reg", "reg+A", "small"))
  )

# 七种方法
m_ols       <- lm(math ~ cltype, data = d)
m_ols_full  <- lm(math ~ cltype + sex_F + eth_B + ses_F, data = d)
m_2l        <- lmer(math ~ cltype + (1 | tch), data = d, REML = TRUE)
m_2l_full   <- lmer(math ~ cltype + sex_F + eth_B + ses_F + (1 | tch),
                    data = d, REML = TRUE)
m_3l        <- lmer(math ~ cltype + (1 | sch/tch), data = d, REML = TRUE)
m_3l_full   <- lmer(math ~ cltype + sex_F + eth_B + ses_F + (1 | sch/tch),
                    data = d, REML = TRUE)
m_3l_ix     <- lmer(math ~ cltype * ses_F + sex_F + eth_B + (1 | sch/tch),
                    data = d, REML = TRUE)

# AIC / BIC(ML 拟合)
m_2l_full_ml <- update(m_2l_full, REML = FALSE)
m_3l_full_ml <- update(m_3l_full, REML = FALSE)
tibble(
  method = c("二层:+ 学生协变量", "三层:+ 学生协变量"),
  AIC    = c(AIC(m_2l_full_ml), AIC(m_3l_full_ml)),
  BIC    = c(BIC(m_2l_full_ml), BIC(m_3l_full_ml))
)
#  method                   AIC      BIC
#  二层:+ 学生协变量    59218.4  59271.7
#  三层:+ 学生协变量    59129.7  59189.6
结果解读

AIC 从二层的 59,218 降到三层的 59,130,下降 ΔAIC≈89\Delta\mathrm{AIC} \approx 89。BIC 从 59,272 降到 59,190,下降 ΔBIC≈82\Delta\mathrm{BIC} \approx 82。两种准则同向,差距都远超经验门槛 10。结合第 8 章的 LRT χ2=90.68, p<2.2×10−16\chi^2 = 90.68,\, p < 2.2 \times 10^{-16},三种证据一致指向同一结论:在 STAR 数据上,三层模型显著优于二层模型。学校层方差 365 不是噪声,是必须独立成一层的真实结构。

为什么 AIC 与 BIC 在这份数据上判断一致?因为本数据样本量大(5,768),即便 BIC 对复杂度的惩罚比 AIC 重,89 这种量级的对数似然差距也压倒了 log⁡(5,768)−2≈6.66\log(5{,}768) - 2 \approx 6.66 这一笔多估参数的额外惩罚(一个新的 τ2\tau^2 参数)。

雷区BIC 在大样本下也可能误判

BIC 的惩罚项 klog⁡nk \log n 让"加一个参数"在 n=1,000n = 1{,}000 时罚 log⁡1,000=6.9\log 1{,}000 = 6.9,在 n=100,000n = 100{,}000 时罚 log⁡100,000=11.5\log 100{,}000 = 11.5,惩罚力度涨幅平缓。对于真实存在的随机效应(如本数据的学校层方差 365),BIC 在样本量足够大之前仍然可能拒绝复杂模型,把真实结构当噪声。

诊断方法:跑 LRT 看 pp 值。LRT 不依赖样本量惩罚的具体常数,给出的是"这份数据上简化模型为真的概率"。同时看模型残差与 BLUP 的描述统计:如果忽略学校层之后班级层方差离奇膨胀(本数据 638 vs 283),说明有一层方差被错放。AIC 与 BIC 联合看,两者一致才放心;分歧时优先按 LRT 与残差诊断决策,再考虑预测目的(AIC 偏预测)还是解释目的(BIC 偏简单模型)。

本数据三层模型在所有准则下都赢,没有触发这个雷区。

方法选择决策树

多层模型方法选择决策树
多层模型方法选择决策树:从数据有没有嵌套开始,依次回答 ICC 是否值得保留、嵌套层数,再讨论随机斜率与跨层交互的必要性,最后落到一个具体模型并做诊断。本书前九章正是按这条思路逐章展开。

读者读完本书最关心的问题大概是:拿到一份新数据,应该用哪个模型?这件事没有"通用答案",但有一条思路可以顺着走完。

最先要问的是数据是否有嵌套。观测之间没有任何分组结构——纯横截面、独立抽样——朴素 OLS 就够用。如果有嵌套,接下来确定嵌套层数。学生在班级里、班级在学校里是三层;患者在医院里、医院在城市里也是三层;员工在团队里、团队在公司里通常算两层(公司这一层往往要么没数据要么样本太少)。对每一个潜在的高层(班级、学校、医院、公司),跑一个空模型把这一层的 ICC 算出来。ICC 超过 5% 就值得保留这一层;超过 10% 必须保留。

层级确定之后,再决定每一层的随机效应只有截距还是也有斜率。怀疑某个解释变量的效应在不同组间不同时(比如怀疑 SES 的效应在不同班级里不一样),加随机斜率,并用 LRT 检验它。本书第 6 章给的例子是 ses_F 的随机斜率 LRT p=0.46p = 0.46,没有支持,最后没保留。如果怀疑处理效应在某个学生层子群(性别、SES、族裔)上有特别的作用,再用跨层交互检验。本书第 7 章的例子是 cltype ×\times ses_F,交互 p=0.71p = 0.71,没有支持,但跨层交互本身是一种值得检验的可能性。

模型选定之后还有诊断与敏感性分析这一关。残差按层级拆开看 QQ 图,做 leave-one-out 看主结论是不是被少数高层单位绑架。这一步的标准做法是 Snijders & Berkhof 2008 给的分层残差框架。

整条思路对应的是 Hox 在多层建模教材里给出的方法选择策略:先建空模型确定层级,再加 Level-1 固定效应,再加 Level-2 / Level-3 固定效应,再讨论随机斜率与跨层交互,最后做诊断。本书前九章正是按这个顺序展开的。

在 STAR 数据上的最终结论

把本书所有方法收拢到一句结论:在 Tennessee STAR 数据上,从最朴素的 OLS(小班 +8.21 分,SE 1.56)到最复杂的三层 + 跨层交互(+9.10 分,SE 2.98),点估计在 +7.68 到 +9.10 之间漂移,差距主要取决于是否独立估计学校层方差。SE 的差距是关键:朴素 OLS 给出"高度显著"的过分自信结论,二层模型给出标准误膨胀的保守结论,三层模型在两者之间给出最贴合数据真实结构的诚实估计。

最稳妥的最终结论是:将一名 K 年级学生从 22–25 人的常班调进 13–17 人的小班,预期数学分数提升 8.84 分(95% CI [3.68, 14.00][3.68,\, 14.00],p=0.001p = 0.001)。8.84 分相当于 0.18 个标化测试标准差,是教育政策意义上不大但不可忽略的处理效应。区间下限 3.68 分意味着即使在最不乐观的情况下,这个效应也比零有相当距离。

回到第 1 章给的伏笔。"小班 +8 分"这个朴素结论作为方向是对的,作为推断却是有问题的。本书做的事就是让"+8 分"这个方向稳稳落在一个有诚实标准误的估计上。处理变量在班级层变化,估计这个效应必须考虑学生在班级里的相关性;而学校层在 STAR 数据里贡献了 17% 的总方差,必须独立成一层。把这两件事都做到,才得到 +8.84 分(SE 2.63)这个最终数字。

把多层建模工作流搬到新数据

读完十章,读者已经走过一份完整的多层建模流程:从看见嵌套结构、识别 ICC、跑空模型、加 Level-1 与 Level-2 固定效应、引入随机斜率与跨层交互、扩展到三层、做诊断与敏感性分析、最后做方法对比。这不是教材里的"方法清单",是一份可以直接搬到自己数据上的工作流。

把这份工作流搬到新数据时有几件事要记住。先画嵌套层级图,把数据里的"学生在哪、班级在哪、学校在哪"在纸上画清楚,再写代码。先跑空模型算 ICC,决定哪几层值得保留。把模型逐步建复杂,每加一个固定效应或随机效应都做一次 LRT 与残差诊断,避免一上来就把所有变量塞进最复杂的模型里。把每一步的估计摆出来对比,让读者(包括自己)看到"加这一项之后小班效应变成了什么样"。

最后一件事是 STAR 数据本身告诉我们的。这份数据来自 1985 到 1989 年的田纳西州,26,796 条观测里包含了 11,598 名学生四年的成长。它不是模拟数据、不是教学示例,是 1,200 万美元真实政策实验留下来的遗产。本书每一章给出的数字都是这份数据在 R 里的真实输出。把"小班 +8.84 分"这个数字写进本书的最后一章,意味着它经得起朴素 OLS、二层 lmer、三层 lmer、随机斜率检验、跨层交互检验、模型诊断、影响分析七道检验。这个数字现在交给读者,去回答你自己手上那份嵌套数据的处理效应问题。