SAS 9.4 M7+ R 4.0+ ICH E9(R1)
MMRM 完整学习指南 · v2.5 增补篇

从矩阵基础到监管提交

面向临床试验统计人员的重复测量混合模型完整学习资源。涵盖理论推导、SAS/R 实现、协方差结构选择、缺失数据处理、ICH E9(R1) 估计目标框架,以及监管视角。

25
内容章节
9
交互演示
~95
分钟阅读
SAS+R
双软件实现
00

阅读导览

根据你的背景和目标,选择最适合的阅读路径

初学者 从零开始

S0 导览→ S1 背景→ S2 数学→ S4 原理→ S5 协方差→ S8 演示→ S12 模板

实践者 SAS/R 程序员

S0 导览→ S8 联动演示→ S9 参数→ S10 实验室→ S11 沙盘→ S12 模板→ S14 自检

理论派 统计师 / 方法学

S0 导览→ S1 背景→ S2 数学→ S3 历史→ S4 原理→ S5-S7 深入→ S15 E9(R1)
声明
本文档中所有受试者编号、数值、LS Means 与 p 值均为模拟示例,不代表任何真实临床研究结果,不可用于任何提交材料。代码结构与参数说明仅供学习参考,实际分析请遵循项目 SAP 与统计师指导。
01

背景:纵向数据与三大难题

为什么临床试验需要 MMRM 而不是简单的 t 检验或 ANCOVA?

纵向数据 受试者内相关 缺失数据

1.1 什么是纵向数据?

在临床试验中,我们通常不会只在终点测量一次结局指标,而是在多个访视(visit)对同一受试者进行重复测量。例如,一项疼痛研究可能在基线(Baseline)后第 1、2、4、6、8、12 周分别评估疼痛评分(NRS)。这种同一受试者在多个时间点的重复测量就是纵向数据(longitudinal data)。

横断面数据

  • 每个受试者只测量一次
  • 观测之间相互独立
  • 标准方法:t 检验、ANOVA、ANCOVA
  • 无法捕捉时间趋势

纵向数据

  • 每个受试者测量多次
  • 同一受试者的观测不独立
  • 需要特殊方法处理相关性
  • 可以建模时间趋势与治疗效应

1.2 纵向数据的三大难题

1

受试者内相关性(Within-Subject Correlation)

同一个受试者在不同访视的测量值不是独立的——W1 和 W2 的评分通常比两个不同受试者的评分更相似。忽略这种相关性会导致标准误被低估、p 值偏小、假阳性率升高。

2

缺失数据(Missing Data)

纵向研究中受试者可能在某些访视缺失数据(脱落、失访等)。缺失不是随机的——病情恶化或改善的受试者更可能脱落。如何处理缺失数据直接影响结论的有效性。

3

治疗 × 时间交互(Treatment-by-Time Interaction)

治疗效果可能随时间变化——药物可能在早期见效快、后期趋于平稳,或反之。我们需要允许每个访视有各自的治疗组间差异,而不是假设一个恒定的治疗效应。

核心要点
MMRM 通过三个机制同时解决这三大难题:(1) 协方差结构 Σ 建模受试者内相关;(2) 基于似然的方法在 MAR 假设下有效利用不完整数据;(3) 治疗 × 访视交互项允许每个访视有独立的治疗效应估计。
02

数学基础

矩阵运算与线性回归回顾 —— 为 MMRM 的矩阵形式做铺垫

可折叠 零基础友好

2.1 矩阵知识速成

MMRM 的模型可以用矩阵形式简洁表达。理解以下基本概念有助于看懂模型公式和软件输出。

矩阵与向量

矩阵是一个按行和列排列的数的矩形阵列。在 MMRM 中,受试者 $i$ 在 $T$ 个访视的观测值可以写成一个 $T \times 1$ 的列向量:

$$\mathbf{y}_i = \begin{pmatrix} y_{i1} \\ y_{i2} \\ \vdots \\ y_{iT} \end{pmatrix}$$

其中 $y_{ij}$ 表示受试者 $i$ 在第 $j$ 个访视的观测值。

转置(Transpose)

矩阵 $\mathbf{A}$ 的转置 $\mathbf{A}'$(或 $\mathbf{A}^T$)是将行变为列、列变为行的操作。若 $\mathbf{A}$ 是 $m \times n$ 矩阵,则 $\mathbf{A}'$ 是 $n \times m$ 矩阵。

矩阵乘法

若 $\mathbf{A}$ 是 $m \times p$ 矩阵,$\mathbf{B}$ 是 $p \times n$ 矩阵,则 $\mathbf{AB}$ 是 $m \times n$ 矩阵,其中第 $(i,j)$ 元素为 $\mathbf{A}$ 的第 $i$ 行与 $\mathbf{B}$ 的第 $j$ 列的点积。

矩阵乘法动画演示

点击"播放"观看 $\mathbf{C} = \mathbf{A} \times \mathbf{B}$ 的逐步计算过程

点击播放开始演示

协方差矩阵(Covariance Matrix)

协方差矩阵 $\boldsymbol{\Sigma}$ 是一个对称正定矩阵,描述多个随机变量之间的方差和协方差关系。对角线元素 $\sigma_{jj}$ 是各访视的方差,非对角线元素 $\sigma_{jk}$ 是访视 $j$ 和 $k$ 之间的协方差。

$$\boldsymbol{\Sigma} = \begin{pmatrix} \sigma_1^2 & \sigma_{12} & \cdots & \sigma_{1T} \\ \sigma_{12} & \sigma_2^2 & \cdots & \sigma_{2T} \\ \vdots & \vdots & \ddots & \vdots \\ \sigma_{1T} & \sigma_{2T} & \cdots & \sigma_T^2 \end{pmatrix}$$

2.2 线性回归回顾

普通最小二乘回归(OLS)的矩阵形式为:

$$\mathbf{y} = \mathbf{X}\boldsymbol{\beta} + \boldsymbol{\varepsilon}, \quad \boldsymbol{\varepsilon} \sim N(\mathbf{0}, \sigma^2\mathbf{I})$$

其中 $\mathbf{y}$ 是 $n \times 1$ 响应向量,$\mathbf{X}$ 是 $n \times p$ 设计矩阵,$\boldsymbol{\beta}$ 是 $p \times 1$ 系数向量,$\boldsymbol{\varepsilon}$ 是误差项。

OLS 的局限
普通线性回归假设所有观测独立同分布($\sigma^2\mathbf{I}$)。对于纵向数据,同一受试者的多次观测明显不独立,违背了这一假设。MMRM 通过将 $\sigma^2\mathbf{I}$ 推广为分块对角协方差矩阵 $\mathbf{V} = \text{blockdiag}(\boldsymbol{\Sigma}_1, \boldsymbol{\Sigma}_2, \ldots, \boldsymbol{\Sigma}_N)$ 来解决这个问题。

广义最小二乘(GLS)

当误差协方差为 $\mathbf{V}$(非 $\sigma^2\mathbf{I}$)时,GLS 估计量为:

