1. 项目概述:为什么非得用 GLMM 而不是硬套线性模型?

你手头有一批动物采食量数据,每头牛每天吃多少公斤饲料,重复测了5天,分属4个不同饲养组,还嵌套在3个牧场里。你打开 SAS,习惯性敲下 PROC MIXED ,跑完一看——p 值全小于 0.001,LSMEANS 差异巨大,心里一喜。结果导师扫了一眼残差图就摇头:“这数据明显右偏,零值一堆,方差随均值增大,你拿正态分布去拟合,结论再‘显著’也是空中楼阁。”

这就是我第一次被 GLMM 教做人的真实场景。 Generalized Linear Mixed Models(广义线性混合模型) ,不是什么高不可攀的理论玩具,而是当你面对真实世界数据时,绕不开的一道实操门槛。它解决的核心问题非常朴素: 当你的响应变量(response variable)根本不符合正态分布时,如何还能做带随机效应的统计推断?

关键词“Distribution”在这里不是抽象概念,而是你建模前必须亲手摸清的“数据底色”。你不能假装没看见——那堆计数数据(比如每只鸡产蛋数)、那组比例数据(比如仔猪成活率)、那批时间数据(比如奶牛首次发情间隔天数),它们各自服从的分布规律,直接决定了你模型的骨架是否站得稳。SAS 里 PROC GLIMMIX 就是专为这事设计的工具,它把三块关键拼图严丝合缝地拧在一起: 固定效应(系统性规律)+ 随机效应(结构性变异)+ 分布族与连接函数(数据本质)

很多人误以为 GLMM 是“高级版 MIXED”,其实它是“换血式重构”。 PROC MIXED 只认正态分布,它的残差必须独立同分布于 N(0, σ²),这是铁律;而 GLIMMIX 则像一个精通多国语言的翻译官,它不强求原始数据长什么样,而是先用 link function(连接函数)把数据“翻译”到一个线性可加的尺度上建模,再用 distribution(分布族)告诉模型:“这个‘翻译稿’的误差该服从什么规律”。比如二项分布数据用 logit 连接,泊松数据用 log 连接,对数正态数据用 identity 连接……这些选择背后,全是数据生成机制的物理/生物/工程逻辑。

这篇文章不是讲教科书定义,而是我过去八年在农业试验、临床随访、工业质检等十多个真实项目中,踩过坑、调过参、被审稿人追问过三次才搞明白的实操手册。它适合两类人:一是刚被导师或老板扔进一堆非正态数据里的新手,急需知道“第一步到底该敲哪行代码”;二是已会用 GLIMMIX 但总在审稿意见里被问“为何选负二项而非泊松”的老手,需要补上分布选择背后的决策树。全文没有一句空话,每个参数、每张图、每个警告,都来自我电脑里那个命名为 glmm_troubleshooting.sas 的文件夹。

2. 核心原理拆解:固定效应、随机效应与分布族的三角关系

2.1 为什么必须区分“系统部分”和“随机部分”?——从实验设计源头说起

所有统计模型的根基,都源于你如何设计实验。这不是统计学的玄学,而是你对现实世界的诚实交代。假设你在研究一种新型饲料添加剂对肉鸡增重的影响。你设置了4个处理组(对照、低剂量、中剂量、高剂量),但不可能把1000只鸡全关在一个鸡舍里——它们必然分养在8个不同的鸡舍中,每个鸡舍又属于2个不同养殖场。这时,“处理组”是你主动操控的、想检验其效应的 固定效应(Fixed Effect) ;而“鸡舍”和“养殖场”是你无法控制、但又实实在在影响增重的 随机效应(Random Effect)

PROC MIXED GLIMMIX 的核心差异,就藏在这个“随机”二字里。 MIXED 假设所有随机效应带来的变异,最终都归结为正态分布的残差项 ε ~ N(0, σ²);而 GLIMMIX 则承认: 随机效应本身就有自己的分布规律,且这种规律必须与响应变量的分布匹配 。比如,你记录的是每笼鸡的死亡率(0~1之间的比例),那么“鸡舍间死亡率的变异”就不能简单当成正态噪声——它天然受限于[0,1]区间,其方差必然与均值相关(均值越接近0或1,方差越小)。若强行用 MIXED ,你等于在说:“鸡舍间的差异,可以是-0.3或1.2”,这显然违背生物学常识。

