# 第 4 步：真实纵向论文验证 v2.2

本案例是 **medplot 的限定作者方法复算**，研究设计为患者重复随访。先完成[三篇候选与材料门槛核查](纵向论文候选v2.2.md)，再冻结目标，然后运行。它补充 NHANES 横断面案例，不是全论文重跑、统计专业认证、AI 测评或真人试用。

论文：Ahlin Č, Stupica D, Strle F, Lusa L. *medplot: A Web Application for Dynamic Summary and Analysis of Longitudinal Medical Data Based on R*. PLOS ONE. 2015;10(4):e0121760。[PubMed](https://pubmed.ncbi.nlm.nih.gov/25837352/) · [完整正文与全部 SI](https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0121760) · [作者代码](https://github.com/crtahlin/medplot)。期刊有 Clarivate 官方历史 SCIE 公告，但本轮未取得当前 MJL 或 2015 年单篇 WoS 入藏号；详见候选记录，不能用 PubMed 推断 SCIE。

## 研究卡片：已知与待补充

| 项目 | 原文 / 作者代码可核查的信息 | 尚待核查 |
|---|---|---|
| 问题与人群 | 作者用早期莱姆病 EM 成人患者的公开临床数据演示纵向统计。限定问题：第 14 天与基线相比，恶心强度 / 是否恶心的模型对比是多少？ | 不能把演示数据当成完整原始试验队列；源研究完整纳入 / 排除流程不在此次复算材料中核定 |
| 目标量与方向 | 分类时间 14 相对 0 的 VAS 均值差 β；`Nausea>0` 的患者条件 OR。两者分别报告，不是中位数差、RR、HR 或治疗因果效应 | 原文用“odds”说明 OR，但没有现代目标量完整定义；边际效应与总体标准化不在本次计算内 |
| 分析单位 | 独立对象是 PersonID 患者，行是患者-访视。计划类别 0、14、180、365，参考 0；随机患者截距处理对象内相关 | 公共文件不允许识别患者；既不回查个体也不连接其他数据。观察队列的抽样代表性没有得到证明 |
| 变量 | PersonID；Date（dd.mm.yyyy）；Measurement；Sex（Male/Female）；Age；Culture；Response；ResponseLast；16 个 0–10 症状（Fatigue 到 Irritability）。选定结局为 Nausea；0 阈值二分 | 当前量表均值建模的分布适合性、二分损失及临床意义须另行讨论；不得凭正态性 P 值自动改模型 |
| 排除与缺失 | 作者函数每个结局 `na.omit`；原文件原样读入，无自行排除、插补或把缺席填 0。访视缺席与已记录访视中的变量 NA 分开审计 | 缺席原因和缺失机制未知；不能由结局 NA 少推断随访无缺失或 MAR 成立 |
| 时间起点 | 访视标签 0 是基线；模型用分类 Measurement。另用患者基线 Date 算实际间隔作质量检查 | 正文 p2 / p10 的时点描述不同；例程没有 2 月类别。实际日期有一条先于基线，保留异常，不擅自修复 |
| 调整 | 时间作为单一类别固定效应，患者随机截距；没有新增年龄、性别等固定调整变量。只复算原文选定描述关联 | 不借复现认可不调整的因果充分性，不按单因素 P 值选协变量 |
| 连续模型 | 作者 `lmerTest::lmer(Nausea ~ Measurement + (1|PersonID))`，默认 REML；默认 profile CI，summary 的 Satterthwaite P | 旧代码 `lmerTest::summary` 在当前包已不导出：原样运行失败；单处 S3 调用兼容运行分列保存 |
| 二分类模型 | 原作者 `glmer`，binomial/logit，随机截距，默认 Laplace（nAGQ=1）；指数化系数，正态 log-Wald CI，Wald z P | 条件 OR 不等于 GEE 的边际 OR；95% 区间有正文与 SI 冲突；没有恢复原 2015 软件版本 |
| 诊断 | 本轮实际核对患者-时点键、取值范围、分母、日期、逐时点阳性 / 阴性频数、模型观察数与患者数、收敛代码 / 消息、梯度和奇异拟合 | 作者没有为这两个模型提供完整诊断报告；本轮未独立评价残差、随机效应分布、影响点、缺失敏感性、替代相关结构或所有模型的多重性 |

上述设计内容是人工编码的文献卡片。向导只有研究者输入，没有读取论文或数据的能力；把 812 写进人数框时，它只能提醒核查独立对象，不能自动纠错。

## 冻结、来源与版本

- 27 个冻结数字、原文位置、舍入位数和半末位容差在 `data/纵向论文目标v2.2.json`；整数容差为 0。冻结时间先于任何模型运行，SHA-256 固定在复算 / 检查入口中。
- 来源、每个下载文件哈希、作者提交、许可及数据版本核查在 `data/纵向论文来源v2.2.json`。选定提交 `b81c02788e9a223505ac8dc7b52fd9a641669b2d` 是公开仓库发表前最新可定位版本，**不是原文明示的确切运行版本**。
- 当前作者最新提交的数据与该输入逐字节相同。正文与 SI 的冲突保留，不通过更换版本或期望值消除差异。
- [统一纵向结果对象](assets/纵向论文结果v2.2.json)保存作者原样 / 兼容运行、分母、缺失、目标量、方向、算法、环境、实际诊断、警告与 27 个逐项状态。[逐项对照表](纵向论文对照v2.2.md)、图注、网页文字都由该对象生成。
- 环境锁分别在 `config/纵向R环境锁v2.2.json`、`config/文献检索环境锁v2.2.txt`，不改第 3 步锁。R 的 DESCRIPTION 原始版本（例如 3.2-1）用于比较，不能误把显示规范化版本当漂移。

正文与 19 个 SI 文件已下载、核查文件格式、哈希；正文共 19 页，选定数字的 PDF p11 / p13、S1 / S13 / S14 TIFF 实际查看。不能把获取全部 SI 写成重跑全部补充分析。

## 离线核对与限定重跑

在项目根目录执行。快查只需现有 Node / Python 标准库，无网络、无需 R：

```sh
npm run check:offline
python3 -S scripts/纵向结果v2.2.py check
```

这只检查保存结果的来源 / 哈希、27 项对照算术、派生文件及规则测试。允许真实 `DIFFERENCE`；“工程通过”不表示全部数字一致。本轮接受条件是成功计算限定模型、如实保留差异及未完成事项，不是强迫 27/27。

要实际重新下载并拟合选定模型，显式运行完整入口 `npm run replay:longitudinal`。首次准备：

```sh
python3 -m venv build/文献检索环境v2.2
build/文献检索环境v2.2/bin/pip install -r config/文献检索环境锁v2.2.txt
PATH="$PWD/build/文献检索环境v2.2/bin:$PATH" npm run replay:longitudinal
```

完整入口顺序为：获取选定许可材料 → 按自定义锁恢复 R 包库 → R 读取公共输入实际拟合 → 导入实际运行结果并生成教学产物 → 离线核对。下载文件都在 `build/纵向论文材料v2.2/`；已有材料复用，运行前与固定来源哈希比较。若出版者文件、版本、R 或包改变，入口停止，请调查来源漂移，不能重新冻结旧目标来制造通过。入口不会检索任意本地数据目录。

也可直接重算已下载材料：

```sh
Rscript --vanilla scripts/纵向论文复算v2.2.R
build/Python恢复环境v2.2/bin/python scripts/纵向结果v2.2.py build build/纵向论文重跑v2.2/纵向计算结果v2.2.json
```

生成图需要第 3 步已锁定的 Python 绘图库；一键入口首次会按该锁在项目内新建 venv。R 锁不安装系统 R。本轮在同一 macOS/arm64 主机，从空包库恢复 35 个锁定包 / 基础组件版本后运行，仍共享系统 R/OS/BLAS，不是容器或跨平台验证。nloptr 初次安装因缺 CMake 失败，项目内补齐 CMake 后恢复成功；保留失败与重试日志。

## 复现与方法讨论分开

复现回答“公开输入和原方法能否产生这些数字”。方法讨论还需回答：目标人群和目标量是否恰当，0–10 强度建模及二分是否合理，随机截距 / 残差假设与信息性失访如何核查，多结局多时点怎样控制误差，条件 OR 是否适合研究问题。这里没有为作者补做全部敏感性分析，也没有证明本向导覆盖所有纵向设计。

8 个新增案例测试覆盖重复结构、时间类别、参考方向、失访与变量 NA、条件 / 边际 OR、未知目标量 / 结构、稀疏性以及无法认证填写人数的边界。原 32 个研究卡片测试继续通过。这是**规则回归检查**，并非独立盲测或大模型正确率测量。

## 署名与许可

正文和附录按出版者 CC-BY-4.0 获取；medplot 包由 Črt Ahlin 编写并有 Lara Lusa 设计 / 编码贡献，DESCRIPTION 与附带文本声明 GPL-3。数据随该包分发，但没有独立数据许可声明。作者文件、兼容改动后的 GPL 派生文件仅保存在忽略的 build，未放进本项目 MIT 源码或上传。公开工作区的结果 / 引用仍保留上述署名；本步未执行发布。

接口依据：[lme4 lmer](https://lme4.github.io/lme4/reference/lmer.html)、[glmer](https://lme4.github.io/lme4/reference/glmer.html)、[收敛说明](https://lme4.github.io/lme4/reference/convergence.html)、[lmerTest 官方手册](https://cran.r-project.org/web/packages/lmerTest/lmerTest.pdf)。采用官方 `renv::restore(project, library, lockfile)` / 显式 `snapshot`，不用默认文件名或扫描整个工作区。本步另设独立限定重跑入口，未改既有 targets 目标图，也未将此案例冒称已纳入旧三案例图。