$$\hat{\boldsymbol{\beta}}_{GLS} = (\mathbf{X}'\mathbf{V}^{-1}\mathbf{X})^{-1}\mathbf{X}'\mathbf{V}^{-1}\mathbf{y}$$

MMRM 本质上就是一个 GLS 估计问题,其中 $\mathbf{V}$ 由协方差结构决定。当 $\mathbf{V} = \sigma^2\mathbf{I}$ 时,GLS 退化为 OLS。

03

历史演进:从 LOCF 到 MMRM

缺失数据处理方法的演进历程与监管态度的转变

LOCF BOCF MI MMRM
80s

LOCF(Last Observation Carried Forward)

将受试者最后一次观测值"结转"到所有后续缺失访视。曾广泛使用,但存在严重问题:人为扭曲数据变异、引入偏倚、标准误被低估。已被 FDA 和 EMA 明确不推荐。

90s

BOCF(Baseline Observation Carried Forward)

用基线值填充所有缺失访视。比 LOCF 更保守,但同样缺乏统计合理性——假设脱落后疗效完全消失通常不符合临床实际。

00s

Multiple Imputation(MI,多重插补)

基于模型对缺失值进行多次合理插补,分别分析后合并结果。统计上合理,但实施复杂、结果依赖插补模型,且不是基于似然的方法。

10s+

MMRM(Mixed Model for Repeated Measures)

基于似然的方法,在 MAR 假设下直接利用所有可用数据,无需插补。被 FDA、EMA 和 ICH E9(R1) 推荐为纵向连续结局的主要分析方法。当前行业标准。

方法对比

方法缺失数据处理受试者内相关偏倚风险监管接受度
LOCF末次观测结转忽略高不推荐
BOCF基线观测结转忽略高不推荐
CC删除缺失者忽略中-高不推荐
MI多重插补可建模低可接受
MMRM基于似然(MAR)协方差结构建模低推荐
监管立场
FDA 2010 年缺失数据指南明确指出:"LOCF 通常不是处理缺失数据的合适方法"。ICH E9(R1) 将 MMRM 定位为在 MAR 假设下处理纵向连续结局的首选方法,因为它直接基于似然、不需要插补、且能正确建模受试者内相关性。
04

MMRM 核心原理

模型形式、混合模型与 MMRM 的区别、以及 MMRM 如何解决三大难题

模型设定 固定效应 协方差结构

4.1 模型形式

设受试者 $i$ 在访视 $j$ ($j = 1, \ldots, k$) 的相对基线变化为 $Y_{ij}$:

$$Y_{ij} = \mu + \tau_{t(i)} + \gamma_j + (\tau\gamma)_{t(i)j} + \beta \cdot \text{base}_i + \varepsilon_{ij}, \quad \boldsymbol{\varepsilon}_i \sim N(\mathbf{0}, \boldsymbol{\Sigma})$$

符号SAS 写法含义与临床解读
$\tau_{t(i)}$TRTP (CLASS)治疗主效应;单独看几乎不用,重点在交互项
$\gamma_j$AVISIT (CLASS)访视主效应 —— 访视按类别因子进模型,不假设时间上的线性/任何形状
$(\tau\gamma)_{tj}$TRTP*AVISIT治疗×访视交互;这是 MMRM 的灵魂,允许每个访视有各自的组间差
$\beta \cdot \text{base}$BASE (连续协变量)基线校正,提高精度;很多 SAP 还加 BASE*AVISIT,允许基线效应随时间衰减
$\boldsymbol{\Sigma}$REPEATED ... TYPE=UN受试者内 $k \times k$ 协方差矩阵;建模的是残差相关,不是随机效应
关键点
去掉 TRTP*AVISIT,模型就变成「所有访视共用同一个组间差」,你将拿不到分访视的 LS Mean 差值,这与绝大多数 SAP 里「Week 24 的 LS mean difference」这一主要终点定义直接冲突。

4.2 混合模型 vs MMRM

「混合模型」(Mixed Model) 是指同时包含固定效应和随机效应的模型。MMRM 是一种特殊的混合模型 —— 它通常只有 R 侧(残差协方差),没有 G 侧(随机效应协方差)。

一般混合模型

  • $\mathbf{V}_i = \mathbf{Z}_i\mathbf{G}\mathbf{Z}_i' + \mathbf{R}_i$
  • 同时有 G 侧(随机效应)和 R 侧(残差)
  • 例如:随机截距 + 随机斜率模型

标准 MMRM

  • $\mathbf{V}_i = \mathbf{R}_i = \boldsymbol{\Sigma}$
  • 只有 R 侧,用协方差结构直接建模
  • UN 已经是最一般的 $k \times k$ 对称正定矩阵
常见错误
同时写 random intercept / subject=usubjid; 和 repeated / type=un; 是常见错误。因为 UN 已经是最一般的协方差结构,再加随机截距只会造成参数不可识别 / 收敛失败。

4.3 交互模型构建器

选择模型项,实时查看模型方程和 SAS 代码如何变化:

05

协方差结构详解

UN / CS / AR(1) / TOEP / CSH / ARH(1) / SP(POW) —— 灵活性与约束之间的取舍

交互实验室 7 种结构

5.1 MODEL 和 REPEATED:一张表的两个方向

沿用一个虚构研究框架:受试者在 W1、W2、W4、W6、W8 和 W12 评估疼痛 NRS,主要分析因变量是 $\text{CHG} = \text{AVAL} - \text{BASE}$。

MODEL 语句描述的是:给定基线、治疗组、访视和分层因素,平均的 CHG 处在什么位置?

REPEATED 语句描述的是:同一个人的多个 CHG 如何一起变化?

重要区分
MODEL 和 REPEATED 互有影响。协方差结构会影响标准误、置信区间和 P 值;在缺失或访视不平衡时,还可能影响固定效应估计的权重,进而影响 LSMean 和治疗差值。

5.2 常见结构对比

结构6 访视参数数主要假设优点风险
UN(非结构化)21方差和协方差均自由最灵活参数多,可能不收敛
CS(复合对称)2方差相同,任意两访视协方差相同简单稳定可能过度限制
AR(1)(一阶自回归)2距离越远,相关性按比例下降适合随时间衰减的相关性依赖合理的访视顺序和间距
TOEP(Toeplitz)6相同滞后阶数共享协方差比 CS 灵活,比 UN 约束更多仍然不是完全自由
CSH(异质复合对称)7方差可不同,协方差相同允许异方差参数比 CS 多
ARH(1)(异质自回归)7方差可不同,相关按 AR(1) 衰减灵活且参数适中需要足够数据支持
SP(POW)(空间幂)2方差异质可选;相关 $= \rho^{|t_i-t_j|}$,$t$ 为实际访视时间用真实时间坐标,天然处理不等距访视必须提供连续时间变量;时间单位影响 $\rho$ 的解释

5.3 SUBJECT=USUBJID:先划定「同一个人」

在 REPEATED AVISITN / SUBJECT=USUBJID TYPE=UN; 中,SUBJECT=USUBJID 告诉 SAS:具有相同 USUBJID 的记录属于同一个重复测量簇。

程序员需要检查:

  • USUBJID 是否真正唯一标识受试者
  • 同一受试者是否被错误拆成多个 ID
  • 是否把治疗组、中心或访视误写成 SUBJECT=
  • 每位受试者每个分析访视是否最多一条目标记录
  • REPEATED 中的访视变量是否与数据排序和分析访视一致

5.4 协方差结构交互实验室

选择不同结构、调整访视数和相关参数,实时观察协方差矩阵的变化:

协方差矩阵可视化

4
0.60
TYPE=UN 不是标准答案
很多统计程序员看到 TYPE=UN 就把注意力放在是否能收敛。但 TYPE=UN 不是一个「运行选项」——它是在告诉模型:同一名受试者的多次测量,允许按照什么方式共同波动。UN 的灵活性来自更多待估参数,访视越多,参数数量增长越快。程序运行成功,不等于协方差结构合理。
06

缺失数据、MAR 假设与敏感性分析

MCAR、MAR、MNAR 三种缺失机制;MMRM 为何不生成填补值;J2R / CR 类敏感性分析

交互演示 MAR 无填补 J2R

6.1 三种缺失机制

MCAR

Missing Completely At Random(完全随机缺失)

缺失概率与任何观测值或未观测值都无关。例如:受试者因搬家而失访,与病情无关。这是最强的假设,在现实中很少成立。

MAR

Missing At Random(随机缺失)

缺失概率只依赖于已观测数据(如之前的结局值、基线特征),而不依赖于未观测的未来值。这是 MMRM 基于似然推断的关键假设。

MNAR

Missing Not At Random(非随机缺失)

缺失概率依赖于未观测值本身。例如:病情恶化的受试者更可能脱落。此时基于 MAR 的 MMRM 可能产生偏倚,需要进行敏感性分析。

6.2 MMRM 如何处理缺失:基于似然,无需插补

核心结论
在 MAR 假设成立的前提下,MMRM 直接基于全部已观测数据构造似然,即可给出固定效应的无偏估计与有效的统计推断,无需对缺失值进行插补。缺失访视既不删除、也不填补,而是通过协方差结构 $V$ 把每位受试者实际观测到的那部分访视纳入贡献。

这句话包含四个要点,每一条都对应一个具体的建模或编程动作:

要点统计含义对编程与申报的含义
不删除 受试者只要还有至少一次有效观测,其已观测部分就进入似然 不需要按「完成全部访视」筛选分析集;脱落者的数据仍被利用
不插补 缺失值从不进入残差向量,也就不存在「补出来的信息」 不需要 LOCF、BOCF、WOCF、MI 等前置步骤;治疗差值由模型直接估计
无偏 MAR 且模型正确设定时,$E(\hat{\boldsymbol\beta})=\boldsymbol\beta$ 偏倚来源是 MAR 被违背或协方差结构误设,而不是「没有插补」
有效 $\operatorname{Var}(\hat{\boldsymbol\beta})=(X'V^{-1}X)^{-1}$ 达到该信息下的下界;配合 Kenward-Roger 调整后,SE、DF、置信区间与 P 值在小样本下仍是校准的 必须正确指定 TYPE= 与 DDFM=KR,否则「有效」不成立

之所以成立,关键在于 $V$ 是按每位受试者实际观测到的访视取子块:第 $i$ 名受试者贡献的似然只涉及 $V_i$ 中对应的行与列,缺失访视对应的行列被直接划掉,而不必先猜一个值填进去。因此 MMRM 与「先插补再分析」是两条不同的技术路线——后者人为增加了信息量,会低估不确定性,通常导致标准误偏小、P 值偏小。

边界条件不要省
「无需插补」依赖两个前提:MAR 成立与协方差结构基本正确。若怀疑 MNAR,正确做法不是改用插补来「补救」,而是按 ICH E9(R1) 做敏感性分析(如基于 delta 的调整、对照组多重插补、jump-to-reference、基于 retrieved dropout 的建模),并把结果写入敏感性分析章节,与主分析并列呈现。

6.3 缺失机制交互演示

观察不同缺失机制下数据点的缺失模式差异:

缺失数据机制散点图

观测值 缺失值
MMRM 为什么在 MAR 下有效?
MMRM 使用基于似然的方法(REML),在 MAR 假设下,似然函数只依赖于观测数据。只要模型正确指定了均值结构和协方差结构,MMRM 就能给出无偏的固定效应估计和有效的统计推断 —— 无需插补缺失值。

6.4 MMRM 不会生成单次填补值

一句话结论
MMRM 不使用单次填补值。对于缺失访视,模型不会先生成一个确定的"填补值"再把它当作观测纳入分析;缺失访视的结局不会被写回分析数据集,访视别 LSMean 也不是某一例缺失受试者的预测值。

这句话容易在程序复核时被忽略。把"无填补"拆成三个可核查的命题:

1

不写回 ADaM

若某受试者没有 W16 的 CHG,MMRM 不会在 ADQS 里新增一条"填补后的 W16"。分析数据集在 PROC MIXED 前后没有任何行被写入缺失访视的结局值。

2

LSMean 不是个体预测值

W16 的 LSMean 是治疗组平均轨迹在给定协变量下的边际均值,是组水平汇总量。把它读成"某例缺失 W16 的受试者大概是多少分"是概念错误。

3

不需要先知道缺失真值

MMRM 的目标是估计治疗组、访视与协变量条件下的平均变化及组间差异。它不要求先知道每名受试者缺失访视的真实数值 —— 这是它与 LOCF / BOCF 最根本的分野。

三种"缺失"在数据结构上不同,但都不会产生虚构的结局值:

缺失形态在 ADaM 中的表现进入似然的方式常见误解
单调脱落 W8 之后的记录整行不存在 W2、W4 的已观测结局照常进入,该受试者的 $V_i$ 只取 $\Sigma$ 中对应访视的子块 以为"整例被删除"(实际是完整病例法的行为,不是 MMRM 的)
间歇缺失 W6 记录存在,但 AVAL / CHG 缺失 该行不构成有效的因变量观测;其余访视照常进入 以为"被当成 0"或"被自动填补"
基线缺失导致 CHG 缺失 BASE 缺失 该访视的 CHG 无法构造;若 BASE 同时是协变量,影响不止一个访视 以为只丢一个访视点

从似然的角度看(推导见 S23):每名受试者只按自己实际的观测访视提供信息,$V_i = Z_i \Sigma Z_i^\top + \sigma^2 I_{n_i}$ 中的 $n_i$ 因人而异。模型评估的是"在当前均值模型与协方差结构下,已观测到的结果与模型有多一致",而不是"缺失值该填什么"。

"模型预测值"不等于填补值
OUTPUT OUT=pred PREDICTED= 可以给出每个观测(含条件于随机效应的经验 Bayes 预测)的拟合值。它只能用于模型诊断与图形展示,不能回写为受试者的"真实结局",更不能作为主分析的输入。一旦把预测值写回数据集再跑一次模型,就人为缩小了方差、破坏了 KR 自由度与 SE 的自洽性。

程序员可以核验的六项:

检查项期望结果
每名受试者每个访视是否最多一条目标记录是;存在重复需回溯筛选逻辑
缺失是"整行不存在"还是"AVAL/CHG 缺失"两者都要能区分并在缺失模式表中报告
BASE 缺失是否导致 CHG 无法构造需单独计数,不能混进"访视缺失"
WHERE 条件是否误删了本应使用的已观测记录逐条比对分析标志与筛选条件
PROC MIXED 实际使用了多少受试者与多少非缺失结局与 Number of Observations Used 一致
数据集中若出现填补变量必须能在 SAP 中找到明确依据(如 MI 的 _Imputation_)
本例实测
Number of Observations Read = 80、Used = 80、Not Used = 0。这不是"没有缺失" —— 36 例受试者 × 5 个计划访视 = 180 个计划观测,实际只有 80 个非缺失 CHG 进入模型(缺失率约 55.6%)。Read = Used 只说明分析数据集已按"CHG 非缺失"筛选完毕,缺失访视根本没有进入数据集,谈不上被填补。

6.5 为什么 MAR 主分析之外仍需敏感性分析

MMRM 在 MAR 下能给出无偏估计与有效推断,但这不等于 MNAR 风险已经消失。关键在于:

MAR 无法仅凭观察数据证明
如果受试者退出的原因与尚未观测到的结局直接相关,即使已调整基线与既往观测,缺失仍然携带未观察结局的信息 —— 这就是 MNAR 方向的担忧。MAR 与 MNAR 的区分不能只靠当前观察数据完成:分析人员可以描述缺失模式和退出原因,但不能仅凭日志或缺失比例宣布"数据符合 MAR"。

因此 ICH E9(R1) 要求:缺失数据的处理必须相对于具体的 estimand 来定义,并用预先设定的敏感性分析检验主分析对关键假设偏离是否稳健。主分析与敏感性分析面向同一 estimand,通过改变"缺失结局的假设"来观察结论是否稳定。

常见的参考组敏感性分析策略:

策略对缺失部分的假设直观解释
J2R
Jump to Reference
脱落前沿用本治疗组轨迹;从脱落后的下一个访视开始,结果跳向参考组轨迹"治疗有效,但退出后获益立即消失"
CR
Copy Reference
缺失部分按参考组的整体均值与协方差分布构造"缺失部分遵循参考组的完整纵向行为"
CIR
Copy Increments in Reference
保留受试者脱落时的治疗组水平,之后复制参考组的变化增量"退出后不再获益,但也不倒退到入组状态"
Tipping Point逐步改变缺失结局的假设(如逐次平移惩罚量)"结论在什么程度的偏离下会翻转"

J2R 与 CR 的概念差异(假设某受试者在 W6 后退出,安慰剂组为参考组):

比较点J2RCR
脱落前的已观察数据均保留并使用,已观察值不会被重写
脱落后的假设从下一个访视起,缺失结果按"跳转至参考组"的条件分布生成假想的完整纵向分布按参考组结构设定,再结合已观察数据生成缺失部分
直观解释治疗获益在退出后立即消失缺失部分按参考组的完整纵向行为处理
缩写不等于实现细节
J2R、CR、CIR 通常通过参考组多重插补实现,缺失值的条件分布仍会结合受试者已观察到的历史结果。但"J2R"这个缩写不唯一确定插补模型的形式、参考组的定义方式、以及是否调整协变量。实现细节必须查 SAP 与统计师的定义,不能只凭缩写判断。

6.6 MNAR 敏感性分析的生产实现:两段式 MI + 参考组填补

下面这段代码取自另一份真实 SAP(文中统称 STUDY-XX-202),是"MMRM 主分析 + MNAR 敏感性分析"配套写法中最典型的一种:先用 MAR 假设把间歇缺失补成单调缺失模式,再用参考组(control-based)FCS 在 MNAR 假设下补齐剩余的单调缺失。

先明确它挂在哪个 estimand 上 —— 这是程序员最容易搞混的地方:

Estimand策略主分析敏感性分析
主估计量
(DAS28-CRP 较基线变化)
Hypothetical:ICE 之后的观测剔除 MMRM(REML,MAR) 换用 IRT 分层因素替代 EDC 分层因素,模型其余不变
支持性估计量
(同一终点)
Treatment Policy:ICE 之后的观测保留 同一 MMRM,纳入全部已观测数据 MNAR 多重插补(下述两段式 MI)+ Rubin 合并
为什么敏感性分析挂在支持性估计量下?
主估计量(hypothetical)已经把 ICE 之后的数据剔除,其"缺失"主要是非 ICE 原因的缺失;而支持性估计量(treatment policy)要回答"即使发生 ICE 也照常用药会怎样",此时停药导致的缺失带有明显的 MNAR 倾向,才需要用参考组插补去检验"若退出者不遵循 MAR,结论会怎样"。敏感性分析服务于哪个 estimand,必须先分清。

SAP 中的示例程序(变量名与种子保留原样,研究号与药物代号已替换):

SAS · 第一段:MAR 下把间歇缺失补成单调缺失模式
proc mi data=datain_wide
        out=mi_mono
        nimpute=100
        seed=201101;
  var TRT STRAT BASE V2 V4 V8 V12;
  mcmc impute=monotone;
run;

proc sort data=mi_mono;
  by _imputation_;
run;
SAS · 第二段:MNAR 下用参考组 FCS 补齐单调缺失
proc mi data=mi_mono
        out=mi_fcs
        nimpute=1
        seed=201102;
  by _imputation_;
  class TRT STRAT;
  var BASE STRAT TRT V2 V4 V8 V12;
  fcs
    reg( V2  = BASE STRAT TRT )
    reg( V4  = BASE STRAT TRT V2 )
    reg( V8  = BASE STRAT TRT V2 V4 )
    reg( V12 = BASE STRAT TRT V2 V4 V8 );
  mnar model ( V2 V4 V8 V12 / modelobs=(TRT='PBO') );
run;

随后对 mi_fcs 中每个 _imputation_ 运行与主分析完全相同的 MMRM,用 PROC MIANALYZE(Rubin's rules)合并 100 组 LSMean 差值与 SE。

逐行解读:

语句 / 选项作用与必须注意的点
nimpute=100(第一段)生成 100 个 MAR 填补集。数量需与 SAP 一致,不能随意改;缺失比例高时通常取 ≥50
mcmc impute=monotone关键一步:先用 MCMC 把间歇缺失补上,人为造出单调缺失模式。FCS 的 MNAR 调整只对单调缺失有直接的序贯解释,所以必须先做这一步
seed=201101 / 201102两段用不同但固定的种子,保证可复现。交付前必须确认种子已写死且与 SAP 一致
proc sort; by _imputation_;第二段按 _imputation_ 分组处理,必须先排序,否则 by 语句报"数据未按序排列"
nimpute=1(第二段)对每个已有的 MAR 填补集只补一次。总数 = 100 × 1 = 100,而不是 100×100。这是最常写错的地方
fcs reg( V4 = BASE STRAT TRT V2 )序贯回归:每个访视条件于它之前的访视与协变量,顺序必须与访视时序一致(V2→V4→V8→V12)
mnar model( ... / modelobs=(TRT='PBO') )参考组定义的核心:用 TRT='PBO'(安慰剂组)的观测分布作为插补模型的来源,即"退出者的缺失部分按对照组的行为生成"。这正是 control-based / J2R 类思想的实现路径
var 中必须含 TRT、STRAT、BASE 与各访视SAP 明确要求插补模型包含治疗组、分层因素、基线与访视;漏掉任何一个都会改变插补分布,且难以在 QC 中发现
这段代码是"J2R"还是"CR"?
严格说,mnar model( ... / modelobs= ) 属于 control-based(参考组)插补的框架,J2R 与 CR 都在此框架下实现,具体是哪一个取决于缺失部分的条件均值与协方差如何设定。SAP 里若只写"采用 J2R",程序员不能自行假定 modelobs= 就是 J2R —— 必须向统计师确认:缺失部分是"从脱落点起跳向参考组轨迹"(J2R),还是"整个假想完整分布按参考组设定"(CR),以及是否需要 CIR 的增量形式。

报告与呈现的要求:

  • 主分析与敏感性分析并列呈现在同一张表中(点估计、SE、CI、P 值四列对齐),让读者直接比较;
  • 结论稳健性按 SAP 预先定义的标准判断,例如"主分析与敏感性分析方向一致且结论不变";
  • 若两者结论不一致,不能选择性报告,必须在 CSR 中说明差异来源(缺失率、退出原因分布、插补模型);
  • 二分类终点常用 NRI(non-responder imputation)处理缺失,那是另一套机制,不要与连续终点的 MNAR 插补混为一谈。
程序员不应自行决定的事项
以下判断属于统计师与医学的职责,程序员的义务是把证据整理清楚并向上反馈,而不是为了让程序跑通就改变缺失处理策略:
  • MAR 假设是否足够可信;
  • 停药后收集到的结果如何对应 estimand;
  • 主分析应采用 treatment policy、hypothetical 还是其他策略;
  • 应使用 J2R、CR、CIR 还是 Tipping Point;
  • 敏感性分析结果是否改变了临床结论。
07

估计与推断:REML 与 Kenward-Roger

为什么用 REML 而不是 ML?小样本下如何校正自由度?

REML Kenward-Roger

7.1 REML vs ML

最大似然(ML)和限制性最大似然(REML)是两种估计协方差参数的方法:

ML(最大似然)

  • 同时估计固定效应和协方差参数
  • 协方差参数估计有向下偏倚
  • 偏倚程度与固定效应参数个数有关
  • 适用于嵌套模型比较(似然比检验)

REML(限制性最大似然)

  • 先「积分掉」固定效应,再估计协方差
  • 修正了 ML 的向下偏倚
  • 协方差参数估计更准确
  • MMRM 的标准选择

SAS 中指定 REML:

SAS
PROC MIXED DATA=adqs METHOD=REML;
  CLASS TRTP AVISIT USUBJID;
  MODEL CHG = TRTP AVISIT TRTP*AVISIT BASE / DDFM=KR;
  REPEATED AVISIT / SUBJECT=USUBJID TYPE=UN R RCORR;
  LSMEANS TRTP*AVISIT / DIFF CL;
RUN;

7.2 自由度校正方法

方法SAS 选项特点适用场景
Kenward-RogerDDFM=KR同时校正 SE 和 DF;最保守小样本、非平衡设计;推荐
SatterthwaiteDDFM=SAT只校正 DF,不校正 SE中等样本,计算较快
Between-WithinDDFM=BW基于分解的近似方法多中心试验
ResidualDDFM=RES简单残差自由度大样本时近似合理
推荐实践
对于大多数临床试验的 MMRM 分析,推荐使用 METHOD=REML + DDFM=KR(Kenward-Roger)。KR 方法同时校正标准误和自由度,在小样本和非平衡设计下表现最好,也是 FDA 和 EMA 最认可的推断方法。
08

数据 ↔ 代码联动演示

逐步推进:每个 PROC MIXED 关键词读取了数据里的哪一列、触发了哪步运算

交互演示 9 步动画

左边是一份 ADaM BDS 长格式数据(3 名受试者 × 4 个访视,含 2 个缺失),右边是 MMRM 的完整代码。点「下一步」逐步推进:亮起的列就是这一步真正被读取的数据,曲线连到代码里对应的关键字,下方卡片解释这一步在数学上做了什么运算。

1 / 9

WORK.ADQS(分析数据集 · 长格式 BDS)

mmrm_primary.sas

09

PROC MIXED 全参数解剖

每一个关键字的含义、是否必需、临床解读与常见错误

完整参考 SAS 9.4 M7+
关键字必需?作用临床解读常见错误
CLASS是声明分类变量TRTP、AVISIT、USUBJID 等必须声明漏声明连续变量当分类
MODEL是指定均值模型描述平均变化轨迹漏掉 TRTP*AVISIT 交互项
REPEATED是指定残差协方差结构描述受试者内相关性SUBJECT= 写错变量
LSMEANS否计算最小二乘均值各治疗组×访视的调整后均值没加 DIFF CL 拿不到差值和 CI
ESTIMATE否自定义线性组合特定对比(如某访视的组间差)系数向量写错
CONTRAST否线性假设的 F 检验多剂量组整体检验与 ESTIMATE 混淆
SLICE否对 LS Means 做分片检验等价于 LSMEANS / SLICE=单独写时语法不同
STORE否保存模型上下文配 PROC PLM 后再做对比不常用,容易遗忘
PARMS否协方差参数初值/固定值急救:收敛失败时给初值乱给初值导致不收敛
RANDOM否指定 G 侧随机效应标准 MMRM 不需要与 REPEATED 同时写导致不可识别
DDFM=推荐自由度校正方法推荐 KR用默认 RES 导致保守
METHOD=推荐估计方法推荐 REML用 ML 导致协方差偏倚
GROUP=否按组分别估协方差两组变异明显不同时参数数×组数,收敛难
R / RCORR否打印 R 矩阵/相关阵QC 必备:立刻发现维度或顺序不对输出太多,日志过大
IC否输出信息准则比较结构时看 AIC/BIC仅凭 AIC 选结构
NOBOUND否允许方差估计为负能让收敛更容易负方差无临床意义
ORDER=否CLASS 水平排序FORMATTED/INTERNAL/DATA/FREQMMRM 常用 DATA,否则顺序错
版本说明
LSMESTIMATE、SLICE、STORE 是 SAS/STAT 9.22 起加入 PROC MIXED 的「共享语句」,在 MIXED 里完全可用。很多老资料仍说它们只属于 GLIMMIX,那是 9.2 之前的情况。真正只在 GLIMMIX 有的是 NLOPTIONS 等选项。

9.1 RANDOM vs REPEATED:G 侧与 R 侧

$$\mathbf{V}_i = \mathbf{Z}_i\mathbf{G}\mathbf{Z}_i' + \mathbf{R}_i \quad \text{(RANDOM 建 G,REPEATED 建 R)}$$

标准 MMRM:只用 R 侧

不写 RANDOM,直接令 $\mathbf{V}_i = \mathbf{R}_i = \boldsymbol{\Sigma}$(UN)。因为 UN 已经是最一般的 $k \times k$ 对称正定矩阵,再加随机截距不会增加任何拟合能力,只会造成参数不可识别 / 收敛失败。

常见错误
同时写 random intercept / subject=usubjid; 和 repeated / type=un; 是常见错误。

什么时候才需要 RANDOM?

  • 中心效应:random intercept / subject=site; —— 多中心试验中中心作为随机效应
  • 随机斜率:random AVISITN / subject=usubjid type=un; —— 允许每个受试者有自己的时间趋势(但这已不是标准 MMRM)
10

协方差结构实验室

交互式比较 UN、CS、AR(1)、CSH、TOEP、ARH(1)、SP(POW) —— 参数数、收敛风险、AIC/BIC

交互实验室 决策支持

10.1 参数数量计算器

输入访视数,查看各结构需要估计的协方差参数数量:

参数数量增长曲线

10.2 何时选择何种结构?

场景推荐结构理由
SAP 指定 UNUN遵循 SAP;样本量足够时首选
UN 不收敛TOEP 或 ARH(1)比 UN 约束更多但仍有灵活性
访视少(≤4)UN参数数可控,通常能收敛
访视多(≥8)TOEP 或 AR(1)UN 参数过多,需约束
等距访视 + 时间衰减AR(1)相邻更相关,随距离衰减
不等距访视SP(POW)(WEEK)用实际时间坐标建模相关性
两组变异明显不同UN + GROUP=TRTP各组分别估计协方差参数
AIC/BIC 只能提供一部分证据
不同协方差结构可以比较 -2 Res Log Likelihood、AIC、AICC、BIC。一般来说较小的 AIC 或 BIC 表示在拟合与复杂度之间取得了更好的折中。但它们不能替代统计判断。正式选择时还要结合:SAP 是否预先规定、模型是否收敛、协方差矩阵是否正定、LSMean 和差值是否稳定、结构是否符合访视设计和临床时间逻辑。
11

参数沙盘:填什么=算什么

交互式映射:PROC MIXED 参数 → 模型规格 → 输出结果

交互沙盘

选择下面的参数组合,查看对应的模型规格和预期输出:

估计方法

协方差结构

自由度方法

分组协方差

协方差参数数:公式与代入

结构跟随上方「模型规格 · 协方差结构」
    结构参数数公式构成(n 个访视)当前参数数随 n 变化

    11.1 每个输出参数是怎么算出来的

    沙盘里切换的是「模型设置」,而输出表格里的每一个数字都有确定的计算路径。下表把 SAS 输出中的关键量、所用公式、输入数据与估计方法一一对应,便于逐项复核。

    输出量计算公式输入数据估计方法可复核的中间结果
    协方差参数 $\hat\theta$
    CovParms
    最大化 REML 对数似然
    $\ell_R(\theta)=-\tfrac12\big[\log|V|+\log|X'V^{-1}X|+r'V^{-1}r\big]$
    $y$、$X$、受试者与访视索引 Fisher scoring / Newton-Raphson,收敛判据 ABSGCONV / PCONV 迭代史每一步的 −2RLL(S22 实例:567.614 → 545.711)
    固定效应 $\hat\beta$
    SolutionF
    $\hat\beta=(X'\hat V^{-1}X)^{-1}X'\hat V^{-1}y$ $\hat V$(上一步)、$X$、$y$ GLS:给定 $\hat\theta$ 时的闭式解,无需迭代 $X'\hat V^{-1}X$(本例 11×11,rank = 11)、$X'\hat V^{-1}y$
    $\operatorname{Var}(\hat\beta)$ $\widehat{\operatorname{Var}}(\hat\beta)=(X'\hat V^{-1}X)^{-1}$;KR 下再作调整得到 $\hat\Phi_A$ $(X'\hat V^{-1}X)^{-1}$、$\partial\hat V/\partial\hat\theta$、AsyCov$(\hat\theta)$ Kenward-Roger(Kackar–Harville 校正 + 尺度调整) AsyCov 是否正定(奇异时 SAS 报 GINV,SE 不可信)
    LSMean $\ell'\hat\beta$,其中 $\ell$ 由「各分类水平等权平均」规则构造 $\hat\beta$、设计矩阵列名与水平顺序 可估函数的线性组合;E 选项可打印 $\ell$ E 选项输出的系数向量(检验 $\ell$ 是否符合预期)
    SE(LSMean) $\sqrt{\ell'\hat\Phi_A\,\ell}$ 同上,且使用 KR 调整后的协方差矩阵 KR / Satterthwaite / Between-Within W16:8.9220(研究药物)、9.0975(安慰剂)
    治疗差值
    Diffs
    $(\ell_1-\ell_2)'\hat\beta$ —— 由模型直接估计 同上 同上;不是两个 LSMean 事后相减 W16:(−43.2597) − (−18.4896) = −24.7701
    Diffs 表报 −24.7700,末位为显示舍入
    SE(差值) $\sqrt{(\ell_1-\ell_2)'\hat\Phi_A(\ell_1-\ell_2)}$
    $=\sqrt{\operatorname{Var}_1+\operatorname{Var}_2-2\operatorname{Cov}_{12}}$
    同上,含两者的协方差项 同上 W16:12.7445;若误按独立计算则为 12.7423(本例两项几乎无关,差 0.017%)
    分母自由度 DF KR:$m=4+\dfrac{c+2}{c\rho-1}$,其中 $c$、$\rho$ 由 $\hat\Phi_A$ 与 $\hat V$ 的矩匹配给出 $\hat V$、$\hat\Phi_A$、$X$、$y$ Satterthwaite 型矩匹配(广义 Satterthwaite) W16 差值 DF = 51.7;非整数是 KR 的常态
    95% 置信区间 $\hat\Delta\ \pm\ t_{0.975,\;DF}\times SE$ 点估计、SE、DF t 分布分位数 W16:−24.7700 ± 2.0071 × 12.7445 =(−50.35, 0.81)
    P 值 $2\big[1-T_{DF}(|t|)\big]$,其中 $t=\hat\Delta/SE$ t 统计量、DF t 分布尾概率 W16:$t=-1.94$,$p=0.0574$
    −2 Res Log Likelihood $\log|V|+\log|X'V^{-1}X|+r'V^{-1}r+(N-p)\log 2\pi$ $\hat V$、$\hat\beta$、残差、$N$、$p=\operatorname{rank}(X)$ REML;常数项口径须与 SAS 一致 本例 545.711
    AIC / AICC / BIC AIC $= -2RLL+2d$
    AICC $= -2RLL+\dfrac{2dn}{n-d-1}$,$n=N-\operatorname{rank}(X)$
    BIC $= -2RLL+d\ln(n_{\text{subj}})$
    −2RLL、参数个数 $d$、以及三者的 $n$ 口径各不相同 闭式代入 本例 $d=2$:549.7 / 549.9 / 552.9

    11.2 关键中间结果:用 W16 差值做一次完整复核

    下面用 S22 那套真实输出(STUDY-XX-201 某亚组,CS 结构,DDFM=KR)把上表公式逐项算一遍。统计量数值未作改动,仅研究编号与治疗组代号已替换。你自己复核时,只要拿到 CovParms、LSMeans 与 Diffs 三张表就能重现以下全部数字。

    Step 1 · 协方差参数 → $V$ 的结构

    CS 结构下,$\hat V_i$ 的对角元是两个参数之和,非对角元为 CS 分量:

    • $\operatorname{Var}$(对角)$= \widehat{CS}+\widehat{Residual}=73.2028+61.7798=134.9826$
    • $\operatorname{Cov}$(非对角)$= \widehat{CS}=73.2028$
    • 隐含的组内相关 $= 73.2028\,/\,134.9826 = 0.5423$

    Step 2 · LSMean 与治疗差值

    • 研究药物 W16 LSMean $= -43.2597$(SE 8.9220,DF 48.7)
    • 安慰剂 W16 LSMean $= -18.4896$(SE 9.0975,DF 53.1)
    • 差值(研究药物 − 安慰剂)$= (-43.2597)-(-18.4896) = \mathbf{-24.7701}$,Diffs 表报 $\mathbf{-24.7700}$(末位舍入),两者一致

    注:早期版本此处引用过另一组 LSMean/SE 数值,来源为对纯文本输出的错误解析(列错位)。本版已按原始 sashtml.htm 的 Least Squares Means 与 Differences of Least Squares Means 两表逐格核对更正。

    Step 3 · SE(差值):协方差项不能丢

    • $\operatorname{Var}_1 = 8.9220^2 = 79.6021$;$\operatorname{Var}_2 = 9.0975^2 = 82.7645$
    • $\operatorname{Var}(\text{diff}) = 12.7445^2 = 162.4223$
    • $2\operatorname{Cov}_{12} = 79.6021+82.7645-162.4223 = -0.0557 \Rightarrow \operatorname{Cov}_{12}=-0.0278$
    • $\operatorname{Corr}_{12} = -0.0278\,/\,(8.9220\times9.0975) = -0.0003$
    这一步最容易做错
    本例的协方差项恰好接近 0($\operatorname{Corr}_{12}=-0.0003$),所以误按两组独立计算得 $SE=\sqrt{79.6021+82.7645}=12.7423$,与模型的 12.7445 只差 0.017%,几乎看不出来。

    但这不能推广。两组 LSMean 之间的协方差取自 $(X'V^{-1}X)^{-1}$ 的相应分块:当两组样本量不平衡、缺失模式差异大、或协变量分布不同时,这一项可以相当可观,独立计算会明显偏离,且不再与 Type 3 检验和 KR 自由度自洽。正确做法始终是直接取 Diffs 表给出的 SE,不要自己用两个 SE 去拼。

    Step 4 · t 值、置信区间与 P 值

    • $t = -24.7700\,/\,12.7445 = -1.9436$(SAS 显示 −1.94)
    • $t_{0.975,\,51.7} \approx 2.0071 \Rightarrow$ 边际误差 $= 2.0071\times12.7445 = 25.580$
    • 95% CI $= (-24.7700-25.580,\ -24.7700+25.580) = (-50.35,\ 0.81)$;SAS 输出 $(-50.3478,\ 0.8077)$,差异仅来自分位数的四舍五入
    • $p = 2\big[1-T_{51.7}(1.9436)\big] = 0.0574$

    Step 5 · 拟合统计量的 $n$ 口径

    已知 $N=80$,$\operatorname{rank}(X)=11$,$d=2$(CS),受试者数 $=36$,−2RLL $=545.711$:

    • AIC $= 545.711 + 2\times2 = 549.711$(SAS 549.7)✓
    • AICC:$n = N-\operatorname{rank}(X)=80-11=69$,$\Rightarrow 545.711 + \dfrac{2\times2\times69}{69-2-1} = 545.711+4.1818 = 549.893$(SAS 549.9)✓
    • BIC:$545.711 + 2\times\ln 36 = 545.711 + 7.1670 = 552.878$(SAS 552.9)✓

    三者的 $n$ 不同:AIC 不用 $n$;AICC 用 $N-\operatorname{rank}(X)$;BIC 用受试者数。拿错口径就复现不出 SAS 的数字——这是自查时最容易卡住的地方。

    11.3 参数复核清单

    1. 先对结构再看数字。 CovParms 的参数个数是否等于该 TYPE= 的理论个数?出现 0、负值或贴边界,先回到 S24 排查。
    2. 用 E 选项打印 $\ell$ 向量。 确认 LSMean / 差值确实用了你以为的那一组系数,尤其是有协变量或交互项时。
    3. 差值必须来自 Diffs 表。 不要用取整后的两个 LSMean 相减;同样的道理,CI 与 P 值也必须用模型直接给出的 SE 与 DF 重算。
    4. 检查 SE 与 Var 的自洽性。 用 Step 3 的式子反算 $\operatorname{Cov}_{12}$,若为负得不合常理,多半是 $\ell$ 向量或模型设定有问题。
    5. DF 非整数不是错。 KR 的 $m$ 本来就是实数;但 DF 明显小于受试者数时要警觉单元格稀疏。
    6. 用 AIC / AICC / BIC 反查 $n$ 口径。 三者能对上 SAS,说明 −2RLL 与 $d$ 都取对了。
    7. 交叉验证。 条件允许时用另一套实现(如 R mmrm 或本指南的自研 REML 引擎)重跑同一模型,比对到小数点后 2–3 位。
    12

    生产级代码模板

    完整的、带注释的 SAS PROC MIXED 和 R mmrm 代码模板

    SAS R 可直接复用

    12.1 SAS PROC MIXED 主分析模板

    SAS
    /*================================================================
      MMRM 主分析程序模板
      数据集:ADaM BDS 长格式 (ADQS)
      因变量:CHG = AVAL - BASE
      固定效应:TRTP, AVISIT, TRTP*AVISIT, BASE
      协方差:UN (非结构化)
      自由度:Kenward-Roger
      ================================================================*/
    
    * 1. 数据准备:排序确保受试者内记录连续且按访视顺序;
    PROC SORT DATA=ADQS OUT=ADQS_SORTED;
      BY USUBJID AVISITN;
    RUN;
    
    * 2. 受试者-访视唯一性检查;
    PROC SORT DATA=ADQS_SORTED NODUPKEY;
      BY USUBJID AVISITN;
    RUN;
    
    * 3. MMRM 主分析;
    PROC MIXED DATA=ADQS_SORTED METHOD=REML;
      CLASS TRTP AVISIT USUBJID;
      MODEL CHG = TRTP AVISIT TRTP*AVISIT BASE
            / DDFM=KR SOLUTION CL;
      REPEATED AVISIT /
        SUBJECT=USUBJID
        TYPE=UN
        R RCORR;
      LSMEANS TRTP*AVISIT / DIFF CL ADJUST=NONE;
      ODS OUTPUT
        LSMeans=LSM_OUT
        Diffs=DIF_OUT
        CovParms=COV_OUT
        FitStatistics=FIT_OUT;
      TITLE "MMRM Primary Analysis - UN Covariance";
    RUN;
    QUIT;
    
    * 4. 探索性协方差结构比较;
    %MACRO FIT_COV(TYPE=, LABEL=);
    PROC MIXED DATA=ADQS_SORTED METHOD=REML;
      CLASS TRTP AVISIT USUBJID;
      MODEL CHG = TRTP AVISIT TRTP*AVISIT BASE / DDFM=KR;
      REPEATED AVISIT / SUBJECT=USUBJID TYPE=&TYPE;
      ODS OUTPUT FitStatistics=FIT_&LABEL;
    RUN;
    QUIT;
    %MEND;
    
    %FIT_COV(TYPE=UN,    LABEL=UN);
    %FIT_COV(TYPE=CS,    LABEL=CS);
    %FIT_COV(TYPE=AR(1), LABEL=AR1);
    %FIT_COV(TYPE=TOEP,  LABEL=TOEP);

    12.2 R mmrm 等效代码

    R
    # MMRM 主分析 - R mmrm 包
    library(mmrm)
    
    # 拟合 MMRM 模型
    fit <- mmrm(
      formula = CHG ~ TRTP * AVISIT + BASE,
      cov_structure = "us",          # 非结构化协方差
      data = adqs,
      method = "REML"
    )
    
    # 查看模型摘要
    summary(fit)
    
    # 分访视治疗组对比(LS Mean Differences)
    lsmeans <- emmeans(fit, specs = pairwise ~ TRTP | AVISIT)
    print(lsmeans)
    
    # 探索性协方差结构比较
    fit_cs   <- update(fit, cov_structure = "cs")
    fit_ar1  <- update(fit, cov_structure = "ar1")
    fit_toep <- update(fit, cov_structure = "toep")
    
    # 比较 AIC/BIC
    AIC(fit, fit_cs, fit_ar1, fit_toep)
    BIC(fit, fit_cs, fit_ar1, fit_toep)
    使用提示
    此模板适用于大多数标准 MMRM 分析场景。实际使用时请根据项目 SAP 调整:因变量名称、固定效应项、协方差结构、分层因素、以及 ODS 输出数据集名称。探索性结构比较代码仅用于评估,不等于正式分析可以自动选择 AIC 最小的结构。
    13

    输出解读与 TLF 落地

    如何阅读 PROC MIXED 输出并映射到监管提交表格

    Fit Statistics CovParms LS Means

    13.1 关键输出表

    1

    Model Information / Dimensions

    确认:协方差结构(UN)、估计方法(REML)、自由度方法(KR)、观测数、受试者数。这是 QC 的第一步——确认模型设置与 SAP 一致。

    2

    Fit Statistics

    -2 Res Log Likelihood、AIC、AICC、BIC。用于比较不同协方差结构的拟合优度。注意:这些指标只在固定效应相同时才可比较。

    3

    Covariance Parameter Estimates

    协方差参数估计值、标准误、Z 值、P 值。检查:所有方差是否为正?相关系数是否在合理范围?UN 结构下应有 $T(T+1)/2$ 个参数。

    4

    Type 3 Tests of Fixed Effects

    整体 F 检验:TRTP、AVISIT、TRTP*AVISIT、BASE 的显著性。TRTP*AVISIT 显著说明治疗效应随时间变化。

    5

    LS Means / Differences

    各治疗组×访视的最小二乘均值、组间差值、95% CI、P 值。这是主要终点的直接来源。

    13.2 输出 → TLF 映射

    PROC MIXED 输出TLF 表格用途
    LSMeansTable: LS Means by Treatment and Visit各访视各组的调整后均值
    DiffsTable: Treatment Differences at Each Visit主要终点:组间差值 + CI + P
    CovParmsListing: Covariance Parameter Estimates协方差参数详情
    FitStatisticsListing: Model Fit Statistics模型拟合指标
    SolutionFListing: Fixed Effects Estimates固定效应系数
    QC 要点
    拿到输出后首先检查:(1) 模型信息是否与 SAP 一致;(2) 观测数和受试者数是否正确;(3) 协方差参数是否正定;(4) 目标访视的 LSMean 差值是否合理;(5) 改变协方差结构后结果是否稳定。
    14

    常见误区与自检清单

    12 个常见错误 + 交互式自检清单 + 红旗警告

    误区 自检清单

    14.1 十二个常见误区

    1

    把访视当成受试者边界

    REPEATED USUBJID / SUBJECT=AVISITN; 让模型把同一访视下的受试者聚在一起,完全改变相关性单位。

    2

    把 UN 当作随机效应模型

    TYPE=UN 描述的是重复测量残差的协方差结构。它不等于「加了一个随机截距」。

    3

    看到不收敛就直接删掉交互项

    固定效应和协方差结构是两个不同层面。协方差不收敛时,不能为了让程序跑通就删除 TRTP*AVISIT。

    4

    只比较 AIC,不看参数和结果稳定性

    复杂结构可能改善拟合指标,却产生不稳定的协方差参数和不可解释的推断结果。

    5

    AR(1) 的访视顺序没有实际含义

    不能只因为访视变量是数字就自动认为 AR(1) 合理。需要确认访视间隔是否近似等距、顺序是否有临床意义。

    6

    数据未排序就运行 PROC MIXED

    REPEATED 不会自动重排数据。受试者内 R 矩阵的行按输入数据顺序构造。应显式 PROC SORT BY USUBJID AVISITN;

    7

    GROUP= 导致参数爆炸

    GROUP=TRTP 让参数数量乘以组数。两个治疗组 + 六个访视的 UN 需要 42 个协方差参数,收敛压力大增。

    8

    同时写 RANDOM 和 REPEATED

    标准 MMRM 只用 REPEATED。同时写 random intercept 和 repeated type=un 导致参数不可识别。

    9

    ORDER= 默认值导致水平顺序错误

    MMRM 常用 ORDER=DATA,否则 CLASS 水平可能按字母序而非数据序排列,影响结果解读。

    10

    忽略非正定矩阵警告

    协方差矩阵非正定意味着模型设定有问题。不能忽略警告继续解读结果。

    11

    把探索性结构比较误当成正式选模

    比较 UN/CS/AR(1)/TOEP 的 AIC 是探索性评估,不等于正式分析可以自动选择 AIC 最小的结构。

    12

    不检查 LSMean 差值的稳定性

    改变协方差结构后,目标访视的 LSMean 差值应基本稳定。如果变化很大,需要警惕模型设定问题。

    14.2 自检清单

    勾选以下项目确认你的 MMRM 分析设置正确:

    数据准备

    模型设定

    结果验证

    15

    估计目标与伴发事件处理策略

    ICH E9(R1) 框架下的 MMRM 定位

    ICH E9(R1) Estimand

    15.1 估计目标的五个属性

    1

    治疗条件(Treatment Condition)

    明确比较的治疗组(如 Drug A vs Placebo)。

    2

    目标人群(Population)

    分析人群定义(如 FAS、PPS)。MMRM 通常在 FAS 上运行。

    3

    变量(Variable / Endpoint)

    终点指标及时间点(如 Week 24 的 CHG from baseline)。

    4

    伴发事件处理策略(Intercurrent Event Strategy)

    见下方五种策略。MMRM 默认对应 hypothetical 策略。

    5

    群体水平汇总(Population-level Summary)

    组间差值(Treatment Difference)及其 95% CI。

    15.2 五种伴发事件处理策略

    策略含义MMRM 中的体现
    Treatment Policy无论是否发生伴发事件,都使用实际观测值使用所有观测数据,包括伴发事件后的数据
    Hypothetical假设伴发事件未发生时会怎样MMRM 在 MAR 下的默认解释:假设缺失数据的受试者遵循与观测数据相同的趋势
    Composite Variable将伴发事件纳入终点定义如将脱落定义为治疗失败,需要重新定义因变量
    While on Treatment只分析伴发事件前的数据需要修改数据,只保留治疗期间访视
    Principal Stratum限定在特定潜在子群中估计需要额外假设和敏感性分析
    MMRM 与 Estimand 的关系
    MMRM 在 MAR 假设下天然对应 hypothetical 策略——它估计的是「如果所有受试者都完成所有访视」情况下的治疗效应。当 SAP 指定 treatment policy 策略时,可能需要使用所有观测数据(包括伴发事件后),此时 MMRM 仍然适用但解释不同。
    16

    监管视角:FDA / EMA / ICH

    各监管机构对 MMRM 的立场与建议

    FDA EMA ICH

    16.1 监管机构对比

    机构关键文件对 MMRM 的立场
    FDA 2010 Missing Data Guidance 明确不推荐 LOCF;推荐基于似然的方法(MMRM)和 MI;强调敏感性分析的重要性
    EMA 2010 Missing Data Reflection Paper 推荐 MMRM 作为连续结局的主要分析方法;强调 MAR 假设的合理性论证
    ICH E9(R1) Estimand Framework (2019) 将 MMRM 定位为 MAR 假设下的标准方法;要求明确估计目标和伴发事件处理策略

    16.2 敏感性分析

    ICH E9(R1) 强调:主要分析(MMRM under MAR)应辅以敏感性分析,评估结论对 MAR 假设的稳健性。常见的敏感性分析方法包括:

    • Pattern Mixture Models:对不同缺失模式分别建模
    • Selection Models:联合建模结局和缺失机制
    • Tipping Point Analysis:探索 MNAR 程度达到多少时结论改变
    • Multiple Imputation with Delta Adjustment:在 MI 框架下引入 MNAR 偏移
    实践建议
    在 SAP 中预先规定:(1) 主要分析方法(MMRM + REML + KR + UN);(2) 探索性协方差结构比较;(3) 敏感性分析方案(如 PMM 或 tipping point)。这符合 ICH E9(R1) 对估计目标完整性的要求。
    17

    对话问答复盘

    常见问题与边界场景的 FAQ

    Q&A
    Q: UN 不收敛怎么办?
    A: 首先检查数据:样本量是否足够、访视单元格是否有空、是否有异常值。然后尝试:(1) 改用 TOEP 或 ARH(1);(2) 使用 PARMS 提供初值;(3) 增加 MAXITER;(4) 检查是否有受试者只有一个访视的观测。如果 UN 在探索性分析中不收敛但在正式分析中 SAP 指定了 UN,需要与统计师讨论。
    Q: 应该用 UN 还是根据 AIC 选结构?
    A: 如果 SAP 预先规定了 UN,就使用 UN。探索性比较 AIC 可以提供参考,但不能自动选择 AIC 最小的结构作为主分析。正式选择需要结合 SAP、收敛性、正定性、结果稳定性、以及临床合理性综合判断。
    Q: GROUP=TRTP 什么时候用?
    A: 当两个治疗组的变异模式明显不同时(如活性药的变异随时间增大而安慰剂稳定),可以考虑 GROUP=TRTP。但参数数量会乘以组数,收敛压力大增。应由 SAP 或统计师确认是否允许。
    Q: MMRM 能处理 MNAR 吗?
    A: MMRM 基于 MAR 假设。如果怀疑 MNAR,需要进行敏感性分析(如 Pattern Mixture Models、Tipping Point Analysis)。MMRM 本身不能处理 MNAR,但可以作为主要分析,辅以 MNAR 敏感性分析。
    Q: 受试者只有一个访视的观测要不要保留?
    A: 在 MMRM 中,只有一个访视观测的受试者仍然贡献信息(用于估计固定效应),但不贡献协方差信息。通常应保留,除非 SAP 另有规定。
    Q: Kenward-Roger 和 Satterthwaite 有什么区别?
    A: KR 同时校正标准误和自由度,更保守但更准确,尤其在小样本和非平衡设计下。Satterthwaite 只校正自由度,计算更快。大多数监管提交推荐 KR。
    Q: AR(1) 的访视间隔不等距怎么办?
    A: 普通 AR(1) 按访视顺序(位置)计算滞后,不按实际时间距离。如果 W1-W2 间隔 1 周、W2-W4 间隔 2 周,AR(1) 把它们都视为「相邻」。如果需要按实际时间建模,考虑 SP(POW)(WEEK) 结构。
    Q: R mmrm 和 SAS PROC MIXED 结果会完全一样吗?
    A: 在相同模型设定下,结果应该非常接近但可能不完全相同。差异来源包括:优化算法、收敛标准、自由度校正的数值实现等。通常差异在小数点后 3-4 位,不影响结论。
    18

    参考文献

    监管文件、统计方法论文、软件文档与社区资源

    Regulatory Methods Software

    监管文件

    • ICH E9(R1). Addendum on Estimands and Sensitivity Analysis in Clinical Trials. 2019.
    • FDA. Guidance for Industry: The Use of Multiple Imputation in Clinical Trials with Missing Data. 2010.
    • EMA. Reflection Paper on Missing Data in Confirmatory Clinical Trials. 2010.
    • FDA. Guidance for Industry: E9 Statistical Principles for Clinical Trials. 1998.

    统计方法

    • Mallinckrodt CH, et al. Recommendations for the primary analysis of continuous endpoints in longitudinal clinical trials. Drug Inf J. 2008;42(4):303-319.
    • Mallinckrodt CH, et al. Assessing and interpreting treatment effects in longitudinal clinical trials with missing data. Biol Psychiatry. 2008;63(8):772-778.
    • Kenward MG, Roger JH. Small sample inference for fixed effects from restricted maximum likelihood. Biometrics. 1997;53(3):983-997.
    • Littell RC, et al. SAS for Mixed Models. 2nd ed. SAS Institute; 2006.
    • Diggle PJ, et al. Analysis of Longitudinal Data. 2nd ed. Oxford University Press; 2002.
    • Rubin DB. Multiple Imputation for Nonresponse in Surveys. Wiley; 1987.

    软件文档

    • SAS/STAT User's Guide: The MIXED Procedure. SAS Institute.
    • Kenward MG, Roger JH. The mmrm package for R. GitHub: openpharma/mmrm.
    • R Core Team. R: A Language and Environment for Statistical Computing. R Foundation; 2024.

    社区资源

    • 微信公众号「生物统计与统计编程」MMRM 系列文章
    • PHUSE / CDISC MMRM 最佳实践指南
    • Stack Overflow: [sas] [mixed-models] [mmrm] 标签
    19

    一页速查表

    MMRM 核心知识点快速回顾

    Quick Reference 可打印
    问题答案
    MMRM 全称Mixed Model for Repeated Measures(重复测量混合模型)
    核心假设MAR(Missing At Random,随机缺失)
    估计方法REML(限制性最大似然)
    自由度校正Kenward-Roger(推荐)
    默认协方差结构UN(非结构化)
    SAS 过程步PROC MIXED
    R 包mmrm
    主要终点来源LSMEANS TRTP*AVISIT / DIFF CL
    MODEL 描述平均变化轨迹(固定效应)
    REPEATED 描述受试者内相关性(残差协方差)
    标准 MMRM 有随机效应吗?没有。只有 R 侧,没有 G 侧。
    UN 的 6 访视参数数21 = 6 + 6×5/2
    LOCF 的监管态度不推荐(FDA 2010, EMA 2010)
    敏感性分析方法PMM, Selection Model, Tipping Point, MI+Delta
    ICH E9(R1) 年份2019

    SAS 代码速查

    SAS · Quick Reference
    PROC MIXED DATA=adqs METHOD=REML;
      CLASS TRTP AVISIT USUBJID;
      MODEL CHG = TRTP AVISIT TRTP*AVISIT BASE / DDFM=KR;
      REPEATED AVISIT / SUBJECT=USUBJID TYPE=UN R RCORR;
      LSMEANS TRTP*AVISIT / DIFF CL;
    RUN;

    R 代码速查

    R · Quick Reference
    library(mmrm)
    fit <- mmrm(CHG ~ TRTP * AVISIT + BASE,
                cov_structure = "us", data = adqs)
    summary(fit)
    emmeans(fit, pairwise ~ TRTP | AVISIT)
    20

    MMRM 输出数据集结构:LSMESTIMATE、SLICE 与 STORE

    ODS 表名由什么语句触发?每个数据集里有哪些字段?STORE 到底存了什么?

    LSMESTIMATE SLICE STORE / PLM ODS

    20.1 先分清三层数据的职责

    ODS 结果不宜直接改造成显示字符串。更稳妥的做法是分成三层,每层只承担一种责任:

    层次示例数据集主要任务是否允许格式化
    模型结果层MMRM_LSMEANS、MMRM_DIFFS、MMRM_COVPARMS原样保留 SAS 输出,含比较两端、完整精度❌ 不做任何取整
    统计结果层W16_LSMEANS、W16_DIFFS、W16_RESULTS筛选目标访视、统一差值方向、落实目标估计量❌ 保留完整数值精度
    显示层TLF_DATA按 shell 处理小数位、P 值字符串、空白与对照组留空✅ 只在这一层格式化
    最常见的返工来源
    把格式化提前到统计结果层,用已经四舍五入的 LSMean 重新相减得到"治疗差值"。这样做既引入显示精度误差,也无法恢复模型直接估计出来的 SE、DF、CI 和 P 值。差值必须由模型直接估计,不能事后相减。
    图 20-1 · ODS 输出的三层落地路径 语句决定打开哪张表,STORE 存的是模型不是表
    PROC MIXED 语句
    LSMEANS … / DIFF=CTRL CL
    LSMESTIMATE 对 LSMean 线性组合
    SLICE 选项 / 独立语句
    STORE out= 保存模型对象
    →
    ODS 输出表
    LSMeans
    Diffs(由 DIFF= 触发)
    LSMEstimates / Slices
    Item Store(二进制,非表)
    →
    落地数据集
    ODS OUTPUT:保留完整精度
    统计结果层:选访视、定方向
    显示层:唯一允许取整
    PROC PLM RESTORE 复用模型
    关键约束:治疗差值必须由模型直接估计,不能用取整后的两个 LSMean 相减。

    20.2 ODS 表名与触发语句对照

    SAS 官方文档的 ODS Table Names 表规定了"表名 ← 触发它的语句/选项"这一一对应关系。写 ODS OUTPUT 之前先确认触发条件,否则会得到空数据集或根本不生成:

    ODS 表名内容触发语句 / 选项MMRM 常用度
    ModelInfo模型信息(结构、方法、DDFM)默认输出★★★ QC 第一步
    ClassLevels分类变量水平与取值默认输出★★★ 查 USUBJID 数
    Dimensions协方差参数数、X 列数、受试者数默认输出★★★
    NObs读入 / 使用 / 未使用的观测数默认输出★★★
    ConvergenceStatus收敛状态与原因默认输出★★★ 自动化回退必用
    IterHistory迭代史默认输出★★
    CovParms协方差参数估计默认输出★★★
    FitStatistics−2RLL / AIC / AICC / BIC默认输出★★★ 结构比较
    LRT零模型似然比检验默认输出★
    Tests3Type 3 固定效应检验默认输出★★
    SolutionF固定效应解MODEL / S(SOLUTION)★★
    LSMeans最小二乘均值LSMEANS★★★
    DiffsLSMean 两两差值LSMEANS / DIFF(或 PDIFF、ADJUST=)★★★ 主要终点来源
    LSMEstimatesLSMESTIMATE 语句的结果LSMESTIMATE★★★ 自定义对比
    EstimatesESTIMATE 语句的结果ESTIMATE★★
    ContrastsCONTRAST 语句的结果CONTRAST★★
    SlicesTests of Effect Slices(简单效应)LSMEANS / SLICE= 或 SLICE 语句★★
    CoefL 矩阵系数(可估性核对)E 选项(MODEL/CONTRAST/ESTIMATE/LSMEANS)★★★ 疑难排查
    AsyCov协方差参数的渐近协方差矩阵PROC MIXED ASYCOV★★ 诊断奇异
    R / RCorrR 矩阵块 / 相关阵REPEATED / R、/ RCORR★★
    一个容易踩的空表陷阱
    ods output Diffs=diffs; 只有当 LSMEANS 语句里带了 DIFF(或 PDIFF、ADJUST=)时才会生成。只写 lsmeans trtpn*avisitn / cl; 不会有 Diffs。反过来,ADJUST= 会隐含请求 DIFF,此时 PROBT 已是调整后 P 值,不能当作名义 P 值使用。

    20.3 LSMeans 与 Diffs 的字段

    LSMeans 每行对应一个「治疗组 × 访视」单元的调整后均值:

    字段含义使用注意
    TRT01PN, AVISITN该 LSMean 对应的治疗组与访视合并键
    EstimateLSMean 本身不是该组该访视非缺失 CHG 的算术平均
    StdErr, DF标准误与自由度DF 来自 DDFM=,非常数
    Lower, UpperLSMean 的置信限需 CL 选项
    Probt该 LSMean 与 0 比较的 P 值❌ 不是组间比较 P 值

    Diffs 每行是一条两两比较,端点字段带下划线:

    字段含义
    TRT01PN, AVISITN比较的第一端(被减数和参照端)
    _TRT01PN, _AVISITN比较的第二端(减数)
    Estimate第一端 − 第二端
    StdErr, DF, Lower, Upper, Probt差值 SE、自由度、CI、P 值
    只写 where avisitn=16 是不够的
    where avisitn=16; 只限定了第一端,第二端仍可能来自 W2、W4、W8 或 W12。访视内的组间比较必须同时限定两端: where avisitn=16 and _avisitn=16;

    20.4 LSMESTIMATE 语句:直接对 LSMean 做线性组合

    当 SAP 要求的估计量不是现成的某一条两两比较时(例如"两个剂量组合并后与安慰剂比较"、"某访视上若干单元格的平均"),用 LSMESTIMATE 直接写 LSMean 的系数最直观——它作用的单位是 LSMean,而不是固定效应参数 β。

    SAS
    proc mixed data=adeff_ana method=reml cl;
        class usubjid trt01pn(ref="1") avisitn;
        model chg = base trt01pn avisitn trt01pn*avisitn / ddfm=kr solution;
        repeated avisitn / subject=usubjid type=un;
    
        /* LSMean 的水平顺序:avisitn 在外层、trt01pn 在内层,
           即 (W2,T1)(W2,T4)(W4,T1)(W4,T4)... 共 10 个单元 */
        lsmestimate trt01pn*avisitn
            'W16: 研究药物 - 安慰剂'  0 0 0 0 0 0 0 0 -1 1,
            'W12 与 W16 差值之差'     0 0 0 0 0 0 -1 1 1 -1
            / cl divisor=1,1 joint e;
        ods output LSMEstimates=lsm_est Coef=lsm_coef;
    run;
    选项作用说明
    逗号 ,分隔多行(每行一个估计量)每行独立出一条 t 检验
    DIVISOR=每行的除数写"平均"时用,如 divisor=2,1
    CL输出置信限需配合 PROC MIXED ... CL 或 ALPHA=
    JOINT对各行做联合 F 检验多行整体检验,而不是逐行 t 检验
    E打印 L 矩阵系数核对系数是否落在预期的 LSMean 上
    ADJUST=多重比较调整调整后 P 值,不要当名义 P 值用
    AT / OM / BYLEVEL改变协变量取值或边际权重连续协变量取特定值时用 AT

    输出数据集 LSMEstimates 的常用字段:Effect(对应的 LSMEANS 效应)、Label(你写的行标签)、Estimate、StdErr、DF、tValue、Probt、Alpha、Lower、Upper。加了 JOINT 时还会额外输出联合检验(F 值与 NumDF/DenDF)。

    系数顺序是最大的坑
    系数的书写顺序对应 LSMean 水平组合的字典序——由 CLASS 变量在效应中的排列与水平取值共同决定,和你在 LSMEANS 里"心里的顺序"不一定一致。写完后必须用 E 选项打印 Coef 表核对:若标签说"研究药物 − 安慰剂"但系数落在了别的单元格上,数值会和标签完全不符。先 E,后定稿。

    20.5 SLICE:选项与语句的区别

    这是一个高频混淆点,先给结论:

    LSMEANS / SLICE= (选项)

    • 写在 LSMEANS 语句的斜杠后
    • lsmeans A*B / slice=B;
    • 含义:按 B 的每个水平,分别检验 A 的简单主效应
    • 依赖该 LSMEANS 语句指定的效应

    SLICE 语句 (独立语句)

    • 独立成句:slice trt01pn*avisitn / sliceby=avisitn diff cl;
    • 含义:对指定交互效应做分割分析
    • 可带 DIFF(给出各层内差值)、ADJUST=、CL
    • 不依赖是否写过 LSMEANS
    需要澄清的一点
    SLICE 既是 LSMEANS 语句的选项,也是一个独立语句;而 LSMESTIMATE 语句不接受 SLICE 选项——它的选项是 JOINT、ADJUST=、DIVISOR=、CL、E 等。三者是并列关系,不是嵌套关系。
    SAS
    /* 写法一:LSMEANS 的 SLICE= 选项 */
    lsmeans trt01pn*avisitn / slice=avisitn cl;
    ods output Slices=slc_a LSMeans=lsm;
    
    /* 写法二:SLICE 语句(可额外要差值) */
    slice trt01pn*avisitn / sliceby=avisitn diff cl adjust=tukey;
    ods output Slices=slc_b;

    两者都会产出 ODS 表名 Slices,输出标题为 Tests of Effect Slices。常用字段:

    字段含义
    Effect被分割的交互效应,如 TRT01PN*AVISITN
    SliceBy 水平变量当前切片所在的层(如 AVISITN=16)
    NumDF / DenDF该层内简单效应的分子/分母自由度
    FValue / ProbFF 检验,不是 t 检验
    Slices 是 F 检验,不是"每组差值"
    slice=avisitn 回答的是"在 W16 这一层,治疗组之间整体上有没有差异"(2 组时为 1 个分子自由度)。它不给出"研究药物 − 安慰剂 = −24.77"这样的带符号差值。要拿差值,须加 DIFF 选项,或回到 Diffs / LSMESTIMATE。

    20.6 STORE 语句:把模型存下来,交给 PROC PLM

    STORE 不产生任何输出表。它把分析上下文与结果写入一个二进制的 item store,之后由 PROC PLM 读取并做后处理——不需要重新拟合模型。对于跑一次要几十分钟的 UN 结构,这是最实在的省时手段。

    SAS
    proc mixed data=adeff_ana method=reml cl;
        class usubjid trt01pn(ref="1") avisitn;
        model chg = base trt01pn avisitn trt01pn*avisitn / ddfm=kr solution;
        repeated avisitn / subject=usubjid type=un;
        lsmeans trt01pn*avisitn / cl;
        store mmrm_store / label='W16 主分析 MMRM(UN, DDFM=KR)';
    run;
    
    /* 后续任意次后处理,都不再重跑模型 */
    proc plm restore=mmrm_store;
        show cov parms;                       /* 查看 item store 内容 */
        lsmeans trt01pn*avisitn / diff cl;    /* 继续用 KR 自由度 */
        lsmestimate trt01pn*avisitn 'W16 diff' 0 0 0 0 0 0 0 0 -1 1 / cl;
        slice trt01pn*avisitn / sliceby=avisitn diff;
    run;
    要点说明
    RESTORE=PROC PLM 读取 item store 的主选项(SOURCE= 亦可)
    DDFM 会被保留原拟合用了 DDFM=KR,PLM 后处理继续沿用 KR,不会退回默认
    PLM 支持的语句ESTIMATE、LSMEANS、LSMESTIMATE、SLICE、SCORE、SHOW、TEST、EFFECTPLOT、CODE、FILTER、WHERE
    无 CLASS / MODEL分类变量与模型信息都在 item store 里,PLM 里再写会报错
    不可跨平台item store 是二进制文件,Unix 上生成的不能在 Windows 上用
    命名建议带上结构与分析名,如 store mmrm_un_w16;,避免多结构探索时互相覆盖
    生产实践:一次拟合,多次取用
    典型用法是主分析程序里 STORE,然后在敏感性分析、亚组 TLF、附加列表程序里各自 PROC PLM RESTORE=。这样既保证 所有结果来自同一个拟合(避免不同程序各自重跑导致的细微差异),也省掉重复拟合的时间。
    21

    DIFFs 怎么读:ESTIMATE / CONTRAST / LSMESTIMATE 三方对照

    45 行 Diffs 里只有 5 行是访视内组间比较——剩下的 40 行是什么?

    DIFFs ESTIMATE CONTRAST LSMESTIMATE

    21.1 DIFFs 的规模:为什么是 45 行

    LSMEANS effect / DIFF 请求的是该效应全部水平组合之间、无重复的两两比较。若交互效应有 k 个单元格,Diffs 的行数就是组合数:

    $\text{行数} = \binom{k}{2} = \dfrac{k(k-1)}{2}$

    以本指南贯穿使用的真实 MMRM 输出为例:2 个治疗组 × 5 个访视 = 10 个单元格,于是 Diffs 有

    $\binom{10}{2} = \dfrac{10\times 9}{2} = 45\ \text{行}$

    而这 45 行里,访视内的治疗组比较只有 5 行(每个访视 1 条);其余 40 行是跨访视比较,例如「研究药物 W2 的 LSMean 减去安慰剂 W16 的 LSMean」,临床上通常没有解释意义。

    类别行数示例是否用于 TLF
    访视内组间比较5W16 研究药物 − W16 安慰剂✅ 主要终点
    同组跨访视比较10安慰剂 W16 − 安慰剂 W2❌
    跨组跨访视比较30研究药物 W2 − 安慰剂 W16❌
    推广到常见设计
    3 个治疗组 × 6 个访视 = 18 个单元格 → $\binom{18}{2}=153$ 行 Diffs,而 TLF 真正需要的往往只有 2 条(两个剂量组各自对安慰剂、在目标访视)。筛选不是"删行",而是把"模型能算的比较"限定为 SAP 定义的目标估计量。

    21.2 差值方向由两端决定,反向时 CI 必须成套翻转

    Estimate = 第一端 − 第二端。程序不应假定 ODS 一定按某个方向输出,稳妥做法是同时接受两个方向再统一:

    SAS
    data w16_diffs;
        set mmrm_diffs;
        where avisitn=16 and _avisitn=16          /* 两端都锁在 W16 */
          and (  (trt01pn in (4)   and _trt01pn=1)      /* 研究药物 - 安慰剂 */
              or (_trt01pn in (4)  and trt01pn=1) );    /* 安慰剂 - 研究药物(反向) */
        if trt01pn in (4) and _trt01pn=1 then do;
            trtn=trt01pn; diff=estimate; lcl=lower; ucl=upper;
        end;
        else do;
            trtn=_trt01pn; diff=-estimate; lcl=-upper; ucl=-lower;   /* 注意:上下限互换 */
        end;
        diff_se=stderr; diff_df=df; pvalue=probt;
    run;
    反向时最容易写错的一行
    原 CI 为 $(0.940,\ 1.483)$,反向后应是 $(-1.483,\ -0.940)$:两个端点都取负,同时交换上下限,即 lcl = -upper; ucl = -lower;。写成 lcl = -lower 会得到"方向对但 CI 反"的低级错误。SE 不受方向影响,双侧 P 值也不变;单侧检验不能套用这个结论。

    21.3 ESTIMATE / CONTRAST / LSMESTIMATE 三方对照

    三者的本质区别在于作用对象:ESTIMATE 与 CONTRAST 作用于固定效应参数 $\boldsymbol\beta$,LSMESTIMATE 作用于最小二乘均值。

    维度ESTIMATECONTRASTLSMESTIMATE
    作用对象 固定效应参数 $\boldsymbol\beta$ 固定效应参数 $\boldsymbol\beta$ LSMean(边际均值)
    返回内容 标量估计值 + SE + CI + t 检验 P 值 只有 F 检验(NumDF/DenDF/F/P),不给估计值 标量估计值 + SE + CI + t 检验 P 值
    检验类型 单自由度 t 检验 可多自由度 F 检验 单自由度 t 检验;JOINT 可做多自由度联合 F
    ODS 表名 Estimates Contrasts LSMEstimates
    系数书写 按效应/水平写 $\beta$ 的系数,需清楚参数化与参考水平 同左 按 LSMean 的水平组合写,与 $\beta$ 的参数化无关
    受参考水平影响 是,强依赖 是(但可估的对比结果与参数化无关) 否
    不可估时 输出 Non-est 输出 Non-est 输出 Non-est
    与 DIFF 的关系 可复现某条 Diffs 行 单自由度时 F = t²,P 值相同 可复现某条 Diffs 行,且写法最贴近 TLF 语言

    21.4 同一个 W16 差值的三种写法

    目标估计量固定为:W16 时「研究药物 − 安慰剂」的 LSMean 差值。模型为 CHG = BASE TRT01PN AVISITN TRT01PN*AVISITN,trt01pn(ref="1")、AVISITN 参考水平为 16。

    ① ESTIMATE:直接写 β 的系数

    estimate 'W16 diff'
        trt01pn 1 -1
        trt01pn*avisitn
            0 0 0 0 0 0 0 0 1 -1
        / cl;

    交互项系数必须严格按水平组合顺序写。写错一个位置就会得到完全无关的量,且不会报错。

    ② CONTRAST:只给 F 检验

    contrast 'W16 diff'
        trt01pn 1 -1
        trt01pn*avisitn
            0 0 0 0 0 0 0 0 1 -1;

    得到 NumDF=1 的 F 检验,$F = t^2$,P 值与 ESTIMATE 相同;但拿不到 −24.77 这个估计值和它的 CI。

    ③ LSMESTIMATE:写 LSMean 的系数

    lsmestimate trt01pn*avisitn
        'W16 diff' 0 0 0 0 0 0 0 0 -1 1
        / cl e;

    语义就是"第 10 个单元格减第 9 个单元格",与 TLF 语言一致;加 E 可核对系数落点。推荐首选。

    为什么推荐 LSMESTIMATE
    含 TRT01PN*AVISITN 交互时,ESTIMATE 要同时写主效应和交互项的系数,位置依赖 CLASS 水平顺序,是统计编程里最典型的静默错误来源。LSMESTIMATE 把问题从"β 的第几个元素"翻译成"第几个单元格",后者可以用 E 选项直接打印出来核对。

    21.5 各自适用场景

    1

    标准两两比较 → 用 DIFF

    SAP 要的就是"某访视上 A − B",直接用 LSMEANS / DIFF 并从 Diffs 里筛选。不要为了"看起来专业"改用 ESTIMATE 重写一遍——多一次手写系数就多一次出错机会。

    2

    只要整体 P 值 → 用 CONTRAST

    交互项整体检验、多个水平合并检验、剂量趋势的正交多项式对比等多自由度场合。若只关心"是否显著"而不关心效应量,CONTRAST 最简洁。

    3

    自定义 LSMean 对比 → 用 LSMESTIMATE

    合并剂量组、跨访视平均、多个单元格的加权对比、SAP 明确写为"LSMean 的线性组合"的估计量。需要联合检验时加 JOINT。

    4

    需要与 SolutionF 对齐 → 用 ESTIMATE

    当统计师要求核对"某个固定效应系数"或做模型诊断时。但永远不要把 SolutionF 里的某行直接当作目标访视的治疗差值——参见 22.5 节的陷阱。

    不可估(Non-est)意味着什么
    三种写法都可能输出 Non-est。它表示所请求的线性组合不是 $\boldsymbol\beta$ 的可估函数——常见于某个治疗组在目标访视完全没有观测、或单元格缺失导致设计矩阵秩不足。此时应先检查单元格观测数,而不是调整系数"凑"出一个数值。
    22

    实跑示例:一份真实 MMRM 输出的逐表解读

    从 Model Information 一路读到 Diffs,再从统计量走到临床解读

    PROC MIXED 真实输出 独立复现
    数据来源与掩蔽说明
    本节示例来自一项银屑病关节炎(PsA)II 期研究(下称 STUDY-XX-201)某亚组的 MMRM 分析输出。按合规要求,研究编号、药物代号、公司信息与受试者编号均已替换;所有统计量数值未作改动。为便于对照,另用一套独立实现的 REML 估计器在相同设计骨架的模拟数据上重跑,结果见 22.4。

    22.1 分析背景

    项目内容
    适应症 / 分期银屑病关节炎(PsA),II 期
    终点DAPSA 较基线变化(CHG),数值越低越好
    分析访视W2、W4、W8、W12、W16(目标访视 W16)
    固定效应CHG = BASE TRT01PN AVISITN TRT01PN*AVISITN
    治疗组编码TRT01PN=1 安慰剂(参考水平),TRT01PN=4 研究药物
    亚组处理按 SAP 规定,亚组样本量小时不纳入分层因素,故本模型含 0 个分层变量
    SAP 规定结构UN;若不收敛则依次尝试 TOEPH(1) → ARH(1) → HCS → SP(POW) → CS,按 AIC 选
    自由度DDFM=KR

    22.2 实际运行的程序

    SAS
    /* 0. 清理上一轮结果:避免不收敛时残留旧数据集被误用 */
    proc datasets lib=work nolist;
        delete lsm diffs;
    quit;
    
    /* 1. 先探 UN 是否收敛(只要 ConvergenceStatus,不要结果表) */
    ods select none;
    ods output ConvergenceStatus=conv_un;
    proc mixed data=sub_ana(where=(chg>.)) method=reml;
        class usubjid trt01pn avisitn;
        model chg = base trt01pn avisitn trt01pn*avisitn / ddfm=kr residual;
        repeated avisitn / subject=usubjid type=un;
    run;
    ods select all;
    
    /* 2. 若 UN 未收敛,遍历回退链,记录各结构 AIC */
    %let methlist=TOEPH|ARH(1)|CS|CSH|SP(POW)(avisitn_n);
    /*   …… 逐个 PROC MIXED,把 FitStatistics 中的 AIC 汇总到数据集 AIC …… */
    
    /* 3. 按 AIC 最小选定结构,重跑并取结果 */
    proc mixed data=sub_ana(where=(chg>.)) method=reml cl;
        class usubjid avisitn trt01pn(ref="1");
        model chg = base trt01pn avisitn trt01pn*avisitn / ddfm=kr solution;
        repeated avisitn / subject=usubjid type=&curr_type.;
        lsmeans trt01pn*avisitn / pdiff cl;
        ods output LSMeans=lsm Diffs=diffs ConvergenceStatus=conv;
    run;
    
    /* 4. 收敛判定:reason 必须正好是 "Convergence criteria met." */
    proc sql noprint;
        select count(*) into :fail_cnt from conv
        where reason ne "Convergence criteria met.";
    quit;
    两个值得抄走的工程细节
    ① 先 delete 再跑。不收敛时 PROC MIXED 不会覆盖上一次的 lsm/diffs,残留数据会被下游当成有效结果。跑之前 proc datasets delete 是最便宜的保险。 ② 用 reason 判定收敛。不要靠"日志里没有 ERROR"来判断;把 ConvergenceStatus 存下来,用 reason ne "Convergence criteria met." 精确判断。

    22.3 逐表解读

    ① Model Information —— QC 第一步

    条目本例要核对什么
    Covariance StructureCompound Symmetry是否等于 SAP 规定结构?若不是,回退是否被记录与批准?
    Subject EffectUSUBJID必须是受试者,不能是访视或中心
    Estimation MethodREMLMMRM 标准选择
    Residual Variance MethodProfileSAS 默认;残差方差被 profile 掉
    Fixed Effects SE MethodKenward-Roger与 SAP 一致
    Degrees of Freedom MethodKenward-Roger与 DDFM= 一致

    本例的第一条结论:主结构 UN 没有收敛,程序按 SAP 回退链落到了 CS。这个事实必须在 QC 记录和 CSR 脚注中体现——"用的是什么结构"本身就是需要申报的信息。

    ② Class Level Information —— 数清楚水平

    ClassLevelsValues核对要点
    USUBJID36(已掩蔽)是否等于分析中应有的受试者数
    AVISITN52 4 8 12 16是否只含计划分析访视;顺序是否与 REPEATED 一致
    TRT01PN24 1参考水平是否为安慰剂(本例用 ref="1" 显式指定)

    ③ Dimensions —— 19 与 11 的差别

    条目本例说明
    Covariance Parameters2CS + Residual
    Columns in X19过参数化设计矩阵的列数
    Columns in Z0MMRM 无随机效应,Z 为空
    Subjects36与 Class Levels 中 USUBJID 一致
    Max Obs per Subject5最多 5 个基线后访视
    Columns in X = 19,但可估参数只有 11
    SAS 采用 GLM 式过参数化:
    $1(\text{截距}) + 1(\text{BASE}) + 2(\text{TRT01PN}) + 5(\text{AVISITN}) + 10(\text{TRT01PN}\times\text{AVISITN}) = 19$ 列。
    但 $\mathrm{rank}(X) = 1+1+\underbrace{1}_{2-1}+\underbrace{4}_{5-1}+\underbrace{4}_{(2-1)(5-1)} = 11$。
    19 是列数,11 是可估参数个数。把它们混为一谈会导致对自由度和秩的误判。在 Solution for Fixed Effects 里你会看到 19 行,其中 8 行的 Estimate 恰好为 0(参考水平),它们不是"被估成 0",而是参数化产生的冗余约束。

    ④ Number of Observations —— 缺失了多少

    条目数值
    Number of Observations Read80
    Number of Observations Used80
    Number of Observations Not Used0

    36 名受试者 × 5 个访视 = 180 个理论观测点,实际只有 80 条进入分析,缺失 100 条(55.6%)。Read = Used 且 Not Used = 0 说明没有因协变量缺失被剔除的记录。这个缺失比例解释了为什么 UN(15 个协方差参数)在此亚组上无法收敛。

    ⑤ Iteration History —— 优化过程本身

    IterationEvaluations−2 Res Log LikeCriterion
    01567.61403563 
    12550.091186110.01196918
    21546.884199420.00404797
    31545.863239840.00063691
    41545.715773340.00002074
    51545.711330830.00000003
    61545.711325520.00000000
    • 目标函数单调下降:567.61 → 545.71,共下降 21.90。
    • Criterion 是基于梯度的收敛判据(不是相邻两次目标函数的差),从 0.012 一路降到 $3\times10^{-8}$。
    • Iteration 1 的 Evaluations = 2:这一步做了线搜索(步长折半),所以多算了一次似然。
    • 判读要点:下降是否平稳。若出现反复震荡、或目标函数在最后几步仍在明显变化,即使打了"Convergence criteria met"也要警惕。

    ⑥ Covariance Parameter Estimates —— 方差成分

    Cov ParmSubjectEstimateLowerUpper
    CSUSUBJID73.202824.1387122.27
    Residual 61.779841.8791100.26

    CS 结构的含义是 $\Sigma = \sigma_{cs}\,J + \sigma^2_e\,I$,因此:

    • 各访视方差 $= 73.2028 + 61.7798 = 134.9826$,即 SD = 11.62
    • 组内相关系数(ICC)$= \dfrac{73.2028}{134.9826} = \mathbf{0.5423}$
    • 两条置信区间都不含 0,且 CS 的下限 24.14 远离 0,说明受试者内相关确实存在
    CS 的置信区间为什么不对称?
    注意 CS 的 CI 是 $(24.1387,\ 122.27)$:下限距估计值 49.06,上限距估计值 49.07——基本对称;而 Residual 的 CI $(41.8791,\ 100.26)$ 下限距 19.90、上限距 38.48,明显不对称。这是因为 SAS 对协方差参数的置信限并非在原始尺度上做对称 Wald 区间,而是在变换后的尺度上构造再反变换回来。因此不要用 (Upper−Lower)/(2×1.96) 去反推标准误——要标准误应另取渐近协方差矩阵(ASYCOV 选项)。

    ⑦ Fit Statistics 与 Null Model LRT —— 三个指标用了三个不同的 n

    指标数值公式SAS 用的 n验算
    −2 Res Log Likelihood545.7$-\,2\ell_R$—545.7113
    AIC549.7$-2\ell_R + 2d$不涉及 n$545.7113+2\times2=549.71$ ✓
    AICC549.9$-2\ell_R + \dfrac{2dn}{n-d-1}$$n = N - \mathrm{rank}(X) = 80-11 = \mathbf{69}$$545.7113+\frac{4\times69}{66}=549.89$ ✓
    BIC552.9$-2\ell_R + d\log n$$n = \text{有效受试者数} = \mathbf{36}$$545.7113+2\ln36=552.88$ ✓
    这是本指南最值得记住的一个坑
    SAS 文档明确规定:对于 REML,AICC 使用 SAS 6 口径的 n(观测数 − X 的秩),而 BIC 使用 Dimensions 表中的"有效受试者数",AIC 则完全不涉及 n。本例中三个 n 分别是 69、36、—。若在自研实现或跨软件复核时统一用一个 n,AIC/BIC 会对不上,且差值恰好落在容易被误认为"算错"的量级上。

    Null Model Likelihood Ratio Test:DF = 1,$\chi^2$ = 21.90,$p < .0001$。它检验的是 $H_0:\ \sigma_{cs}=0$(即退化为独立残差)。1 个自由度、$\chi^2$ 显著,说明纳入受试者内相关是必要的。

    ⑧ Solution for Fixed Effects(节选)

    Effect水平EstimateStd ErrorDFt ValuePr > |t|
    Intercept −14.256910.192461.5−1.400.1669
    BASE −0.071010.0716532.6−0.990.3289
    TRT01PN4−24.770012.744551.7−1.940.0574
    TRT01PN10....
    AVISITN215.02959.087345.11.650.1051
    AVISITN43.76909.131244.40.410.6818
    AVISITN8−0.55609.282443.8−0.060.9525
    AVISITN12−13.03709.969742.5−1.310.1980
    AVISITN160....
    AVISITN*TRT01PN2, 422.937812.692545.51.810.0774
    AVISITN*TRT01PN4, 430.137412.770544.62.360.0227
    AVISITN*TRT01PN8, 423.988012.924944.11.860.0702
    AVISITN*TRT01PN12, 419.878613.813242.71.440.1574
    AVISITN*TRT01PN16, 40....

    ⑨ Type 3 Tests of Fixed Effects

    EffectNum DFDen DFF ValuePr > F解读
    BASE132.60.980.3289基线协变量无显著影响
    TRT01PN160.11.310.2568不是治疗主效应检验(见 22.5)
    AVISITN444.215.97<.0001均值随访视显著变化
    AVISITN*TRT01PN445.41.730.1608本亚组未见显著交互

    ⑩ Least Squares Means(10 行 = 2 组 × 5 访视)

    AVISITNTRT01PNEstimateStd ErrorDFtPr > |t|95% CI
    24−5.29232.511550.6−2.110.0401(−10.3353, −0.2493)
    21−3.46013.270751.4−1.060.2950(−10.0250, 3.1047)
    44−9.35322.972262.8−3.150.0025(−15.2930, −3.4134)
    41−14.72063.893963.7−3.780.0003(−22.5004, −6.9409)
    84−19.82773.341768.1−5.93<.0001(−26.4958, −13.1597)
    81−19.04574.637169.0−4.110.0001(−28.2964, −9.7950)
    124−36.41815.418857.9−6.72<.0001(−47.2653, −25.5709)
    121−31.52676.719660.1−4.69<.0001(−44.9674, −18.0859)
    164−43.25978.922048.7−4.85<.0001(−61.1923, −25.3270)
    161−18.48969.097553.1−2.030.0471(−36.7361, −0.2431)

    注意 Pr > |t| 这一列是该 LSMean 与 0 比较的 P 值("该组的平均变化是否不为 0"),不是组间比较 P 值。想回答"研究药物是否优于安慰剂",必须去 Diffs。

    ⑪ Differences of Least Squares Means —— 45 行里只取 5 行

    如 21.1 所述,10 个单元格产生 $\binom{10}{2}=45$ 条比较。其中访视内的组间比较只有 5 条:

    访视研究药物 − 安慰剂SEDFtPr > |t|95% CI
    W2−1.83224.032752.1−0.450.6515(−9.9241, 6.2597)
    W45.36744.877164.41.100.2752(−4.3746, 15.1095)
    W8−0.78205.710768.9−0.140.8915(−12.1747, 10.6106)
    W12−4.89158.640260.2−0.570.5734(−22.1734, 12.3904)
    W16−24.770012.744551.7−1.940.0574(−50.3478, 0.8077)

    读结果的结论:W16 时研究药物相对安慰剂的 DAPSA 变化差值估计为 −24.77(负号方向有利于研究药物,因为 DAPSA 越低越好),95% CI 为 $(−50.35,\ 0.81)$ 跨过 0,双侧 $p=0.0574$。因此该亚组在 W16 未达到 0.05 水平的统计学显著性——但这是一个亚组分析,样本量小、缺失率高,本就不以支持确证性结论为目的。

    注意 W16 的 SE 明显大于 W2
    W2 的 SE 是 4.03,W16 是 12.74,相差 3 倍。原因是 W16 的观测数大幅减少(脱落)+ 该访视的方差更大。这提醒我们:同一模型里不同访视的精度可以差很多,不能因为"用的是同一个模型"就假定各访视精度相同。

    22.4 独立复现:自研 REML 估计器的交叉验证

    本机没有 SAS,为验证上述解读所依据的计算逻辑,我用 numpy/scipy 从零实现了一套 REML 估计器(解析 score 与 Fisher 信息、Fisher scoring 迭代、Kenward-Roger 校正),在相同设计骨架的模拟数据上重跑:36 名受试者、5 个访视、80 条观测、缺失率 55.6%,真实协方差参数就设为真实输出估计出的 CS=73.2028 / Residual=61.7798。

    量真实 SAS 输出自研引擎独立实现说明
    观测数 / 受试者数80 / 3680 / 36设计一致
    UN(15 参数)未收敛(触发回退)too many likelihood evaluations同样失败 ✓
    最终结构CSCS(AIC 427.26 → 552.00 最小)一致 ✓
    CS 估计73.202876.4574真值 73.2028,还原良好
    Residual 估计61.779860.4327真值 61.7798
    CS 渐近 SE≈25(由 CI 反推)28.3331量级一致
    Residual 渐近 SE≈13.8(由 CI 反推)14.0333高度一致
    −2 Res Log Like545.7113547.9963不同数据实现,不可直接相等
    AIC / AICC / BIC549.7 / 549.9 / 552.9552.00 / 552.18 / 555.16同上,差约 2.3
    W16 LSMean(研究药物)−43.2597−43.4670模拟真值即取自此
    W16 LSMean(安慰剂)−18.4896−19.3717—
    W16 差值−24.7700−24.0952一致 ✓
    Diffs 行数 / 访视内行数45 / 545 / 5组合数一致 ✓
    引擎的三条自检(都通过了)
    ① KR 实现:在均衡无缺失数据(60 受试者 × 5 访视)上,KR 调整后 SE 相对 model-based SE 的膨胀比为 1.0004,KR 自由度 57.65 对上"受试者数 − 组数 = 58"。
    ② 信息矩阵:解析解 $\mathcal I$ 与数值 Hessian $\tfrac12\nabla^2(-2\ell_R)$ 最大相对偏差 4%(有限差分误差量级)。
    ③ 尺度口径:补上常数项 $(N-p)\log 2\pi$ 后,−2RLL 与真实输出同量级(差 2.3,源于不同数据实现)。

    22.5 三个必须记住的陷阱

    1

    TRT01PN 的系数恰好等于 W16 的差值——这是巧合,不是规律

    本例中 TRT01PN 4 的估计是 −24.7700,而 W16 的 Diffs 也是 −24.7700。完全相等的原因是:AVISITN 的参考水平是 16、TRT01PN 的参考水平是 1,于是"治疗主效应"这一项在代数上恰好就是"参考访视(W16)上的治疗差值"。

    一旦 ref= 改变、或改用其他参数化,这个等式立即失效。不要从 SolutionF 里抄一个系数当作目标访视的治疗差值。

    2

    Type 3 的 TRT01PN P 值不是"治疗是否有效"

    含交互项时,Type 3 的 TRT01PN 检验的是"在参考访视上治疗效应是否为 0"(或因参数化而异的某个特定对比),不是跨所有访视的整体治疗效应。本例 $p=0.2568$,而 W16 的差值 $p=0.0574$——两者回答的是不同问题。

    3

    不要把亚组结果当成确证性结论

    本亚组 36 例、缺失 55.6%、UN 无法收敛而回退到 CS。这些条件决定了它的定位是探索性/一致性考察。任何"某亚组显著/不显著"的表述都必须伴随样本量、缺失率和结构回退的说明。

    22.6 从统计量到临床解读:−24.77 到底意味着什么

    把 LSMean 差值读成结论,需要三步,缺一步就会出错。下面用本例真实的访视别差值走一遍。

    第一步 · 方向:先确认终点是"越低越好"还是"越高越好",再看差值的符号指向哪一侧。
    →
    第二步 · 幅度:把点估计与预先规定的临床重要差异界值比较,而不只是与 0 比较。
    →
    第三步 · 稳健性:看 CI 宽度、缺失率、结构回退与敏感性分析,判断这个估计有多"脆"。

    访视别差值:真实的完整轨迹

    访视研究药物 LSMean安慰剂 LSMean差值(药物 − 安慰剂)SEDF95% CIP
    W2−5.2923−3.4601−1.83224.032752.1(−9.92, 6.26)0.6515
    W4−9.3532−14.7206+5.36744.877164.4(−4.37, 15.11)0.2752
    W8−19.8277−19.0457−0.78205.710768.9(−12.17, 10.61)0.8915
    W12−36.4181−31.5267−4.89158.640260.2(−22.17, 12.39)0.5734
    W16−43.2597−18.4896−24.770012.744551.7(−50.35, 0.81)0.0574

    终点为 DAPSA 较基线变化,数值越低越好,因此负值表示研究药物组改善更多。数据来源:Differences of Least Squares Means,同访视 TRT01PN=4 减 TRT01PN=1。

    轨迹能读出什么(以及不能读出什么)

    1

    分离主要发生在 W12 之后,且来自安慰剂组回退

    研究药物组从 W12 的 −36.4181 继续改善到 W16 的 −43.2597(再降 6.84);安慰剂组却从 −31.5267 反弹到 −18.4896(回退 13.04)。W16 的组间差距,很大程度上是安慰剂组失去已获得的改善造成的,而不是研究药物组在后段"额外发力"。

    2

    W4 的反向信号不应过度解读

    W4 差值为 +5.3674(安慰剂改善更多),W8 又回到 −0.7820。在 36 例、缺失 55.6% 的亚组里,这种符号摆动属于噪声范围。逐访视挑出"最好的那个 P 值"是选择性报告,必须整体呈现五个访视。

    3

    SE 随访视递增,是信息量在流失

    SE 从 4.0327(W2)升到 12.7445(W16),DF 从 68.9 降到 51.7。这不是模型变差,而是后段可用观测越来越少。W16 的 CI 宽达 51.16,说明"点估计最大"与"证据最强"是两回事。

    4

    差值可以分解,便于复核

    W16 的差值 = W12 已有的差值 + W12→W16 新增的分离:
    $\underbrace{-24.7700}_{\text{W16}} = \underbrace{(-4.8915)}_{\text{W12}} + \underbrace{(-19.8785)}_{\text{W12}\to\text{W16}}$
    "新增分离"可两条途径独立算出、互为复核:
    ① 从差值表:$(-24.7700) - (-4.8915) = -19.8785$;
    ② 从 LSMean:$({-43.2597}+36.4181) - ({-18.4896}+31.5267) = (-6.8416) - (13.0371) = -19.8787$。
    两条途径相差 0.0002,来自 LSMean 四位小数的显示舍入,不是错误。这一步能验证报表拼接是否取错了访视。

    W16 的 −24.77,临床结论该怎么写

    维度本例事实可以写 / 不可以写
    方向 点估计为负,终点越低越好 → 方向上支持研究药物 ✅ 可以说"数值上更有利于研究药物";
    ❌ 不能说"研究药物显著优于安慰剂"
    统计不确定性 95% CI (−50.35, 0.81) 跨越 0,P = 0.0574 ✅ 可以说"与无差异相容,不能排除无效";
    ❌ 不能写"P 接近 0.05,因此有效"
    幅度 CI 下限 −50.35 提示若真有效幅度可能很大;上限 0.81 提示几乎不能排除轻微不利 ✅ 可以说"估计精度不足以定性";
    ❌ 不能只报点估计而不报 CI
    临床重要性 需与 SAP 预先规定的 MID 比较 ✅ 把点估计与 CI 同 MID 界值一起画在图上;
    ❌ 事后找"看起来合适"的界值
    证据级别 36 例亚组、缺失 55.6%、UN 未收敛回退 CS ✅ 标注"探索性 / 一致性考察";
    ❌ 作为确证性结论
    统计显著 ≠ 临床重要
    两者交叉出四种情形,处理方式完全不同:
    临床幅度 ≥ MID临床幅度 < MID
    P < 0.05既显著又重要 —— 最强结论显著但不重要 —— 需说明临床价值有限
    P ≥ 0.05重要但不显著 —— 本例属于此类区间:幅度可能可观但证据不足,应如实报告并提示样本量限制既不显著也不重要
    判定时必须用CI 与 MID 的关系,而不是只看 P 值是否过线:CI 完全落在 MID 之外才是最强的"临床重要"证据。
    程序员的解读边界
    统计程序员负责把数字、方向、不确定性、方法学限制准确呈现出来;"这个结果是否有临床意义"由医学与统计师判断。交付 TLF 时应确保:终点方向在表头写明("较基线变化,负值表示改善")、五个访视整体呈现而非挑选、缺失率与结构回退在脚注中可见、主分析与敏感性分析并列 —— 做到这些,解读的责任边界就清楚了。
    23

    方差参数的计算原理:REML 全链路推导

    从 $V$ 的构造到 score、Fisher 信息、迭代收敛,再到 Kenward-Roger

    REML Newton-Raphson Fisher Information Kenward-Roger

    23.1 模型与符号

    MMRM 是没有随机效应的混合模型:$Z = 0$,$G$ 不出现,因此 $V = R$。对受试者 $i$:

    $y_i = X_i\boldsymbol\beta + e_i,\qquad e_i \sim N(0,\ V_i)$

    全部受试者堆叠后 $V = \mathrm{blockdiag}(V_1,\dots,V_n)$,$\mathrm{rank}(X)=p$,$N=\sum_i m_i$。

    图 23-1 · 协方差结构:同一张 V 矩阵的不同参数共享方式 可切换风格 / 演示 / 导出 PNG
    UN 不共享任何格子(n 个访视即 n(n+1)/2 个参数:n=5 时 15 个,n=6 时 21 个,推导见 S11 参数沙盘),CS 把方差与相关全部压缩成 2 个参数。参数越多越易不收敛,越少越易模型误设。

    23.2 $V$ 的构造:缺失是怎么进入矩阵的

    这是理解"MMRM 不填补缺失"的关键。设 $\Sigma$ 是 $T\times T$ 的完整访视协方差矩阵,受试者 $i$ 实际观测到的访视下标集合为 $\mathcal{O}_i$(如 $\{1,3,5\}$ 表示只有 W2、W8、W16 有数据),则

    $V_i = \Sigma[\mathcal{O}_i,\ \mathcal{O}_i]$

    即取出 $\Sigma$ 对应的行与列构成子矩阵。受试者 $i$ 贡献 $m_i=|\mathcal{O}_i|$ 行,不同受试者的 $m_i$ 可以不同。全程没有任何一步需要填补缺失值——这就是 MAR 下 MMRM 能直接使用不完整纵向数据的矩阵解释,也是它与 LOCF / MI 的根本区别。

    直接推论
    由于 $V_i$ 的维数随缺失模式变化,$\log|V| = \sum_i \log|V_i|$ 不能化成 $N\log|\Sigma|$ 这样的简单形式。这正是 MMRM 必须迭代求解、而不像均衡 ANOVA 那样有闭式解的原因。

    23.3 从 ML 到 REML:把 $\boldsymbol\beta$ 积分掉

    完整数据的对数似然为

    $\ell_{ML}(\boldsymbol\beta,\theta) = -\dfrac{N}{2}\log 2\pi - \dfrac12\log|V| - \dfrac12 (y-X\boldsymbol\beta)'V^{-1}(y-X\boldsymbol\beta)$

    ML 把 $\boldsymbol\beta$ 当作未知参数一起估计,导致方差参数被系统性低估(未扣除 $p$ 个自由度)。REML 的做法是把 $\boldsymbol\beta$ 从似然中"积分掉",只基于 $N-p$ 个与 $\boldsymbol\beta$ 正交的误差对比做推断。

    核心的代数分解(关键一步):

    $(y-X\boldsymbol\beta)'V^{-1}(y-X\boldsymbol\beta) = r'V^{-1}r + (\boldsymbol\beta-\hat{\boldsymbol\beta})'(X'V^{-1}X)(\boldsymbol\beta-\hat{\boldsymbol\beta})$

    其中 $\hat{\boldsymbol\beta} = (X'V^{-1}X)^{-1}X'V^{-1}y$ 是 GLS 估计,$r = y - X\hat{\boldsymbol\beta}$。右侧第二项与 $\boldsymbol\beta$ 有关、与 $\theta$ 无关(在积分时 $\hat{\boldsymbol\beta}$ 视为常量),于是

    $\int \exp\Big\{-\tfrac12(\boldsymbol\beta-\hat{\boldsymbol\beta})'(X'V^{-1}X)(\boldsymbol\beta-\hat{\boldsymbol\beta})\Big\}\,d\boldsymbol\beta = (2\pi)^{p/2}\,|X'V^{-1}X|^{-1/2}$

    整理得到 REML 对数似然:

    REML 目标函数

    $$\ell_R(\theta) = -\frac{N-p}{2}\log 2\pi - \frac12\log|V| - \frac12\log|X'V^{-1}X| - \frac12 r'V^{-1}r$$

    即 SAS 最小化的目标:$$\boxed{-2\ell_R = \underbrace{(N-p)\log 2\pi}_{\text{常数项,最易漏}} + \log|V| + \log|X'V^{-1}X| + r'V^{-1}r}$$

    自研实现时最容易漏的一项
    括号里的 $(N-p)\log 2\pi$ 与 $\theta$ 无关,不影响参数估计值,但影响 −2 Res Log Likelihood 的数值。SAS 报告的 −2RLL 含这一项。漏掉它,本例会差出 $(N-p)\log 2\pi = 69\times 1.8379 = \mathbf{126.8}$, 足以让你以为自己算错了。我在实现时正是靠这个差值定位到问题:自研引擎最初给出 421.18,加上常数项后 547.996,与真实输出的 545.711 同量级。

    23.4 Profiling:先消掉 $\boldsymbol\beta$ 与残差尺度

    输出里的 Residual Variance Method: Profile 指的是:SAS 把残差方差"profile"出去——即把 $V$ 写成 $\sigma^2 \tilde V(\tilde\theta)$,对给定的 $\tilde\theta$ 解析地求出 $\hat\sigma^2$,再代回目标函数,使优化只在降维后的参数空间进行。这既减少迭代维数,也改善数值稳定性。

    $\hat{\boldsymbol\beta}$ 的处理同理:它总是取 GLS 闭式解,因此目标函数实际上只依赖 $\theta$。

    23.5 Score 与 Fisher 信息的推导

    记

    $C = (X'V^{-1}X)^{-1},\qquad P = V^{-1} - V^{-1}XCX'V^{-1},\qquad V_h = \dfrac{\partial V}{\partial\theta_h}$

    对 $-2\ell_R$ 逐项求偏导(利用 $\partial V^{-1}/\partial\theta_h = -V^{-1}V_hV^{-1}$):

    项偏导
    $\log|V|$$\operatorname{tr}(V^{-1}V_h)$
    $\log|X'V^{-1}X|$$-\operatorname{tr}\!\big(C\,X'V^{-1}V_hV^{-1}X\big)$
    $r'V^{-1}r$$-r'V^{-1}V_hV^{-1}r$(由包络定理,$\hat{\boldsymbol\beta}$ 视为固定)

    关键恒等式:$V^{-1}r = V^{-1}(y-X\hat{\boldsymbol\beta}) = \big(V^{-1} - V^{-1}XCX'V^{-1}\big)y = Py$,因此

    $r'V^{-1}V_hV^{-1}r = y'PV_hPy$

    又 $\operatorname{tr}(PV_h) = \operatorname{tr}(V^{-1}V_h) - \operatorname{tr}\!\big(CX'V^{-1}V_hV^{-1}X\big)$,三项合并即得:

    REML score 与 Fisher 信息

    $$s_h \;=\; \frac{\partial \ell_R}{\partial\theta_h} \;=\; -\frac12\operatorname{tr}(P V_h) \;+\; \frac12\,y'PV_hPy$$

    $$\mathcal{I}_{hj} \;=\; E\!\left[-\frac{\partial^2\ell_R}{\partial\theta_h\partial\theta_j}\right] \;=\; \frac12\operatorname{tr}(P V_h P V_j)$$

    实现校验:我把解析的 $\mathcal I$ 与用有限差分算出的 $\tfrac12\nabla^2(-2\ell_R)$ 逐一比对,最大相对偏差约 4%(有限差分在目标函数量级为 548、步长 $10^{-4}$ 时的正常误差)。两者一致说明上面的推导与代码实现是自洽的。

    图 23-2 · REML 估计的迭代结构 β 有闭式解,θ 只能迭代
    每次迭代都是「给定 θ 更新 β,再更新 θ」的两步嵌套;未收敛时回到 GLS 步骤用新的 θ 重走一遍。

    23.6 迭代与收敛判据

    Fisher scoring / Newton-Raphson 的更新格式为

    $\theta^{(t+1)} = \theta^{(t)} + \mathcal{I}\big(\theta^{(t)}\big)^{-1}\, s\big(\theta^{(t)}\big)$

    实际实现还要加线搜索:若整步不能使目标函数下降,就把步长折半——真实输出的 Iteration 1 显示 Evaluations = 2,正是这一步多算了一次似然。

    设置SAS 默认含义
    MAXITER=50最大迭代次数;超出 → Did not converge
    MAXFUNC=150最大似然评估次数;超出 → too many likelihood evaluations
    Criterion—基于梯度的收敛判据,不是相邻两次目标函数之差
    本例的迭代轨迹
    真实输出:567.61403563 → 550.09118611 → 546.88419942 → 545.86323984 → 545.71577334 → 545.71133083 → 545.71132552(6 次迭代,Criterion 降至 $3\times10^{-8}$)。
    自研引擎:573.62166243 → 552.65358918 → 548.19334146 → 547.99669056 → 547.99633168 → 547.99633167(5 次迭代)。
    两者形状完全一致:第一步跨度最大,之后快速收敛——这是 CS 这种只有 2 个协方差参数的结构的典型表现。UN 有 15 个参数,似然曲面复杂得多,收敛也慢得多(参见 24 节 UN 失败的迭代记录)。

    23.7 以 CS 为例把导数落到实处

    CS 结构下 $\Sigma = \sigma_{cs}J + \sigma^2_e I$,于是

    $\dfrac{\partial\Sigma}{\partial\sigma_{cs}} = J,\qquad \dfrac{\partial\Sigma}{\partial\sigma^2_e} = I$

    对受试者 $i$ 的分块 $V_i = S_i'\Sigma S_i$($S_i$ 为选择矩阵),有 $\partial V_i/\partial\theta_h = S_i'(\partial\Sigma/\partial\theta_h)S_i$。代回 23.5 的两条公式即可——本例 $\mathcal I$ 为 $2\times2$:

    I = [ 7.84e+00 3.34e+00 ; 3.34e+00 1.997e+01 ]  (自研引擎输出,log 尺度)

    求逆并经 delta 法换算回原尺度后得到 SE(CS) = 28.33、SE(Residual) = 14.03,与真实输出置信区间反推的 ≈25、≈13.8 量级一致。

    参数化的选择很重要
    实现时通常内部用 $\phi = (\log\sigma_{cs},\ \log\sigma^2_e)$ 保证正定性,再由 delta 法 $\mathrm{SE}(\sigma) = \sigma\cdot\mathrm{SE}(\log\sigma)$ 换算回原尺度。不要直接把内部参数化的 $\sqrt{\mathrm{diag}(\mathcal I^{-1})}$ 当成原尺度参数的标准误——我就在这里犯过一次错,得到的"CS 标准误"其实是 $\Sigma$ 第一个元素的标准误。

    23.8 拟合统计量的 n 口径(数值演算)

    用真实输出的数值把三个指标完整算一遍($d=2$,$N=80$,$\mathrm{rank}(X)=11$,有效受试者 $=36$,$-2\ell_R = 545.71132552$):

    指标公式代入结果输出
    AIC$-2\ell_R + 2d$$545.7113 + 2\times2$549.711549.7 ✓
    AICC$-2\ell_R + \dfrac{2dn}{n-d-1}$$545.7113 + \dfrac{2\cdot2\cdot69}{69-2-1}$549.893549.9 ✓
    BIC$-2\ell_R + d\log n$$545.7113 + 2\ln 36$552.878552.9 ✓

    三个公式、三个不同的 $n$(—、69、36)。SAS 文档对此有明确规定:AICC 采用 SAS 6 口径(REML 下 $n = N - \mathrm{rank}(X)$),BIC 采用 Dimensions 表中的有效受试者数。跨软件复核时若统一用一个 $n$,AIC/BIC 必然对不上。

    23.9 Kenward-Roger:为什么要调,以及怎么调

    动机。$\hat{\boldsymbol\beta}$ 虽是无偏的,但 $\hat\Phi = (X'\hat V^{-1}X)^{-1}$ 作为 $\mathrm{Var}(\hat{\boldsymbol\beta})$ 的估计是有偏的——它把 $\hat\theta$ 当作已知的 $\theta$,忽略了估计协方差参数带来的额外变异。小样本下这会低估标准误、使推断过于乐观。Kackar–Harville 与 Kenward–Roger 的思路是对 $\hat\Phi$ 做泰勒展开修正。

    沿用记号 $\Phi = (X'V^{-1}X)^{-1}$,并定义(对协方差参数 $\theta_h$):

    $P_h = X'\dfrac{\partial V^{-1}}{\partial\theta_h}X,\qquad Q_{hj} = X'\dfrac{\partial V^{-1}}{\partial\theta_h}V\dfrac{\partial V^{-1}}{\partial\theta_j}X,\qquad R_{hj} = X'V^{-1}\dfrac{\partial^2 V}{\partial\theta_h\partial\theta_j}V^{-1}X$

    令 $W = \mathcal I^{-1}$($\hat\theta$ 的渐近协方差矩阵)。Kenward-Roger 调整后的协方差矩阵为

    KR 调整协方差矩阵

    $$\hat\Phi_A = \hat\Phi + 2\hat\Phi\left\{\sum_{h=1}^{k}\sum_{j=1}^{k} W_{hj}\Big(Q_{hj} - P_h\hat\Phi P_j - \tfrac14 R_{hj}\Big)\right\}\hat\Phi$$

    参数化会影响 $R_{hj}$,这点必须知道
    若取 $\theta$ 为 $\Sigma$ 的元素本身,则 $\partial^2 V/\partial\theta_h\partial\theta_j = 0$,从而 $R_{hj}=0$,上式退化为线性 KR 近似。若取 Cholesky 因子元素为参数,$R_{hj}\neq 0$,结果会有细微差别。

    R 的 mmrm 包文档明确指出:要与 SAS 的 UN 结果对齐,应使用线性 KR 近似。我的实现正是取 $\theta = \mathrm{vech}(\Sigma)$,因此 $R_{hj}=0$,天然与 SAS 一致。

    分母自由度。设检验 $H_0: K\boldsymbol\beta = 0$,$K$ 为 $c\times p$ 对比矩阵。令 $M = K'(K\Phi K)^{-1}K$,则

    $A_1 = \sum_{h,j} W_{hj}\,\mathrm{tr}(M\Phi P_h\Phi)\,\mathrm{tr}(M\Phi P_j\Phi),\qquad A_2 = \sum_{h,j} W_{hj}\,\mathrm{tr}(M\Phi P_h\Phi M\Phi P_j\Phi)$

    $B = \dfrac{A_1 + 6A_2}{2c},\qquad g = \dfrac{(c+1)A_1 - (c+4)A_2}{(c+2)A_2},\qquad c_i = \dfrac{g_i}{3c + 2(1-g)}$

    $E^* = \Big(1-\dfrac{A_2}{c}\Big)^{-1},\qquad V^* = \dfrac{2}{c}\cdot\dfrac{1 + c_1 B}{(1-c_2 B)^2(1-c_3 B)},\qquad \rho = \dfrac{V^*}{2(E^*)^2}$

    Kenward-Roger 分母自由度

    $$m = 4 + \frac{c + 2}{c\rho - 1}$$

    其中 $(c_1,c_2,c_3) = \big(g,\ c-g,\ c+2-g\big)\big/\big(3c+2(1-g)\big)$。标量对比时 $c=1$,$F = t^2$,SAS 报告 $t = \hat\psi/\mathrm{SE}_{KR}$、自由度取 $m$。

    自检结果
    在均衡无缺失数据(60 受试者 × 5 访视)上:KR 调整后 SE 相对 model-based SE 的膨胀比 = 1.0004,KR 自由度 = 57.65,对应"受试者数 − 组数 = 58"。大样本下 KR 修正趋于消失、自由度回到受试者量级——这正是应有的行为,说明实现无误。

    在 22 节那套 80 条观测、36 名受试者的稀疏数据上,KR 的修正就明显得多:W16 差值的 SE 从 model-based 的 6.0156 膨胀到 7.3021(+21%),自由度降到 13.78。 样本越小、缺失越多、协方差参数估计越不稳定,KR 的修正越大——这正是小样本必须用 KR 而不是 model-based 的原因。
    24

    五类 SAS 报错:诊断决策树与修改策略

    哪些是真错误、哪些只是提示、谁会引发谁——以 CS 回退为贯穿案例

    Hessian 非正定 AsyCov 奇异 零方差不贡献 DF MAXFUNC Did not converge

    24.1 先建立因果顺序:一张决策树

    这五条提示不是并列的。有些是"模型根本没拟合完",有些是"拟合完了但结果不可信",还有些只是需要记录在案的提示。分清层级,才能决定下一步动作。

    PROC MIXED 运行结束
    Q1. ConvergenceStatus.reason 是否等于 "Convergence criteria met."?
    否 → 优化本身没完成
    ├─ 日志:"Stopped because of too many likelihood evaluations" → 撞上 MAXFUNC(默认 150)
    └─ 日志:"Did not converge" → 撞上 MAXITER(默认 50)
    → 见 24.5 / 24.6;若仍失败,按 SAP 回退链换结构
    是 → 迭代收敛了,但还要检查三件事
    ├─ NOTE: final Hessian is not positive definite → 收敛点可能不是极大值,SE 不可信(24.2)
    ├─ NOTE: AsyCov ... singular ... generalized inverse was used → 协方差参数的 SE 不可靠,并会波及 KR(24.3)
    └─ NOTE: Covariance parameters with zero variance do not contribute to DDFM=KR → 有参数落在 0 边界,DF 计算不含它(24.4)
    一句话总结层级
    24.5 / 24.6(MAXFUNC、Did not converge)是"没跑完"——结果是无效的,必须换结构或改善初值。
    24.2 / 24.3(Hessian 非正定、AsyCov 奇异)是"跑完了但不可信"——点估计可能还能用,但标准误、CI、P 值不可靠。
    24.4(零方差不贡献 DF)是"需要记录"——通常不必改模型,但必须在 QC 与报告中说明。
    图 24-1 · 五类 SAS 提示的排查决策流 先分类(跑完没有),再决定改不改模型
    「未跑完」与「跑完但不可信」是两类完全不同的问题:前者先调数值,后者才考虑结构降级。

    24.2 Convergence criteria met but final Hessian is not positive definite

    它在说什么

    • 梯度判据已经满足(所以打了"Convergence criteria met")
    • 但收敛点处的 Hessian(二阶导数矩阵)不是正定的
    • 严格来说,该点不能确认为(局部)极大值——可能是鞍点或平原

    常见原因

    • 协方差参数估计落在边界(方差≈0,或相关≈±1)
    • 过度参数化:UN 在小样本/稀疏数据上参数过多
    • 某些访视对几乎没有共同观测,对应协方差不可识别
    • 变量尺度差异过大导致数值条件数恶化

    后果。协方差参数的标准误来自 $\mathcal I^{-1}$;Hessian 非正定意味着这个矩阵不可信,进而不支持可靠的标准误、CI 和 KR 自由度。

    修改策略(按优先级):

    1

    先确认是不是边界问题

    看 CovParms:是否有估计值≈0、或相关系数接近 ±1。若有,说明模型在该处退化了。

    2

    检查单元格观测数

    逐单元格数观测数。空单元格或只有 1–2 条的单元格是 UN 非正定的首要原因。

    3

    降低结构复杂度

    UN → TOEP/TOEPH → AR(1)/ARH(1) → CS/CSH。参数越少,Hessian 越容易正定。

    4

    加 ASYCOV 看细节

    proc mixed ... asycov; 输出渐近协方差矩阵,定位是哪几个参数之间出现了完全共线。

    必须上报统计师的情形
    如果主分析结构出现这条提示,是否更换结构、换成哪一个,属于 SAP 层面的决策,程序员不能自行替换后不告而别。本指南贯穿案例里主结构 UN 失败、最终落到 CS,正是走 SAP 预先批准的回退链,而不是临时拍板。

    24.3 Asymptotic variance matrix of covariance parameter estimates has been found to be singular and a generalized inverse was used

    它在说什么。$\mathcal I$(或其估计)不可逆,SAS 改用广义逆(Moore–Penrose 伪逆)继续计算。这意味着协方差参数之间存在线性依赖——模型里有"多余"的协方差参数。

    典型触发原因说明
    参数落在边界某方差估为 0,其渐近方差也为 0,导致矩阵奇异
    过度参数化如 UN 在只有 36 例、80 条观测的亚组上要估 15 个参数
    不必要的 GROUP=分组估计协方差使参数翻倍,小亚组上极易奇异
    尺度问题某些参数量级极小,数值上接近 0

    后果。协方差参数的标准误不可靠。更要紧的是:Kenward-Roger 的计算依赖 $W=\mathcal I^{-1}$,广义逆会改变 $W$,从而影响 $\hat\Phi_A$ 与自由度 $m$。所以这条提示不是"只影响协方差参数那张表",它会一路传导到主终点的 SE、CI 和 P 值。

    修改策略:与 24.2 相同的降复杂度路径;去掉不必要的 GROUP=;检查是否有冗余的协方差结构(例如同时指定 RANDOM 与 REPEATED 造成重复建模)。

    24.4 Covariance parameters with zero variance do not contribute to degrees of freedom computed by DDFM=KENWARDROGER

    它在说什么。有若干个协方差参数被估成 0(落在边界上)。Kenward-Roger 的自由度公式要对所有协方差参数求和,但零方差参数不携带不确定性信息,因此不计入自由度计算。

    这是 NOTE,不是 ERROR
    模型照常给出结果,通常不需要因此修改模型。但它是一个必须记录的事实:自由度的计算基础与你以为的不同。

    如何确认。打开 CovParms,看是否有 Estimate 恰为 0 或极其接近 0 的行。零方差常见于:随机效应方差被估为 0(说明该层变异不存在)、或某访视方差为 0。

    处理建议:

    • 记录:在 QC 日志与 CSR 脚注中写明"有 $k$ 个零方差协方差参数未计入 KR 自由度"。
    • 评估:零方差是否意味着结构选得过大?若是,可考虑更简洁的结构(但这属于统计师决策)。
    • 不要为了让这条提示消失而随意加约束或改结构——改变自由度计算基础会影响推断结论。

    24.5 Stopped because of too many likelihood evaluations

    它在说什么。似然函数的评估次数达到 MAXFUNC=(默认 150)。注意:这与"迭代次数"不是一回事——每次迭代内部若做线搜索(步长折半),会消耗多次评估。

    本指南的实跑案例正是这一条。自研引擎在相同骨架数据上拟合 UN(15 参数)时:

    诊断输出
    UN 迭代史(未收敛现场):
        iter  0   -2 Res Log Like = 584.77064213
        iter  1   -2 Res Log Like = 584.77064213
        iter  2   -2 Res Log Like = 578.88065859
        iter  3   -2 Res Log Like = 572.17005138
        ...
        iter 12   -2 Res Log Like = 540.99523007
        iter 13   -2 Res Log Like = 540.81729794
        → too_many_likelihood_evaluations

    注意这个形态:目标函数仍在持续下降(584.77 → 540.82),但下降速度越来越慢。这正是"似然面平坦 + 参数过多"的典型表现——不是算法坏了,而是数据提供的信息不足以支撑 15 个协方差参数。对比 CS 结构 5 次迭代就收敛,差距一目了然。

    修改策略:

    手段做法评价
    提高上限proc mixed maxfunc=1000 maxiter=200;可救一时;若本质是数据不支持,提高上限只会多等一会儿然后照样失败
    改善初值parms / ... 或用 PARMSDATA= 提供合理初值有效;初值离解太远是常见原因
    简化结构UN → TOEPH → ARH(1) → CSH → CS首选:本例中 CS 只需 5 次迭代即收敛
    检查数据单元格观测数、是否有异常值、是否误把访视当 SUBJECT=数据问题导致的不收敛,改参数是南辕北辙

    24.6 Did not converge

    它在说什么。迭代次数达到 MAXITER=(默认 50)而收敛判据仍未满足。与 24.5 的区别在于"卡在哪个计数器上"。

    典型形态:目标函数在若干次迭代后来回震荡或下降极其缓慢。常见原因是似然面存在狭长的"山谷"(参数间高度相关),或者参数落在边界附近反复挣扎。

    修改策略:与 24.5 基本一致,但额外建议:

    • 先用 parms 语句从多个初值试探,判断是"初值问题"还是"结构问题"。
    • 若多个合理初值都失败,基本可以确定是数据不支持该结构,应直接走回退链,而不是继续堆 MAXITER。
    • 检查是否有近乎完全共线的固定效应(例如某访视只有一个治疗组有数据)。

    24.7 贯穿案例:从 UN 失败到 CS 的生产级回退

    把上面几条串起来,看真实项目里是怎么处理的(代码已掩蔽:

    SAS(掩蔽后)
    /* 步骤 1:跑之前先清空,防止不收敛时残留旧结果 */
    proc datasets lib=work nolist;
        delete lsm diffs;
    quit;
    
    /* 步骤 2:先探 UN,只取 ConvergenceStatus */
    ods select none;
    ods output ConvergenceStatus=conv_un;
    proc mixed data=sub_ana(where=(chg>.)) method=reml;
        class usubjid trt01pn avisitn;
        model chg = base trt01pn avisitn trt01pn*avisitn / ddfm=kr residual;
        repeated avisitn / subject=usubjid type=un;
    run;
    ods select all;
    
    /* 步骤 3:用 reason 精确判定,而不是看有没有 ERROR */
    proc sql noprint;
        select count(*) into :fail_cnt from conv_un
        where reason ne "Convergence criteria met.";
    quit;
    
    /* 步骤 4:失败则遍历回退链,记录各结构 AIC,取最小者重跑 */
    %let methlist=TOEPH|ARH(1)|CS|CSH|SP(POW)(avisitn_n);
    要点为什么重要
    先 delete 再跑PROC MIXED 不收敛时不会覆盖既有数据集,残留的 lsm/diffs 会被下游当成有效结果——这是最危险的一类静默错误
    用 reason 判定reason ne "Convergence criteria met." 是唯一可靠的机器判定方式;日志无 ERROR ≠ 收敛
    回退链必须与 SAP 一致SAP 写的是 TOEPH(1) → ARH(1) → HCS → SP(POW) → CS;程序里若写成别的顺序或其他结构,属于偏离 SAP
    SP(POW) 需要连续时间SP(POW)(avisitn_n) 用的是连续时间坐标,普通 AR(1) 只按访视顺序算滞后。把 AR(1) 的"滞后"解释成"实际周数"是错误的
    记录实际使用的结构本例最终用 CS。每个亚组用了什么结构应写入 QC 数据集(如 covtype_log),供审阅与 CSR 脚注使用
    一个值得注意的命名差异
    部分 SAP 写 HCS(Heterogeneous Compound Symmetry),但 PROC MIXED 中对应的 TYPE= 名称是 CSH。写 TYPE=HCS 会直接报错。核对 SAP 与代码时,这一类"同一结构、不同软件不同名"的坑需要专门过一遍:UN / TOEP / TOEPH / AR(1) / ARH(1) / CS / CSH / CSH 等。

    24.8 交付前的最小检查清单

    1

    收敛

    ConvergenceStatus 已生成,且 reason = "Convergence criteria met.";日志中无 Hessian / AsyCov / 零方差相关 NOTE,或已有记录与批准。

    2

    结构

    Model Information 中的协方差结构与 SAP 一致;若发生回退,回退路径与 AIC 依据已记录。

    3

    数据

    受试者数、观测数、各单元格观测数与预期一致;Read = Used 或已解释 Not Used 的原因。

    4

    参数

    所有方差为正;相关系数在 (−1, 1) 内;无异常极端的估计值。

    5

    结果

    目标访视每条治疗组一行 LSMean;AVISITN 与 _AVISITN 都等于目标访视;SE、DF、CI、P 值来自同一条比较行。

    6

    稳定性

    改变协方差结构后,目标访视的 LSMean 差值与结论是否保持稳定;若敏感,需在报告中说明。

    — End of Guide —

    MMRM Deep Dive Guide v2.5 · Built with care for the biostatistics community