Skip to content

R9 按 v4 流程重跑 · 执行实录

这个目录是「做了什么」,不是「该怎么做」。 方法定义在 分析流程定稿 v4, 定序理由与查证过程在 流程答疑答疑 · 数据版本与作图。 两者不要混:那边改了叫「改流程」,这边改了叫「改记录」。

2026-08-07 起,R9 主线(FinnGen R9 糖尿病并发症 × UKB-PPP 血浆蛋白) 在全新目录里从零重跑一遍。本目录逐步记录: 用了什么数据和版本 · 什么检验方法 · 结果是什么 · 结果文件在哪 · 怎么解读 · 进正文还是补充。

本页 2026-08-07 已从 v3 刷到 v4

重跑开跑时依据的是流程 v3,跑到第 2 步之后流程升级到 v4(改动见下)。 已完成的 A/B/0/1/2 五个检查点不受影响——v4 的两处变更都落在第 4 步及以后, 前三步的方法与数字一个没动。本页与各分页已按 v4 重述, 第 3 步起一律按 v4 执行

目录名仍是 05-R9v3重跑实录 且不会改:它是 URL 与文件路径, 改名会断掉计划文件、记忆与已发布页面里的全部链接。 这与「结果 CSV 保留 T1D_gcst 而图上用 Type 1 diabetes」是同一条原则—— 路径层保留标识符,展示层改文案


v3 → v4 改了什么(对本轮的影响)