这就是为什么 GLIMMIX 的模型公式写作:
g(μᵢⱼ) = Xᵢⱼβ + Zᵢⱼuⱼ + εᵢⱼ
其中:

  • g(·) 是连接函数(link function),负责把期望值 μᵢⱼ “拉直”成线性形式;
  • Xᵢⱼβ 是固定效应部分(如处理组、性别、初始体重);
  • Zᵢⱼuⱼ 是随机效应部分(如鸡舍、养殖场),uⱼ ~ N(0, G);
  • εᵢⱼ 是残差项,但它 不再独立存在 ,而是被吸收到分布族的方差结构中(如二项分布的方差 = μ(1-μ)/n)。

提示: GLIMMIX 中的 residual 语句并非传统意义的残差,而是为某些特殊方差结构(如空间自相关)显式建模的工具。绝大多数情况下,你不需要它——随机效应和分布族已共同定义了全部变异来源。

2.2 分布族(Distribution)不是选项,而是数据DNA的解读密码

“Distribution”这个词在 GLIMMIX 里绝非菜单里的一个下拉框。它是你对数据生成机制(data-generating process)的郑重声明。选错分布,就像用温度计去量湿度——读数再精确,答案也毫无意义。下面这张表,是我贴在工位旁、被咖啡渍浸染过三次的速查卡,按响应变量类型分类:

响应变量类型 典型场景 推荐分布(DIST=) 关键特征 为何不能用正态?
连续正值,右偏,方差随均值增大 动物日增重(kg)、血液激素浓度(ng/mL)、故障间隔时间(小时) LOGNORMAL 对数变换后服从正态;方差 ∝ 均值² 原始数据含大量零值或极小值,正态拟合强制产生负预测值
计数数据(整数≥0) 每只猪的腹泻次数、每公顷的害虫数量、每批次的缺陷产品数 POISSON NEGBIN 方差 = 均值(泊松);方差 > 均值(负二项) 正态分布允许负值,且无法捕捉“零膨胀”(zero-inflation)现象
二分类/比例数据 仔猪成活(是/否)、疫苗保护率(%)、产品合格率(%) BINOMIAL 方差 = μ(1-μ)/n;受试验单元数 n 约束 正态分布的方差恒定,而比例数据的方差在均值=0.5时最大,两端趋近于0
有序分类数据 疾病严重程度(1-5级)、消费者满意度(1-7分) MULTINOMIAL (需指定 LINK=CUMLOGIT 相邻等级间无固定距离;累积概率建模 正态分布假设等级间距离相等,违背序数本质

这里的关键洞察是: 分布的选择,本质上是在回答“数据的不确定性由什么决定?”

  • 对于正态分布,不确定性(方差)是独立于均值的常数 σ²;
  • 对于泊松分布,不确定性(方差)完全由均值 λ 决定(Var = λ);
  • 对于二项分布,不确定性由均值 π 和试验次数 n 共同决定(Var = π(1-π)/n)。

注意: DIST= 选项必须与 LINK= 选项协同工作。例如, DIST=POISSON LINK=LOG 是黄金组合,因为 log 连接保证了线性预测器 η = Xβ 的指数变换 exp(η) 恒为正值,完美匹配计数数据的定义域。而 DIST=POISSON LINK=IDENTITY 则可能让模型尝试预测负的计数值,导致收敛失败。

2.3 连接函数(Link Function):在“模型尺度”与“数据尺度”之间架桥

很多初学者卡在 LINK= 选项上,觉得它只是个数学技巧。其实,连接函数是你和模型之间的“翻译协议”。它定义了两个世界:

  • 模型尺度(Model Scale) :线性预测器 η = Xβ + Zu 的取值域,这里是所有实数 ℝ,模型在此尺度上进行线性运算和推断;
  • 数据尺度(Data Scale) :响应变量 Y 的实际取值域,如 [0,∞)、[0,1]、{0,1,2,…},这是你观测和解释的世界。

连接函数 g(·) 的作用,就是建立映射: η = g(μ) ,其中 μ = E(Y)。而 ILINK 选项,则是反向翻译: μ = g⁻¹(η)

以二项分布为例,最常用的 LINK=LOGIT 定义为:
logit(π) = log(π/(1-π)) = η
这意味着:

  • 当 η = 0 时,π = 0.5;
  • 当 η = 2 时,π ≈ 0.88;
  • 当 η = -2 时,π ≈ 0.12。

这个映射的妙处在于:它把受限于 [0,1] 的 π,扩展到了整个实数轴,使得线性模型可以自由拟合。但代价是—— 你不能直接对 η 的差值做解释 。例如,处理组A的 η̂₁ = 1.5,处理组B的 η̂₂ = 0.8,差值 Δη = 0.7。这个 0.7 在模型尺度上是线性的,但在数据尺度上,它对应的是 优势比(Odds Ratio)= exp(0.7) ≈ 2.01 ,即A组的成功几率是B组的2倍。

实操心得:永远用 ODDSRATIO 语句或 ESTIMATE 语句配合 ILINK 选项来获取数据尺度上的解释。直接报告 ESTIMATE 语句输出的 η̂ 差值,是审稿人最常挑刺的点之一。我曾因在一篇关于疫苗效力的论文中直接报告 logit 差值,被要求重做全部分析——因为临床医生只关心“保护率提高多少个百分点”,而不是“logit单位变化多少”。

3. 实操全流程:从数据诊断到模型输出的完整闭环

3.1 第一步:数据诊断——不做这三步,建模就是赌博

在敲下第一个 PROC GLIMMIX 之前,我强制自己完成以下三步诊断。跳过任何一步,后续90%的问题都源于此。

步骤1:可视化响应变量分布

/* 用 SGPLOT 快速看形态 */
proc sgplot data=your_data;
  histogram y / binwidth=0.5;
  density y / type=normal;
  xaxis label="Daily Feed Intake (kg)";
run;

重点观察:

  • 是否有大量零值?→ 暗示零膨胀(Zero-Inflation),需考虑 DIST=ZIP DIST=ZINB
  • 是否右偏且长尾?→ 倾向 LOGNORMAL GAMMA
  • 是否为整数且集中在小值?→ POISSON 候选。

步骤2:检查均值-方差关系
这是诊断过离散(Overdispersion)的金标准。对分组数据(如按处理组),计算每组的均值和方差:

proc means data=your_data noprint;
  class treatment;
  var y;
  output out=mv_stats mean=mean_y var=var_y;
run;

proc sgplot data=mv_stats;
  scatter x=mean_y y=var_y;
  lineparm x=0 y=0 slope=1 / lineattrs=(color=red); /* 泊松线:var=mean */
  xaxis label="Mean";
  yaxis label="Variance";
run;
  • 若点大致落在红线上 → 泊松分布合理;
  • 若点明显高于红线 → 过离散,需 DIST=NEGBIN
  • 若点明显低于红线 → 欠离散(Underdispersion),较罕见,可尝试 DIST=BETA (对比例数据)。

步骤3:残差诊断(仅作参考,非决定性)
虽然 GLIMMIX 的残差图不能像 MIXED 那样直接用于模型选择,但它能暴露严重错误:

proc glimmix data=your_data plots(only)=studentpanel;
  class treatment pen;
  model y(event='1') = treatment / dist=binomial link=logit solution;
  random intercept / subject=pen;
  output out=resid_out student=resid;
quit;

proc sgplot data=resid_out;
  histogram resid;
  density resid / type=normal;
run;
  • 若学生化残差严重偏离正态 → 模型设定有根本错误(如遗漏关键协变量、随机效应结构不当);
  • 若残差呈现明显模式(如漏斗形)→ 方差结构未被正确建模。

提示:我从不依赖单张残差图做决策。它只是一个“警报器”,响了说明要回头检查前两步;不响也不代表模型完美——毕竟, GLIMMIX 的残差定义本身就不同于线性模型。

3.2 第二步:模型构建—— PROC GLIMMIX 的核心语法与避坑指南

下面是一个处理“仔猪成活率”的完整 GLIMMIX 代码,包含所有关键要素和注释:

/* 数据准备:y 为成活仔猪数,n 为总产仔数,构成二项分布 */
data piglet_survival;
  set raw_data;
  /* 确保 y <= n,否则 PROC GLIMMIX 会报错 */
  if y > n then y = n;
run;

/* 主模型:二项分布 + logit 连接 */
proc glimmix data=piglet_survival 
             method=laplace    /* 关键!用 Laplace 近似 ML,为后续 overdispersion 检验铺路 */
             plots(only)=(effectpanel residualpanel);
  class treatment farm pen;
  
  /* 模型语句:y/n 表示成功次数/总次数 */
  model y/n = treatment age_sow parity / 
              dist=binomial 
              link=logit 
              solution 
              oddsratio;  /* 自动计算各处理组 vs 参照组的 OR */
  
  /* 随机效应:pen 嵌套在 farm 下,模拟圈舍内相关性 */
  random intercept / subject=farm;
  random intercept / subject=pen(farm);  /* 注意嵌套写法:pen(farm) */
  
  /* 估计边际均值(LSMEANS)并进行多重比较 */
  lsmeans treatment / ilink cl diff oddsratio;
  
  /* 输出关键诊断指标 */
  ods output ParameterEstimates=pe 
                 CovParms=covp 
                 FitStatistics=fitstats;
quit;

关键参数详解与避坑点:

  • METHOD= 选项 METHOD=RSPL (默认)是伪似然,速度快但对 overdispersion 不敏感; METHOD=LAPLACE METHOD=QUAD 是真正的最大似然近似,是计算 Pearson Chi-Square/DF 的前提。但注意: QUAD 方法在有复杂随机效应时可能不收敛, LAPLACE 是更稳健的选择。
  • SUBJECT= 的嵌套写法 pen(farm) 明确告诉 SAS “pen 是 farm 的子集”,这比 subject=farm*pen 更符合统计学含义,且避免了不必要的参数估计。
  • ILINK LSMEANS 中的作用 lsmeans treatment / ilink 输出的是成活率(如 0.85),而非 logit 值(如 1.73); diff 选项则自动计算成活率差值(如 0.85 - 0.72 = 0.13),但需注意: 这个差值是数据尺度上的,其标准误是通过 Delta 方法近似的,不是直接从模型中估计的
  • ODDSRATIO 语句 :它比手动计算 exp(estimate) 更可靠,因为它使用了正确的协方差矩阵,并能处理复杂的对比(如 oddsratio treatment('A' 'B') )。

3.3 第三步:模型评估与比较——信息准则与诊断统计量的实战解读

GLIMMIX 输出的 FitStatistics 表是你的决策中心。不要只盯着 AIC,要综合看:

统计量 符号 合理范围 解读 我的实操经验
Pearson Chi-Square / DF 0.5–1.5 衡量 over/underdispersion 若为 3.2,说明方差被低估约3倍,p值会严重膨胀;此时必须换 DIST=NEGBIN 或增加随机效应
AIC AIC 越小越好 模型拟合优度与复杂度的权衡 AIC 差值 <2:模型无实质差异;>10:差异显著。但我更信 PEARSON CHI-SQUARE/DF ,因为 AIC 对分布误设不敏感
-2 Res Log Pseudo-Likelihood 越小越好 伪似然下的模型拟合度 仅用于同分布、同连接函数的模型比较;跨分布比较无意义
Covariance Parameter Estimates CovP 方差分量 >0 随机效应的贡献大小 farm 的方差估计为 0.001(远小于处理效应的标准误),说明农场间差异可忽略,可简化模型

案例:如何用 PEARSON CHI-SQUARE/DF 救回一个烂模型
我在分析某饲料公司12个批次的霉菌毒素检测数据(单位:ppb)时,初始模型 DIST=GAUSSIAN LINK=IDENTITY PEARSON CHI-SQUARE/DF = 8.7 。这意味着模型认为的变异只有真实变异的1/8!我立刻切换到 DIST=LOGNORMAL LINK=IDENTITY (因数据右偏严重),结果 PEARSON CHI-SQUARE/DF = 1.03 ,完美。LSMEANS 的标准误从 0.15 涨到 0.42,原先“显著”的处理差异消失了——这才是真实世界的声音。

实操心得:永远把 PEARSON CHI-SQUARE/DF 放在 FitStatistics 表的第一位去看。它比任何 p 值都更能反映模型的根本健康状况。我有个不成文规矩: PEARSON CHI-SQUARE/DF 超出 [0.8, 1.2] 就必须重新审视分布和连接函数。

3.4 第四步:结果解释——从模型尺度到业务尺度的精准翻译

GLIMMIX 的输出表里, ParameterEstimates 表的 Estimate 列是模型尺度(logit、log 等)的值,而业务人员(兽医、产品经理、生产主管)只认数据尺度(百分比、倍数、绝对差值)。我的翻译流程如下:

Step 1:获取数据尺度上的均值(LSMEANS)

lsmeans treatment / ilink cl;

输出示例:

Treatment Estimate Standard Error 95% Confidence Limits
Control 0.72 0.03 0.66 – 0.77
Additive 0.85 0.03 0.79 – 0.90

→ 直接解读:“对照组平均成活率为72%,添加组为85%”。

Step 2:获取数据尺度上的差异(DIFF)

lsmeans treatment / ilink cl diff;

输出示例:

_Treatment Estimate Standard Error 95% Confidence Limits
Additive - Control 0.13 0.04 0.05 – 0.21

→ 解读:“添加组比对照组成活率高13个百分点(95% CI: 5–21个百分点)”。

Step 3:获取比值类指标(OR, RR, IRR)
对于 DIST=BINOMIAL ODDSRATIO 语句给出:

Odds Ratio Estimate 95% Confidence Limits
2.45 1.62 – 3.71

→ 解读:“添加组的成活优势比是对照组的2.45倍(即,成功几率是2.45倍)”。
注意: 优势比 ≠ 风险比(RR) 。当事件率较低(<10%)时,OR ≈ RR;当事件率高时,OR 会高估 RR。此时应改用 DIST=POISSON LINK=LOG 并用 ESTIMATE 语句计算 RR。

提示:我从不在论文中同时报告 OR 和绝对差值。它们回答的是不同问题:OR 回答“相对风险”,差值回答“绝对获益”。临床决策者更关注后者,监管机构更关注前者。根据读者选择。

4. 常见问题与排查技巧实录:那些让我熬夜到凌晨三点的Bug

4.1 问题1:“Convergence criterion satisfied” 但结果荒谬——模型收敛了,但收敛到了错误的山谷

现象 PROC GLIMMIX 报告收敛,但 ParameterEstimates 表中某个系数的 Estimate 极大(如 100+),标准误为 .(缺失),或 Covariance Parameter Estimates 表中某个方差分量为负值。

根本原因 :模型识别性(Identifiability)问题。最常见于:

  • 过度参数化 :随机效应太多,而数据量不足。例如,用 5 个农场的数据,却拟合 farm pen(farm) technician 三个随机效应;
  • 分布与连接函数冲突 :如 DIST=POISSON LINK=IDENTITY ,当线性预测器 η 为负时,模型试图预测负的计数值,导致迭代崩溃;
  • 数据质量问题 :某组 y=0 且 n 很大,或 y=n 且 n 很大,导致 logit 或 log 连接函数趋向 ±∞。

排查与解决

  1. 检查数据极端值 :运行 proc freq data=your_data; tables y*n; run; ,查看是否有 y=0 y=n 的极端组合。若有,考虑:
    • 加入微小常数(如 y = y + 0.5; n = n + 1; ),但需在方法部分说明;
    • 改用 DIST=NEGATIVEBINOMINAL ,它对零值更鲁棒。
  2. 简化随机效应 :逐个移除随机效应,看哪个移除后模型正常。我的经验是:优先保留生物学意义最强的随机效应(如 pen ),暂时去掉技术性随机效应(如 technician )。
  3. 更换连接函数 :对计数数据, LINK=LOG LINK=IDENTITY 稳定得多;对比例数据, LINK=LOGIT LINK=PROBIT 更常用(因 OR 解释更直观)。

4.2 问题2: PEARSON CHI-SQUARE/DF 高达 15,但换 DIST=NEGBIN 后 AIC 反而变大

现象 :过离散诊断明确,但切换到负二项分布后,AIC 比泊松模型还大,让人困惑:难道泊松模型更好?

真相 :AIC 和 overdispersion 检验回答的是不同问题。AIC 衡量的是“在给定分布族下,哪个模型拟合最好”;而 PEARSON CHI-SQUARE/DF 衡量的是“当前分布族是否能充分描述数据的变异”。

  • 如果 PEARSON CHI-SQUARE/DF = 15 ,说明泊松分布本身就不适合,无论你怎么调参数,它都无法捕捉真实的方差结构。此时 AIC 再小也是“精致的错误”。
  • DIST=NEGBIN 引入了一个额外的离散参数 k,它专门用来吸收过离散。即使 AIC 略高,它给出的 p 值、标准误才是可靠的。

我的决策树

  1. PEARSON CHI-SQUARE/DF < 1.5 → 当前分布可接受;
  2. PEARSON CHI-SQUARE/DF > 2 → 必须换分布(泊松→负二项,二项→beta-binomial);
  3. PEARSON CHI-SQUARE/DF 介于 1.5–2 之间 → 查看 CovP 表中离散参数 k 的估计值。若 k > 0.1,仍建议用负二项。

4.3 问题3: LSMEANS / ILINK 输出的置信区间超出 [0,1](对二项数据)

现象 lsmeans treatment / ilink cl; 输出的 95% CI 下限为 -0.02,上限为 1.05。

原因 ILINK 选项对 LSMEANS 的置信区间是 对线性预测器 η 的 CI 进行反变换 (即 g⁻¹(Lower_η), g⁻¹(Upper_η) ),而非对均值 μ 直接计算 CI。由于 logit 函数是非线性的,这种变换会导致 CI 不对称,且在均值接近 0 或 1 时,CI 可能轻微溢出边界。

解决方案

  • 接受它 :这是统计学的正确做法。溢出的幅度很小(如 -0.02)时,可报告为 “0.00 (95% CI: <0.01, 0.95)”;
  • 用 Bootstrap :对小样本或极端比例,用 PROC SURVEYSELECT + BY 语句做自助法,但计算量大;
  • 改用 DIST=BETA :Beta 分布天然定义在 [0,1] 上,其 ILINK CI 不会溢出,但解释不如二项直观。

4.4 问题4:如何报告“处理组间的绝对差异”? DIFF 选项不够用

痛点 lsmeans ... / diff ilink 只能给出两两比较,但业务需求常是“添加组 vs 所有其他组的平均值”。

解决方案 :用 ESTIMATE 语句自定义对比。例如,有4个处理组(A,B,C,D),想算 A vs (B+C+D)/3:

estimate 'A vs Avg of Others' 
         treatment 1 -0.333 -0.333 -0.333 / 
         ilink cl;

ilink 选项确保输出的是数据尺度上的差值(如 0.13),而非模型尺度。

实操心得:我把所有常用的 ESTIMATE 模板存成宏,如 %macro diff_vs_avg(treat_ref, treat_others); 。这样在分析十几个处理组时,5分钟就能生成全部对比,避免手误。

5. 进阶应用:处理现实世界中的“脏数据”与复杂设计

5.1 处理零膨胀计数数据(Zero-Inflated Count Data)

在动物行为研究中,常遇到“大量零值 + 少量正计数”的数据。例如,100只鸡中,85只全程未啄羽(y=0),其余15只啄羽次数为1~10次。泊松或负二项都无法解释这种“双峰”结构。

解决方案: DIST=ZIP (零膨胀泊松)或 DIST=ZINB (零膨胀负二项)

proc glimmix data=feather_pecking;
  class treatment;
  model y = treatment / dist=zip link=log solution;
  /* 零膨胀部分的模型:哪些因素影响“是否发生啄羽” */
  zeromodel treatment / link=logit;
  output out=zip_out pred=pred_zi;
quit;
  • MODEL 语句拟合计数值(给定发生啄羽的前提下);
  • ZEROMODEL 语句拟合“发生啄羽”的概率(logit 链接);
  • OUTPUT 中的 pred_zi 是综合两部分的预测值。

提示: ZEROMODEL 的协变量可以与 MODEL 不同。例如, MODEL treatment ZEROMODEL stocking_density ,这很合理——密度影响是否开始啄羽,而处理影响一旦开始后的严重程度。

5.2 处理重复测量的纵向数据(Repeated Measures)

当同一动物在多个时间点被测量(如每周体重),数据存在自相关。 GLIMMIX 通过 RANDOM 语句处理组内相关,但对时间自相关,需用 RESIDUAL 语句:

proc glimmix data=longitudinal;
  class animal time treatment;
  model weight = treatment time treatment*time / 
              dist=normal link=identity solution;
  /* 指定残差的协方差结构:AR(1) 表示相邻时间点相关性最高 */
  random time / subject=animal type=ar(1) residual;
quit;
  • type=ar(1) :一阶自回归,最常用;
  • type=cs :复合对称,假设所有时间点间相关性相同;
  • type=un :无结构,最灵活但参数最多。

注意: RESIDUAL 语句仅适用于 DIST=GAUSSIAN 。对非正态数据,需用随机斜率(random slope)来间接建模时间趋势。

5.3 处理多水平嵌套设计(Multi-level Nesting)

农业试验常有“农场 > 圈舍 > 动物 > 观察”的四级嵌套。 GLIMMIX 完全支持:

random intercept / subject=farm;
random intercept / subject=pen(farm);
random intercept / subject=animal(pen farm);

但要注意: 每一级随机效应的方差估计,都需要足够的上层单元数 。例如,若只有3个农场, farm 的方差估计就极不可靠。此时应将 farm 设为固定效应,或合并到更高层。

6. 最后一点个人体会:别让模型成为黑箱,让它成为你的思考伙伴

写完这篇长文,我翻出七年前第一份 GLIMMIX 作业——那份代码里满是 METHOD=RSPL DIST=GAUSSIAN 的硬套,被导师用红笔批注:“你是在拟合数据,还是在拟合你的假设?” 这句话刻在我硬盘里至今。

GLMM 的真正价值,不在于它能跑出漂亮的 p 值,而在于它强迫你回到数据源头去提问:

  • 这个响应变量,它的最小单位是什么?(是连续的克,还是离散的只?)
  • 它的取值范围是什么?(能为负吗?有天然上限吗?)
  • 它的变异,是由什么驱动的?(是随机的测量误差,还是系统性的环境差异?)

每一次 DIST= 的选择,都是你对世界运行机制的一次投票。 LOGNORMAL 投票给“乘性误差”, BINOMIAL 投票给“伯努利试验”, POISSON 投票给“稀有事件在固定时间内的发生”。这些投票,比任何 p 值都更深刻地定义了你的科学主张。

所以,下次当你面对一堆看似杂乱的数据时,别急着建模。先花十分钟,画一张分布直方图,算一组均值-方差,问自己一个问题:“如果我是这个数据,我会怎么生长?” 答案,就在 DIST= 的选项里。

更多推荐