从矩阵基础到监管提交
面向临床试验统计人员的重复测量混合模型完整学习资源。涵盖理论推导、SAS/R 实现、协方差结构选择、缺失数据处理、ICH E9(R1) 估计目标框架,以及监管视角。
阅读导览
根据你的背景和目标,选择最适合的阅读路径
初学者 从零开始
实践者 SAS/R 程序员
理论派 统计师 / 方法学
背景:纵向数据与三大难题
为什么临床试验需要 MMRM 而不是简单的 t 检验或 ANCOVA?
1.1 什么是纵向数据?
在临床试验中,我们通常不会只在终点测量一次结局指标,而是在多个访视(visit)对同一受试者进行重复测量。例如,一项疼痛研究可能在基线(Baseline)后第 1、2、4、6、8、12 周分别评估疼痛评分(NRS)。这种同一受试者在多个时间点的重复测量就是纵向数据(longitudinal data)。
横断面数据
- 每个受试者只测量一次
- 观测之间相互独立
- 标准方法:t 检验、ANOVA、ANCOVA
- 无法捕捉时间趋势
纵向数据
- 每个受试者测量多次
- 同一受试者的观测不独立
- 需要特殊方法处理相关性
- 可以建模时间趋势与治疗效应
1.2 纵向数据的三大难题
受试者内相关性(Within-Subject Correlation)
同一个受试者在不同访视的测量值不是独立的——W1 和 W2 的评分通常比两个不同受试者的评分更相似。忽略这种相关性会导致标准误被低估、p 值偏小、假阳性率升高。
缺失数据(Missing Data)
纵向研究中受试者可能在某些访视缺失数据(脱落、失访等)。缺失不是随机的——病情恶化或改善的受试者更可能脱落。如何处理缺失数据直接影响结论的有效性。
治疗 × 时间交互(Treatment-by-Time Interaction)
治疗效果可能随时间变化——药物可能在早期见效快、后期趋于平稳,或反之。我们需要允许每个访视有各自的治疗组间差异,而不是假设一个恒定的治疗效应。
数学基础
矩阵运算与线性回归回顾 —— 为 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}$ 是误差项。
广义最小二乘(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。
历史演进:从 LOCF 到 MMRM
缺失数据处理方法的演进历程与监管态度的转变
LOCF(Last Observation Carried Forward)
将受试者最后一次观测值"结转"到所有后续缺失访视。曾广泛使用,但存在严重问题:人为扭曲数据变异、引入偏倚、标准误被低估。已被 FDA 和 EMA 明确不推荐。
BOCF(Baseline Observation Carried Forward)
用基线值填充所有缺失访视。比 LOCF 更保守,但同样缺乏统计合理性——假设脱落后疗效完全消失通常不符合临床实际。
Multiple Imputation(MI,多重插补)
基于模型对缺失值进行多次合理插补,分别分析后合并结果。统计上合理,但实施复杂、结果依赖插补模型,且不是基于似然的方法。
MMRM(Mixed Model for Repeated Measures)
基于似然的方法,在 MAR 假设下直接利用所有可用数据,无需插补。被 FDA、EMA 和 ICH E9(R1) 推荐为纵向连续结局的主要分析方法。当前行业标准。
方法对比
| 方法 | 缺失数据处理 | 受试者内相关 | 偏倚风险 | 监管接受度 |
|---|---|---|---|---|
| LOCF | 末次观测结转 | 忽略 | 高 | 不推荐 |
| BOCF | 基线观测结转 | 忽略 | 高 | 不推荐 |
| CC | 删除缺失者 | 忽略 | 中-高 | 不推荐 |
| MI | 多重插补 | 可建模 | 低 | 可接受 |
| MMRM | 基于似然(MAR) | 协方差结构建模 | 低 | 推荐 |
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 代码如何变化:
协方差结构详解
UN / CS / AR(1) / TOEP / CSH / ARH(1) / SP(POW) —— 灵活性与约束之间的取舍
5.1 MODEL 和 REPEATED:一张表的两个方向
沿用一个虚构研究框架:受试者在 W1、W2、W4、W6、W8 和 W12 评估疼痛 NRS,主要分析因变量是 $\text{CHG} = \text{AVAL} - \text{BASE}$。
MODEL 语句描述的是:给定基线、治疗组、访视和分层因素,平均的 CHG 处在什么位置?
REPEATED 语句描述的是:同一个人的多个 CHG 如何一起变化?
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 协方差结构交互实验室
选择不同结构、调整访视数和相关参数,实时观察协方差矩阵的变化:
协方差矩阵可视化
TYPE=UN 就把注意力放在是否能收敛。但 TYPE=UN 不是一个「运行选项」——它是在告诉模型:同一名受试者的多次测量,允许按照什么方式共同波动。UN 的灵活性来自更多待估参数,访视越多,参数数量增长越快。程序运行成功,不等于协方差结构合理。
缺失数据、MAR 假设与敏感性分析
MCAR、MAR、MNAR 三种缺失机制;MMRM 为何不生成填补值;J2R / CR 类敏感性分析
6.1 三种缺失机制
Missing Completely At Random(完全随机缺失)
缺失概率与任何观测值或未观测值都无关。例如:受试者因搬家而失访,与病情无关。这是最强的假设,在现实中很少成立。
Missing At Random(随机缺失)
缺失概率只依赖于已观测数据(如之前的结局值、基线特征),而不依赖于未观测的未来值。这是 MMRM 基于似然推断的关键假设。
Missing Not At Random(非随机缺失)
缺失概率依赖于未观测值本身。例如:病情恶化的受试者更可能脱落。此时基于 MAR 的 MMRM 可能产生偏倚,需要进行敏感性分析。
6.2 MMRM 如何处理缺失:基于似然,无需插补
这句话包含四个要点,每一条都对应一个具体的建模或编程动作:
| 要点 | 统计含义 | 对编程与申报的含义 |
|---|---|---|
| 不删除 | 受试者只要还有至少一次有效观测,其已观测部分就进入似然 | 不需要按「完成全部访视」筛选分析集;脱落者的数据仍被利用 |
| 不插补 | 缺失值从不进入残差向量,也就不存在「补出来的信息」 | 不需要 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 值偏小。
6.3 缺失机制交互演示
观察不同缺失机制下数据点的缺失模式差异:
缺失数据机制散点图
6.4 MMRM 不会生成单次填补值
这句话容易在程序复核时被忽略。把"无填补"拆成三个可核查的命题:
不写回 ADaM
若某受试者没有 W16 的 CHG,MMRM 不会在 ADQS 里新增一条"填补后的 W16"。分析数据集在 PROC MIXED 前后没有任何行被写入缺失访视的结局值。
LSMean 不是个体预测值
W16 的 LSMean 是治疗组平均轨迹在给定协变量下的边际均值,是组水平汇总量。把它读成"某例缺失 W16 的受试者大概是多少分"是概念错误。
不需要先知道缺失真值
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 风险已经消失。关键在于:
因此 ICH E9(R1) 要求:缺失数据的处理必须相对于具体的 estimand 来定义,并用预先设定的敏感性分析检验主分析对关键假设偏离是否稳健。主分析与敏感性分析面向同一 estimand,通过改变"缺失结局的假设"来观察结论是否稳定。
常见的参考组敏感性分析策略:
| 策略 | 对缺失部分的假设 | 直观解释 |
|---|---|---|
| J2R Jump to Reference | 脱落前沿用本治疗组轨迹;从脱落后的下一个访视开始,结果跳向参考组轨迹 | "治疗有效,但退出后获益立即消失" |
| CR Copy Reference | 缺失部分按参考组的整体均值与协方差分布构造 | "缺失部分遵循参考组的完整纵向行为" |
| CIR Copy Increments in Reference | 保留受试者脱落时的治疗组水平,之后复制参考组的变化增量 | "退出后不再获益,但也不倒退到入组状态" |
| Tipping Point | 逐步改变缺失结局的假设(如逐次平移惩罚量) | "结论在什么程度的偏离下会翻转" |
J2R 与 CR 的概念差异(假设某受试者在 W6 后退出,安慰剂组为参考组):
| 比较点 | J2R | CR |
|---|---|---|
| 脱落前的已观察数据 | 均保留并使用,已观察值不会被重写 | |
| 脱落后的假设 | 从下一个访视起,缺失结果按"跳转至参考组"的条件分布生成 | 假想的完整纵向分布按参考组结构设定,再结合已观察数据生成缺失部分 |
| 直观解释 | 治疗获益在退出后立即消失 | 缺失部分按参考组的完整纵向行为处理 |
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 合并 |
SAP 中的示例程序(变量名与种子保留原样,研究号与药物代号已替换):
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;
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 中发现 |
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;
- 敏感性分析结果是否改变了临床结论。
估计与推断:REML 与 Kenward-Roger
为什么用 REML 而不是 ML?小样本下如何校正自由度?
7.1 REML vs ML
最大似然(ML)和限制性最大似然(REML)是两种估计协方差参数的方法:
ML(最大似然)
- 同时估计固定效应和协方差参数
- 协方差参数估计有向下偏倚
- 偏倚程度与固定效应参数个数有关
- 适用于嵌套模型比较(似然比检验)
REML(限制性最大似然)
- 先「积分掉」固定效应,再估计协方差
- 修正了 ML 的向下偏倚
- 协方差参数估计更准确
- MMRM 的标准选择
SAS 中指定 REML:
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-Roger | DDFM=KR | 同时校正 SE 和 DF;最保守 | 小样本、非平衡设计;推荐 |
| Satterthwaite | DDFM=SAT | 只校正 DF,不校正 SE | 中等样本,计算较快 |
| Between-Within | DDFM=BW | 基于分解的近似方法 | 多中心试验 |
| Residual | DDFM=RES | 简单残差自由度 | 大样本时近似合理 |
METHOD=REML + DDFM=KR(Kenward-Roger)。KR 方法同时校正标准误和自由度,在小样本和非平衡设计下表现最好,也是 FDA 和 EMA 最认可的推断方法。
数据 ↔ 代码联动演示
逐步推进:每个 PROC MIXED 关键词读取了数据里的哪一列、触发了哪步运算
左边是一份 ADaM BDS 长格式数据(3 名受试者 × 4 个访视,含 2 个缺失),右边是 MMRM 的完整代码。点「下一步」逐步推进:亮起的列就是这一步真正被读取的数据,曲线连到代码里对应的关键字,下方卡片解释这一步在数学上做了什么运算。
WORK.ADQS(分析数据集 · 长格式 BDS)
mmrm_primary.sas
PROC MIXED 全参数解剖
每一个关键字的含义、是否必需、临床解读与常见错误
| 关键字 | 必需? | 作用 | 临床解读 | 常见错误 |
|---|---|---|---|---|
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/FREQ | MMRM 常用 DATA,否则顺序错 |
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)
协方差结构实验室
交互式比较 UN、CS、AR(1)、CSH、TOEP、ARH(1)、SP(POW) —— 参数数、收敛风险、AIC/BIC
10.1 参数数量计算器
输入访视数,查看各结构需要估计的协方差参数数量:
参数数量增长曲线
10.2 何时选择何种结构?
| 场景 | 推荐结构 | 理由 |
|---|---|---|
| SAP 指定 UN | UN | 遵循 SAP;样本量足够时首选 |
| UN 不收敛 | TOEP 或 ARH(1) | 比 UN 约束更多但仍有灵活性 |
| 访视少(≤4) | UN | 参数数可控,通常能收敛 |
| 访视多(≥8) | TOEP 或 AR(1) | UN 参数过多,需约束 |
| 等距访视 + 时间衰减 | AR(1) | 相邻更相关,随距离衰减 |
| 不等距访视 | SP(POW)(WEEK) | 用实际时间坐标建模相关性 |
| 两组变异明显不同 | UN + GROUP=TRTP | 各组分别估计协方差参数 |
参数沙盘:填什么=算什么
交互式映射: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$
但这不能推广。两组 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 参数复核清单
- 先对结构再看数字。 CovParms 的参数个数是否等于该 TYPE= 的理论个数?出现 0、负值或贴边界,先回到 S24 排查。
- 用
E选项打印 $\ell$ 向量。 确认 LSMean / 差值确实用了你以为的那一组系数,尤其是有协变量或交互项时。 - 差值必须来自 Diffs 表。 不要用取整后的两个 LSMean 相减;同样的道理,CI 与 P 值也必须用模型直接给出的 SE 与 DF 重算。
- 检查 SE 与 Var 的自洽性。 用 Step 3 的式子反算 $\operatorname{Cov}_{12}$,若为负得不合常理,多半是 $\ell$ 向量或模型设定有问题。
- DF 非整数不是错。 KR 的 $m$ 本来就是实数;但 DF 明显小于受试者数时要警觉单元格稀疏。
- 用 AIC / AICC / BIC 反查 $n$ 口径。 三者能对上 SAS,说明 −2RLL 与 $d$ 都取对了。
- 交叉验证。 条件允许时用另一套实现(如 R
mmrm或本指南的自研 REML 引擎)重跑同一模型,比对到小数点后 2–3 位。
生产级代码模板
完整的、带注释的 SAS PROC MIXED 和 R mmrm 代码模板
12.1 SAS PROC MIXED 主分析模板
/*================================================================
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 等效代码
# 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)
输出解读与 TLF 落地
如何阅读 PROC MIXED 输出并映射到监管提交表格
13.1 关键输出表
Model Information / Dimensions
确认:协方差结构(UN)、估计方法(REML)、自由度方法(KR)、观测数、受试者数。这是 QC 的第一步——确认模型设置与 SAP 一致。
Fit Statistics
-2 Res Log Likelihood、AIC、AICC、BIC。用于比较不同协方差结构的拟合优度。注意:这些指标只在固定效应相同时才可比较。
Covariance Parameter Estimates
协方差参数估计值、标准误、Z 值、P 值。检查:所有方差是否为正?相关系数是否在合理范围?UN 结构下应有 $T(T+1)/2$ 个参数。
Type 3 Tests of Fixed Effects
整体 F 检验:TRTP、AVISIT、TRTP*AVISIT、BASE 的显著性。TRTP*AVISIT 显著说明治疗效应随时间变化。
LS Means / Differences
各治疗组×访视的最小二乘均值、组间差值、95% CI、P 值。这是主要终点的直接来源。
13.2 输出 → TLF 映射
| PROC MIXED 输出 | TLF 表格 | 用途 |
|---|---|---|
| LSMeans | Table: LS Means by Treatment and Visit | 各访视各组的调整后均值 |
| Diffs | Table: Treatment Differences at Each Visit | 主要终点:组间差值 + CI + P |
| CovParms | Listing: Covariance Parameter Estimates | 协方差参数详情 |
| FitStatistics | Listing: Model Fit Statistics | 模型拟合指标 |
| SolutionF | Listing: Fixed Effects Estimates | 固定效应系数 |
常见误区与自检清单
12 个常见错误 + 交互式自检清单 + 红旗警告
14.1 十二个常见误区
把访视当成受试者边界
REPEATED USUBJID / SUBJECT=AVISITN; 让模型把同一访视下的受试者聚在一起,完全改变相关性单位。
把 UN 当作随机效应模型
TYPE=UN 描述的是重复测量残差的协方差结构。它不等于「加了一个随机截距」。
看到不收敛就直接删掉交互项
固定效应和协方差结构是两个不同层面。协方差不收敛时,不能为了让程序跑通就删除 TRTP*AVISIT。
只比较 AIC,不看参数和结果稳定性
复杂结构可能改善拟合指标,却产生不稳定的协方差参数和不可解释的推断结果。
AR(1) 的访视顺序没有实际含义
不能只因为访视变量是数字就自动认为 AR(1) 合理。需要确认访视间隔是否近似等距、顺序是否有临床意义。
数据未排序就运行 PROC MIXED
REPEATED 不会自动重排数据。受试者内 R 矩阵的行按输入数据顺序构造。应显式 PROC SORT BY USUBJID AVISITN;
GROUP= 导致参数爆炸
GROUP=TRTP 让参数数量乘以组数。两个治疗组 + 六个访视的 UN 需要 42 个协方差参数,收敛压力大增。
同时写 RANDOM 和 REPEATED
标准 MMRM 只用 REPEATED。同时写 random intercept 和 repeated type=un 导致参数不可识别。
ORDER= 默认值导致水平顺序错误
MMRM 常用 ORDER=DATA,否则 CLASS 水平可能按字母序而非数据序排列,影响结果解读。
忽略非正定矩阵警告
协方差矩阵非正定意味着模型设定有问题。不能忽略警告继续解读结果。
把探索性结构比较误当成正式选模
比较 UN/CS/AR(1)/TOEP 的 AIC 是探索性评估,不等于正式分析可以自动选择 AIC 最小的结构。
不检查 LSMean 差值的稳定性
改变协方差结构后,目标访视的 LSMean 差值应基本稳定。如果变化很大,需要警惕模型设定问题。
14.2 自检清单
勾选以下项目确认你的 MMRM 分析设置正确:
数据准备
模型设定
结果验证
估计目标与伴发事件处理策略
ICH E9(R1) 框架下的 MMRM 定位
15.1 估计目标的五个属性
治疗条件(Treatment Condition)
明确比较的治疗组(如 Drug A vs Placebo)。
目标人群(Population)
分析人群定义(如 FAS、PPS)。MMRM 通常在 FAS 上运行。
变量(Variable / Endpoint)
终点指标及时间点(如 Week 24 的 CHG from baseline)。
伴发事件处理策略(Intercurrent Event Strategy)
见下方五种策略。MMRM 默认对应 hypothetical 策略。
群体水平汇总(Population-level Summary)
组间差值(Treatment Difference)及其 95% CI。
15.2 五种伴发事件处理策略
| 策略 | 含义 | MMRM 中的体现 |
|---|---|---|
| Treatment Policy | 无论是否发生伴发事件,都使用实际观测值 | 使用所有观测数据,包括伴发事件后的数据 |
| Hypothetical | 假设伴发事件未发生时会怎样 | MMRM 在 MAR 下的默认解释:假设缺失数据的受试者遵循与观测数据相同的趋势 |
| Composite Variable | 将伴发事件纳入终点定义 | 如将脱落定义为治疗失败,需要重新定义因变量 |
| While on Treatment | 只分析伴发事件前的数据 | 需要修改数据,只保留治疗期间访视 |
| Principal Stratum | 限定在特定潜在子群中估计 | 需要额外假设和敏感性分析 |
监管视角:FDA / EMA / ICH
各监管机构对 MMRM 的立场与建议
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 偏移
对话问答复盘
常见问题与边界场景的 FAQ
参考文献
监管文件、统计方法论文、软件文档与社区资源
监管文件
- 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] 标签
一页速查表
MMRM 核心知识点快速回顾
| 问题 | 答案 |
|---|---|
| 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 代码速查
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 代码速查
library(mmrm)
fit <- mmrm(CHG ~ TRTP * AVISIT + BASE,
cov_structure = "us", data = adqs)
summary(fit)
emmeans(fit, pairwise ~ TRTP | AVISIT)
MMRM 输出数据集结构:LSMESTIMATE、SLICE 与 STORE
ODS 表名由什么语句触发?每个数据集里有哪些字段?STORE 到底存了什么?
20.1 先分清三层数据的职责
ODS 结果不宜直接改造成显示字符串。更稳妥的做法是分成三层,每层只承担一种责任:
| 层次 | 示例数据集 | 主要任务 | 是否允许格式化 |
|---|---|---|---|
| 模型结果层 | MMRM_LSMEANS、MMRM_DIFFS、MMRM_COVPARMS | 原样保留 SAS 输出,含比较两端、完整精度 | ❌ 不做任何取整 |
| 统计结果层 | W16_LSMEANS、W16_DIFFS、W16_RESULTS | 筛选目标访视、统一差值方向、落实目标估计量 | ❌ 保留完整数值精度 |
| 显示层 | TLF_DATA | 按 shell 处理小数位、P 值字符串、空白与对照组留空 | ✅ 只在这一层格式化 |
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 | 零模型似然比检验 | 默认输出 | ★ |
Tests3 | Type 3 固定效应检验 | 默认输出 | ★★ |
SolutionF | 固定效应解 | MODEL / S(SOLUTION) | ★★ |
LSMeans | 最小二乘均值 | LSMEANS | ★★★ |
Diffs | LSMean 两两差值 | LSMEANS / DIFF(或 PDIFF、ADJUST=) | ★★★ 主要终点来源 |
LSMEstimates | LSMESTIMATE 语句的结果 | LSMESTIMATE | ★★★ 自定义对比 |
Estimates | ESTIMATE 语句的结果 | ESTIMATE | ★★ |
Contrasts | CONTRAST 语句的结果 | CONTRAST | ★★ |
Slices | Tests of Effect Slices(简单效应) | LSMEANS / SLICE= 或 SLICE 语句 | ★★ |
Coef | L 矩阵系数(可估性核对) | E 选项(MODEL/CONTRAST/ESTIMATE/LSMEANS) | ★★★ 疑难排查 |
AsyCov | 协方差参数的渐近协方差矩阵 | PROC MIXED ASYCOV | ★★ 诊断奇异 |
R / RCorr | R 矩阵块 / 相关阵 | 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 对应的治疗组与访视 | 合并键 |
Estimate | LSMean 本身 | 不是该组该访视非缺失 CHG 的算术平均 |
StdErr, DF | 标准误与自由度 | DF 来自 DDFM=,非常数 |
Lower, Upper | LSMean 的置信限 | 需 CL 选项 |
Probt | 该 LSMean 与 0 比较的 P 值 | ❌ 不是组间比较 P 值 |
Diffs 每行是一条两两比较,端点字段带下划线:
| 字段 | 含义 |
|---|---|
TRT01PN, AVISITN | 比较的第一端(被减数和参照端) |
_TRT01PN, _AVISITN | 比较的第二端(减数) |
Estimate | 第一端 − 第二端 |
StdErr, DF, Lower, Upper, Probt | 差值 SE、自由度、CI、P 值 |
where avisitn=16; 只限定了第一端,第二端仍可能来自 W2、W4、W8 或 W12。访视内的组间比较必须同时限定两端:
where avisitn=16 and _avisitn=16;
20.4 LSMESTIMATE 语句:直接对 LSMean 做线性组合
当 SAP 要求的估计量不是现成的某一条两两比较时(例如"两个剂量组合并后与安慰剂比较"、"某访视上若干单元格的平均"),用 LSMESTIMATE 直接写 LSMean 的系数最直观——它作用的单位是 LSMean,而不是固定效应参数 β。
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)。
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 等。三者是并列关系,不是嵌套关系。
/* 写法一: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 / ProbF | F 检验,不是 t 检验 |
slice=avisitn 回答的是"在 W16 这一层,治疗组之间整体上有没有差异"(2 组时为 1 个分子自由度)。它不给出"研究药物 − 安慰剂 = −24.77"这样的带符号差值。要拿差值,须加 DIFF 选项,或回到 Diffs / LSMESTIMATE。
20.6 STORE 语句:把模型存下来,交给 PROC PLM
STORE 不产生任何输出表。它把分析上下文与结果写入一个二进制的 item store,之后由 PROC PLM 读取并做后处理——不需要重新拟合模型。对于跑一次要几十分钟的 UN 结构,这是最实在的省时手段。
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=。这样既保证 所有结果来自同一个拟合(避免不同程序各自重跑导致的细微差异),也省掉重复拟合的时间。
DIFFs 怎么读:ESTIMATE / CONTRAST / LSMESTIMATE 三方对照
45 行 Diffs 里只有 5 行是访视内组间比较——剩下的 40 行是什么?
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 |
|---|---|---|---|
| 访视内组间比较 | 5 | W16 研究药物 − W16 安慰剂 | ✅ 主要终点 |
| 同组跨访视比较 | 10 | 安慰剂 W16 − 安慰剂 W2 | ❌ |
| 跨组跨访视比较 | 30 | 研究药物 W2 − 安慰剂 W16 | ❌ |
21.2 差值方向由两端决定,反向时 CI 必须成套翻转
Estimate = 第一端 − 第二端。程序不应假定 ODS 一定按某个方向输出,稳妥做法是同时接受两个方向再统一:
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;
lcl = -upper; ucl = -lower;。写成 lcl = -lower 会得到"方向对但 CI 反"的低级错误。SE 不受方向影响,双侧 P 值也不变;单侧检验不能套用这个结论。
21.3 ESTIMATE / CONTRAST / LSMESTIMATE 三方对照
三者的本质区别在于作用对象:ESTIMATE 与 CONTRAST 作用于固定效应参数 $\boldsymbol\beta$,LSMESTIMATE 作用于最小二乘均值。
| 维度 | ESTIMATE | CONTRAST | LSMESTIMATE |
|---|---|---|---|
| 作用对象 | 固定效应参数 $\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 可核对系数落点。推荐首选。
TRT01PN*AVISITN 交互时,ESTIMATE 要同时写主效应和交互项的系数,位置依赖 CLASS 水平顺序,是统计编程里最典型的静默错误来源。LSMESTIMATE 把问题从"β 的第几个元素"翻译成"第几个单元格",后者可以用 E 选项直接打印出来核对。
21.5 各自适用场景
标准两两比较 → 用 DIFF
SAP 要的就是"某访视上 A − B",直接用 LSMEANS / DIFF 并从 Diffs 里筛选。不要为了"看起来专业"改用 ESTIMATE 重写一遍——多一次手写系数就多一次出错机会。
只要整体 P 值 → 用 CONTRAST
交互项整体检验、多个水平合并检验、剂量趋势的正交多项式对比等多自由度场合。若只关心"是否显著"而不关心效应量,CONTRAST 最简洁。
自定义 LSMean 对比 → 用 LSMESTIMATE
合并剂量组、跨访视平均、多个单元格的加权对比、SAP 明确写为"LSMean 的线性组合"的估计量。需要联合检验时加 JOINT。
需要与 SolutionF 对齐 → 用 ESTIMATE
当统计师要求核对"某个固定效应系数"或做模型诊断时。但永远不要把 SolutionF 里的某行直接当作目标访视的治疗差值——参见 22.5 节的陷阱。
Non-est。它表示所请求的线性组合不是 $\boldsymbol\beta$ 的可估函数——常见于某个治疗组在目标访视完全没有观测、或单元格缺失导致设计矩阵秩不足。此时应先检查单元格观测数,而不是调整系数"凑"出一个数值。
实跑示例:一份真实 MMRM 输出的逐表解读
从 Model Information 一路读到 Diffs,再从统计量走到临床解读
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 实际运行的程序
/* 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;
lsm/diffs,残留数据会被下游当成有效结果。跑之前 proc datasets delete 是最便宜的保险。
② 用 reason 判定收敛。不要靠"日志里没有 ERROR"来判断;把 ConvergenceStatus 存下来,用 reason ne "Convergence criteria met." 精确判断。
22.3 逐表解读
① Model Information —— QC 第一步
| 条目 | 本例 | 要核对什么 |
|---|---|---|
| Covariance Structure | Compound Symmetry | 是否等于 SAP 规定结构?若不是,回退是否被记录与批准? |
| Subject Effect | USUBJID | 必须是受试者,不能是访视或中心 |
| Estimation Method | REML | MMRM 标准选择 |
| Residual Variance Method | Profile | SAS 默认;残差方差被 profile 掉 |
| Fixed Effects SE Method | Kenward-Roger | 与 SAP 一致 |
| Degrees of Freedom Method | Kenward-Roger | 与 DDFM= 一致 |
本例的第一条结论:主结构 UN 没有收敛,程序按 SAP 回退链落到了 CS。这个事实必须在 QC 记录和 CSR 脚注中体现——"用的是什么结构"本身就是需要申报的信息。
② Class Level Information —— 数清楚水平
| Class | Levels | Values | 核对要点 |
|---|---|---|---|
| USUBJID | 36 | (已掩蔽) | 是否等于分析中应有的受试者数 |
| AVISITN | 5 | 2 4 8 12 16 | 是否只含计划分析访视;顺序是否与 REPEATED 一致 |
| TRT01PN | 2 | 4 1 | 参考水平是否为安慰剂(本例用 ref="1" 显式指定) |
③ Dimensions —— 19 与 11 的差别
| 条目 | 本例 | 说明 |
|---|---|---|
| Covariance Parameters | 2 | CS + Residual |
| Columns in X | 19 | 过参数化设计矩阵的列数 |
| Columns in Z | 0 | MMRM 无随机效应,Z 为空 |
| Subjects | 36 | 与 Class Levels 中 USUBJID 一致 |
| Max Obs per Subject | 5 | 最多 5 个基线后访视 |
$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 Read | 80 |
| Number of Observations Used | 80 |
| Number of Observations Not Used | 0 |
36 名受试者 × 5 个访视 = 180 个理论观测点,实际只有 80 条进入分析,缺失 100 条(55.6%)。Read = Used 且 Not Used = 0 说明没有因协变量缺失被剔除的记录。这个缺失比例解释了为什么 UN(15 个协方差参数)在此亚组上无法收敛。
⑤ Iteration History —— 优化过程本身
| Iteration | Evaluations | −2 Res Log Like | Criterion |
|---|---|---|---|
| 0 | 1 | 567.61403563 | |
| 1 | 2 | 550.09118611 | 0.01196918 |
| 2 | 1 | 546.88419942 | 0.00404797 |
| 3 | 1 | 545.86323984 | 0.00063691 |
| 4 | 1 | 545.71577334 | 0.00002074 |
| 5 | 1 | 545.71133083 | 0.00000003 |
| 6 | 1 | 545.71132552 | 0.00000000 |
- 目标函数单调下降:567.61 → 545.71,共下降 21.90。
- Criterion 是基于梯度的收敛判据(不是相邻两次目标函数的差),从 0.012 一路降到 $3\times10^{-8}$。
- Iteration 1 的 Evaluations = 2:这一步做了线搜索(步长折半),所以多算了一次似然。
- 判读要点:下降是否平稳。若出现反复震荡、或目标函数在最后几步仍在明显变化,即使打了"Convergence criteria met"也要警惕。
⑥ Covariance Parameter Estimates —— 方差成分
| Cov Parm | Subject | Estimate | Lower | Upper |
|---|---|---|---|---|
| CS | USUBJID | 73.2028 | 24.1387 | 122.27 |
| Residual | 61.7798 | 41.8791 | 100.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,说明受试者内相关确实存在
ASYCOV 选项)。
⑦ Fit Statistics 与 Null Model LRT —— 三个指标用了三个不同的 n
| 指标 | 数值 | 公式 | SAS 用的 n | 验算 |
|---|---|---|---|---|
| −2 Res Log Likelihood | 545.7 | $-\,2\ell_R$ | — | 545.7113 |
| AIC | 549.7 | $-2\ell_R + 2d$ | 不涉及 n | $545.7113+2\times2=549.71$ ✓ |
| AICC | 549.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$ ✓ |
| BIC | 552.9 | $-2\ell_R + d\log n$ | $n = \text{有效受试者数} = \mathbf{36}$ | $545.7113+2\ln36=552.88$ ✓ |
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 | 水平 | Estimate | Std Error | DF | t Value | Pr > |t| |
|---|---|---|---|---|---|---|
| Intercept | −14.2569 | 10.1924 | 61.5 | −1.40 | 0.1669 | |
| BASE | −0.07101 | 0.07165 | 32.6 | −0.99 | 0.3289 | |
| TRT01PN | 4 | −24.7700 | 12.7445 | 51.7 | −1.94 | 0.0574 |
| TRT01PN | 1 | 0 | . | . | . | . |
| AVISITN | 2 | 15.0295 | 9.0873 | 45.1 | 1.65 | 0.1051 |
| AVISITN | 4 | 3.7690 | 9.1312 | 44.4 | 0.41 | 0.6818 |
| AVISITN | 8 | −0.5560 | 9.2824 | 43.8 | −0.06 | 0.9525 |
| AVISITN | 12 | −13.0370 | 9.9697 | 42.5 | −1.31 | 0.1980 |
| AVISITN | 16 | 0 | . | . | . | . |
| AVISITN*TRT01PN | 2, 4 | 22.9378 | 12.6925 | 45.5 | 1.81 | 0.0774 |
| AVISITN*TRT01PN | 4, 4 | 30.1374 | 12.7705 | 44.6 | 2.36 | 0.0227 |
| AVISITN*TRT01PN | 8, 4 | 23.9880 | 12.9249 | 44.1 | 1.86 | 0.0702 |
| AVISITN*TRT01PN | 12, 4 | 19.8786 | 13.8132 | 42.7 | 1.44 | 0.1574 |
| AVISITN*TRT01PN | 16, 4 | 0 | . | . | . | . |
⑨ Type 3 Tests of Fixed Effects
| Effect | Num DF | Den DF | F Value | Pr > F | 解读 |
|---|---|---|---|---|---|
| BASE | 1 | 32.6 | 0.98 | 0.3289 | 基线协变量无显著影响 |
| TRT01PN | 1 | 60.1 | 1.31 | 0.2568 | 不是治疗主效应检验(见 22.5) |
| AVISITN | 4 | 44.2 | 15.97 | <.0001 | 均值随访视显著变化 |
| AVISITN*TRT01PN | 4 | 45.4 | 1.73 | 0.1608 | 本亚组未见显著交互 |
⑩ Least Squares Means(10 行 = 2 组 × 5 访视)
| AVISITN | TRT01PN | Estimate | Std Error | DF | t | Pr > |t| | 95% CI |
|---|---|---|---|---|---|---|---|
| 2 | 4 | −5.2923 | 2.5115 | 50.6 | −2.11 | 0.0401 | (−10.3353, −0.2493) |
| 2 | 1 | −3.4601 | 3.2707 | 51.4 | −1.06 | 0.2950 | (−10.0250, 3.1047) |
| 4 | 4 | −9.3532 | 2.9722 | 62.8 | −3.15 | 0.0025 | (−15.2930, −3.4134) |
| 4 | 1 | −14.7206 | 3.8939 | 63.7 | −3.78 | 0.0003 | (−22.5004, −6.9409) |
| 8 | 4 | −19.8277 | 3.3417 | 68.1 | −5.93 | <.0001 | (−26.4958, −13.1597) |
| 8 | 1 | −19.0457 | 4.6371 | 69.0 | −4.11 | 0.0001 | (−28.2964, −9.7950) |
| 12 | 4 | −36.4181 | 5.4188 | 57.9 | −6.72 | <.0001 | (−47.2653, −25.5709) |
| 12 | 1 | −31.5267 | 6.7196 | 60.1 | −4.69 | <.0001 | (−44.9674, −18.0859) |
| 16 | 4 | −43.2597 | 8.9220 | 48.7 | −4.85 | <.0001 | (−61.1923, −25.3270) |
| 16 | 1 | −18.4896 | 9.0975 | 53.1 | −2.03 | 0.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 条:
| 访视 | 研究药物 − 安慰剂 | SE | DF | t | Pr > |t| | 95% CI |
|---|---|---|---|---|---|---|
| W2 | −1.8322 | 4.0327 | 52.1 | −0.45 | 0.6515 | (−9.9241, 6.2597) |
| W4 | 5.3674 | 4.8771 | 64.4 | 1.10 | 0.2752 | (−4.3746, 15.1095) |
| W8 | −0.7820 | 5.7107 | 68.9 | −0.14 | 0.8915 | (−12.1747, 10.6106) |
| W12 | −4.8915 | 8.6402 | 60.2 | −0.57 | 0.5734 | (−22.1734, 12.3904) |
| W16 | −24.7700 | 12.7445 | 51.7 | −1.94 | 0.0574 | (−50.3478, 0.8077) |
读结果的结论:W16 时研究药物相对安慰剂的 DAPSA 变化差值估计为 −24.77(负号方向有利于研究药物,因为 DAPSA 越低越好),95% CI 为 $(−50.35,\ 0.81)$ 跨过 0,双侧 $p=0.0574$。因此该亚组在 W16 未达到 0.05 水平的统计学显著性——但这是一个亚组分析,样本量小、缺失率高,本就不以支持确证性结论为目的。
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 / 36 | 80 / 36 | 设计一致 |
| UN(15 参数) | 未收敛(触发回退) | too many likelihood evaluations | 同样失败 ✓ |
| 最终结构 | CS | CS(AIC 427.26 → 552.00 最小) | 一致 ✓ |
| CS 估计 | 73.2028 | 76.4574 | 真值 73.2028,还原良好 |
| Residual 估计 | 61.7798 | 60.4327 | 真值 61.7798 |
| CS 渐近 SE | ≈25(由 CI 反推) | 28.3331 | 量级一致 |
| Residual 渐近 SE | ≈13.8(由 CI 反推) | 14.0333 | 高度一致 |
| −2 Res Log Like | 545.7113 | 547.9963 | 不同数据实现,不可直接相等 |
| AIC / AICC / BIC | 549.7 / 549.9 / 552.9 | 552.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 / 5 | 45 / 5 | 组合数一致 ✓ |
② 信息矩阵:解析解 $\mathcal I$ 与数值 Hessian $\tfrac12\nabla^2(-2\ell_R)$ 最大相对偏差 4%(有限差分误差量级)。
③ 尺度口径:补上常数项 $(N-p)\log 2\pi$ 后,−2RLL 与真实输出同量级(差 2.3,源于不同数据实现)。
22.5 三个必须记住的陷阱
TRT01PN 的系数恰好等于 W16 的差值——这是巧合,不是规律
本例中 TRT01PN 4 的估计是 −24.7700,而 W16 的 Diffs 也是 −24.7700。完全相等的原因是:AVISITN 的参考水平是 16、TRT01PN 的参考水平是 1,于是"治疗主效应"这一项在代数上恰好就是"参考访视(W16)上的治疗差值"。
一旦 ref= 改变、或改用其他参数化,这个等式立即失效。不要从 SolutionF 里抄一个系数当作目标访视的治疗差值。
Type 3 的 TRT01PN P 值不是"治疗是否有效"
含交互项时,Type 3 的 TRT01PN 检验的是"在参考访视上治疗效应是否为 0"(或因参数化而异的某个特定对比),不是跨所有访视的整体治疗效应。本例 $p=0.2568$,而 W16 的差值 $p=0.0574$——两者回答的是不同问题。
不要把亚组结果当成确证性结论
本亚组 36 例、缺失 55.6%、UN 无法收敛而回退到 CS。这些条件决定了它的定位是探索性/一致性考察。任何"某亚组显著/不显著"的表述都必须伴随样本量、缺失率和结构回退的说明。
22.6 从统计量到临床解读:−24.77 到底意味着什么
把 LSMean 差值读成结论,需要三步,缺一步就会出错。下面用本例真实的访视别差值走一遍。
访视别差值:真实的完整轨迹
| 访视 | 研究药物 LSMean | 安慰剂 LSMean | 差值(药物 − 安慰剂) | SE | DF | 95% CI | P |
|---|---|---|---|---|---|---|---|
| W2 | −5.2923 | −3.4601 | −1.8322 | 4.0327 | 52.1 | (−9.92, 6.26) | 0.6515 |
| W4 | −9.3532 | −14.7206 | +5.3674 | 4.8771 | 64.4 | (−4.37, 15.11) | 0.2752 |
| W8 | −19.8277 | −19.0457 | −0.7820 | 5.7107 | 68.9 | (−12.17, 10.61) | 0.8915 |
| W12 | −36.4181 | −31.5267 | −4.8915 | 8.6402 | 60.2 | (−22.17, 12.39) | 0.5734 |
| W16 | −43.2597 | −18.4896 | −24.7700 | 12.7445 | 51.7 | (−50.35, 0.81) | 0.0574 |
终点为 DAPSA 较基线变化,数值越低越好,因此负值表示研究药物组改善更多。数据来源:Differences of Least Squares Means,同访视 TRT01PN=4 减 TRT01PN=1。
轨迹能读出什么(以及不能读出什么)
分离主要发生在 W12 之后,且来自安慰剂组回退
研究药物组从 W12 的 −36.4181 继续改善到 W16 的 −43.2597(再降 6.84);安慰剂组却从 −31.5267 反弹到 −18.4896(回退 13.04)。W16 的组间差距,很大程度上是安慰剂组失去已获得的改善造成的,而不是研究药物组在后段"额外发力"。
W4 的反向信号不应过度解读
W4 差值为 +5.3674(安慰剂改善更多),W8 又回到 −0.7820。在 36 例、缺失 55.6% 的亚组里,这种符号摆动属于噪声范围。逐访视挑出"最好的那个 P 值"是选择性报告,必须整体呈现五个访视。
SE 随访视递增,是信息量在流失
SE 从 4.0327(W2)升到 12.7445(W16),DF 从 68.9 降到 51.7。这不是模型变差,而是后段可用观测越来越少。W16 的 CI 宽达 51.16,说明"点估计最大"与"证据最强"是两回事。
差值可以分解,便于复核
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 | 重要但不显著 —— 本例属于此类区间:幅度可能可观但证据不足,应如实报告并提示样本量限制 | 既不显著也不重要 |
方差参数的计算原理:REML 全链路推导
从 $V$ 的构造到 score、Fisher 信息、迭代收敛,再到 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.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 的根本区别。
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 对数似然:
$$\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}$$
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)$,三项合并即得:
$$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.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 | — | 基于梯度的收敛判据,不是相邻两次目标函数之差 |
自研引擎: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 量级一致。
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.711 | 549.7 ✓ |
| AICC | $-2\ell_R + \dfrac{2dn}{n-d-1}$ | $545.7113 + \dfrac{2\cdot2\cdot69}{69-2-1}$ | 549.893 | 549.9 ✓ |
| BIC | $-2\ell_R + d\log n$ | $545.7113 + 2\ln 36$ | 552.878 | 552.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 调整后的协方差矩阵为
$$\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 的
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}$
$$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$。
在 22 节那套 80 条观测、36 名受试者的稀疏数据上,KR 的修正就明显得多:W16 差值的 SE 从 model-based 的 6.0156 膨胀到 7.3021(+21%),自由度降到 13.78。 样本越小、缺失越多、协方差参数估计越不稳定,KR 的修正越大——这正是小样本必须用 KR 而不是 model-based 的原因。
五类 SAS 报错:诊断决策树与修改策略
哪些是真错误、哪些只是提示、谁会引发谁——以 CS 回退为贯穿案例
24.1 先建立因果顺序:一张决策树
这五条提示不是并列的。有些是"模型根本没拟合完",有些是"拟合完了但结果不可信",还有些只是需要记录在案的提示。分清层级,才能决定下一步动作。
ConvergenceStatus.reason 是否等于 "Convergence criteria met."?24.2 / 24.3(Hessian 非正定、AsyCov 奇异)是"跑完了但不可信"——点估计可能还能用,但标准误、CI、P 值不可靠。
24.4(零方差不贡献 DF)是"需要记录"——通常不必改模型,但必须在 QC 与报告中说明。
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 自由度。
修改策略(按优先级):
先确认是不是边界问题
看 CovParms:是否有估计值≈0、或相关系数接近 ±1。若有,说明模型在该处退化了。
检查单元格观测数
逐单元格数观测数。空单元格或只有 1–2 条的单元格是 UN 非正定的首要原因。
降低结构复杂度
UN → TOEP/TOEPH → AR(1)/ARH(1) → CS/CSH。参数越少,Hessian 越容易正定。
加 ASYCOV 看细节
proc mixed ... asycov; 输出渐近协方差矩阵,定位是哪几个参数之间出现了完全共线。
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 的自由度公式要对所有协方差参数求和,但零方差参数不携带不确定性信息,因此不计入自由度计算。
如何确认。打开 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 的生产级回退
把上面几条串起来,看真实项目里是怎么处理的(代码已掩蔽:
/* 步骤 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 脚注使用 |
CSH。写 TYPE=HCS 会直接报错。核对 SAP 与代码时,这一类"同一结构、不同软件不同名"的坑需要专门过一遍:UN / TOEP / TOEPH / AR(1) / ARH(1) / CS / CSH / CSH 等。
24.8 交付前的最小检查清单
收敛
ConvergenceStatus 已生成,且 reason = "Convergence criteria met.";日志中无 Hessian / AsyCov / 零方差相关 NOTE,或已有记录与批准。
结构
Model Information 中的协方差结构与 SAP 一致;若发生回退,回退路径与 AIC 依据已记录。
数据
受试者数、观测数、各单元格观测数与预期一致;Read = Used 或已解释 Not Used 的原因。
参数
所有方差为正;相关系数在 (−1, 1) 内;无异常极端的估计值。
结果
目标访视每条治疗组一行 LSMean;AVISITN 与 _AVISITN 都等于目标访视;SE、DF、CI、P 值来自同一条比较行。
稳定性
改变协方差结构后,目标访视的 LSMean 差值与结论是否保持稳定;若敏感,需在报告中说明。
— End of Guide —
MMRM Deep Dive Guide v2.5 · Built with care for the biostatistics community