变更内容对已完成步骤的影响
① 第 4 步拆成 4a / 4b / 4c4a 换暴露平台 · 4b 换结局队列 · 4c 两侧都换无(第 4 步尚未开始)
第 4 步不再有否决权复制只分流,不判真伪;否决提出来成独立的 4X 表位 / PAV 调查
③ MHC 判定改用数据源自带标记不再自己划坐标,用工具表的 MHC 列(= Sun 2023 的 25.5–34.0 Mb,27 个✅ 第 1/2 步已按此执行

v4 的 ①② 两条没有直接文献先例,来自结构推理与本课题 APOL1 实例。 写 Methods 时必须声明这是本研究自定的流程,不能挂靠文献——详见 v4 定稿 §5 的证据强度表


为什么要重跑(而不是在旧结果上打补丁)

流程变更不改 MR 估计本身

变更对数值的影响
不设 MHC 排除步骤无 —— 旧代码本来就没在工具选择阶段排 MHC
顺序改成 方向性 → 外部复制 → 共定位无 —— 纯否决步骤的交集可交换,最终存活集不变
外部复制改三分法(「不可评估」不再当阴性)存活者变多,不减少
v4:复制降为分流、否决移到 4X存活者可能再变多(复制方向相反不再直接出局,改为送查)

所以主链数字预期基本不变。重跑的价值在另外三点:

  1. 血统清晰 —— 避免「上游改好了、下游还是旧产物」(2026-07-29 踩过)
  2. 口径统一 —— in_MHC 原先四处写法不一(两处硬编码蛋白名、两处坐标写错成 25 Mb),现统一到 analysis/_mhc.R
  3. ★ 顺带验准确性 —— resume: false 从零重算,与旧结果逐项比对, 等于给之前三个月的结果做一次完整的可复现性证明(结果见文末)

★ 结局命名对照(本目录内一律「内部 ID」,交付物一律「显示名」)

本目录是执行实录,表格与正文用内部 ID——因为它们就是文件名、代码变量名与日志里的字符串, 换成显示名就找不到东西了。但内部 ID 绝不允许出现在图上或论文表格里。

内部 ID(本目录用)论文显示名数据来源(写图注/Methods,不写图上)
RetinopathyDiabetic retinopathyFinnGen R9 DM_RETINOPATHY_EXMORE
MaculopathyDiabetic maculopathyFinnGen R9 DM_MACULOPATHY_EXMORE
NephropathyDiabetic nephropathyFinnGen R9 DM_NEPHROPATHY_EXMORE
NeuropathyDiabetic neuropathyFinnGen R9 DM_NEUROPATHY
NeovascGlaucomaNeovascular glaucomaFinnGen R9 DM_NEOVASCULAR_GLAUCOMA
T1D_gcstType 1 diabetesGWAS Catalog GCST90824163
T2D_mahajanType 2 diabetesDIAMANTE Mahajan 2018b, noUKBB
T1D_crouchType 1 diabetes (Crouch)GCST90013791(零重叠备选)

转换由 analysis/_viz_common.Rpretty_outcome() 负责,strict = TRUE 时遇到未登记 ID 直接报错

⚠️ 三个已知的泄漏口,均未修,统一留到第 7 步(详见 答疑 Q4):

  1. 结果 CSV 的行列名就是内部 ID —— 实测 results/19 个文件T1D_gcst/T2D_mahajanpretty_outcome() 只在画图代码里被调用,管不到 CSV
  2. screen_R9_dm/SUMMARY_publication.csv 风险最高 —— 文件名带 publication、 内容正好是正文 Table 1 的原料(每结局病例/对照/工具数/最小 F/显著数), 而 outcome 列写着 T1D_gcst这是 19 个里唯一命名本身诱导犯错的。
  3. 图的副标题是自由文本,pretty_outcome() 管不到——实测 LDSC 热图副标题写着 FinnGen R9_dm endpoints既含内部 ID 又是事实错误(6 个性状里 2 个不是 FinnGen)。

修法(第 7 步统一做):写「发表版导出」函数,行列名过 pretty_outcome() 另存一份; 加断言「图内任何文本不得含 R9_dm|R13|_gcst|_mahajan|_finngen」。 不改结果文件本身——那会破坏文件名 ↔ 代码字符串的对应关系。


两条贯穿全程的纪律

纪律一:每步的记录分两半,前半必须在跑之前写完

数据源 + 版本 + 文件绝对路径实际结果数字
检验方法 + 关键参数 + 文献出处实际产物路径
★ 预期结果(具体数字/范围/"应与旧结果逐位相同")解读
预期产物路径暂定正文或补充

★ 跑前写下的预期与实际不符,一律先按缺陷处理,不许现场解释掉。 理由:事后补填的"预期"没有约束力 —— 任何差异都能在事后编出一个合理解释, 而这正是最难自查的一类错误。

纪律二:正文/补充的归属在第 7 步之前只能是暂定

第 4 步的分流结果会变、4X 的否决会变、第 5 步的升级集会变,图表归属跟着变。 每步只记「暂定去向 + 依据」,第 7 步统一复核一次,避免前后打架。


检查点与进度

代码脚本与流程步骤不是一一对应01_screen.R 一个脚本里同时做了 第 1 步(F/R²、Steiger filtering)和第 2 步(Wald + FDR)。 处理办法是不动代码,一次运行产出两份记录,分两次检查 —— 记录粒度可以细于运行粒度。

★ 全流程只有两个否决点:第 3 步 与 4X。 其余步骤或分流、或升级措辞、或只标注。

#检查点权限状态记录
A备份与环境基线✅ 完成00 备份与环境基线
B新建目录 + 改代码 + 写死断言⚠️ 主体完成,2 处待决01 新建目录与代码改造
0数据验收(输入断言 + LDSC)✅ 完成02 第 0 步 数据验收
1工具选择✅ 完成03 第 1 步 工具选择
2MR + 多重检验校正✅ 完成04 第 2 步 MR 与多重检验校正
3方向性 / 反向 MR★ 否决✅ 完成05 第 3 步 方向性与反向 MR
4a外部复制 · 换暴露平台(deCODE)加分筛✅ 完成06 第 4a 步 换暴露平台
4b外部复制 · 换结局队列(MVP / Salem)分流✅ 完成07 第 4b 步 换结局队列
4c外部复制 · 两侧都换(确证,不筛查)分流⬜ 下一步
4X表位 / PAV 调查★ 否决(全流程唯一)
4.5通路富集(用 4X 之后的集合,按 MHC 分组)描述
5共定位★ 措辞升级关卡
6描述性注释 6-1~6-4(合并为一个检查点)描述
7定稿 + 漏斗图 + 正文/补充统一复核 + 发表版命名导出

关于第 0 步的 LDSC

v4 §3.2 规定 LDSC 非必需——它是性状层的数据体检,不是筛选链的一环, 触发条件是「换了结局数据源」或「需要估计样本重叠」,本轮两个条件都不满足。

本轮仍然跑了,原因是用户指定要跑,不是流程触发。 记录时已标注为「用户指定,非流程必需」,写 Methods 时按数据描述处理,不进筛选漏斗。


漏斗总表

这张表就是最终正文 Figure 1 的原料。每过一个检查点填一行,空着的不许预填

节点蛋白数蛋白×结局 对数其中 MHC 蛋白旧值(对照)
工具池(cis 记录)1,9541,955 条27
└ 标准化后可用工具1,875 SNP(含 1 条无 rsID 不可用)
MR 显著(FDR < 0.05,五并发症)31571131 蛋白 / 57 对 ✅ 一致
├ 第 3 步 通过49
├ 第 3 步 功效不足-无法评估(保留)44旧口径会否决其中 1 对
└ 第 3 步 否决(★否决点)41旧 FDR 口径为 8 对
第 3 步后存活295311退出 ITGB7TIGIT
├ 4a 对工具选择稳健(加分)22deCODE 覆盖 20/29 蛋白
├ 4a 不可评估(保留)27缺口集中在 MHC(5/9)
└ 4a 方向相反 → 送 4X4APOL1 · MICB_MICA×2 · AOC1
├ 4b 复制成功(FDR<0.05 同向)7全在糖网
├ 4b 不可评估(保留)19全是 Maculopathy,无外部队列
├ 4b 方向一致未达 FDR(保留)21
├ 4b 方向相反未达 FDR(保留)5离阈值远,属噪声
└ 4b 方向相反 → 送 4X1TRIM40 × Retinopathy
4c 两侧都换(确证)待跑
4X 调查后存活(★唯一否决点)
第 5 步 共定位升级15 对 / 12 蛋白(旧口径)

⚠️ 4a 三行相加 = 53 = 进入 4a 的总数,不是"淘汰"。 4a 一个也不淘汰——它是加分筛:22 对加分、4 对送 4X 调查、27 对保留待定。 真正的淘汰只发生在第 3 步4X 两处。

★★ 4a 与 4b 没有任何一对同时报警 —— 这是 v4「两者盲区互补」的实证: 4 个 4a 报警里 2 个落在 4b 盲区(Maculopathy 无队列),唯一的 4b 报警落在 4a 盲区 (deCODE 无 TRIM40)。交叉表见 07 页 §8

4a 的定位在执行中被订正过:原先按「分流器」实现,读 C1R 原文后改为 「稳健性加分筛」。前四版实现连续判定失效,教训见 06 页 §8.6


★ 可复现性证明(本轮的额外收获)

resume: false 从零重算,与三个月前的旧结果比对:

结果
LDSC(第 0 步)rg / rg_long / h2 三个文件 cmp 逐字节相同;6 个 sumstats 字节大小全同
工具选择 + MR(第 1/2 步)results/screen_R9_dm/16 个 CSV MD5 全部相同
反向 MR(第 3 步)104 个文件 cmp 逐字节相同(主产物 2 + _iv 7 + _prot 95)

→ 已证明:流水线这三层确定性、环境未漂移、旧结果可信

★ 第 3 步的做法值得复用:先用未改动的代码验可复现性,再应用新规则, 两份产物都留档(原口径存为 reverse_mr_results_ORIGGROUPING_20260807.csv)。 既不丢证明,也避免「跑完再挑口径」。

⚠️ 只能推到已跑过的层。第 4 步及以后尚未验证,不得据此声称"整条流水线可复现"。


相关

个人科研与运维文档 · 内容持续修订