主题
判定标准与 skill 合规打分
这一页解决的问题:以前判定「算不算问题」靠临场判断,同一件事一会儿说有错、一会儿说没错。 本页把标准写死,并用外部 skill 的清单给本课题打分。
一、为什么要有这一页
2026-08-05 的核查过程中,出现过五次「先喊告警、后判定」,对外表现就是反复横跳:
| 先报的 | 实际 |
|---|---|
Nephropathy_dkd 列映射「★缺」 | 调用处有显式 column_map,正常 |
| T2D Mahajan p 值「★不一致」 | 发表文件只留 2–3 位有效数字所致 |
暴露 log10(p) 相关只有 0.59 | 核查脚本自身的 1e-300 下限造成的假象 |
| AMD 线「Steiger 剔除 5 个」 | 玩具夹具(pos_exp.tsv,20 个假 SNP)的日志 |
| AMD 仓库缺 Steiger units 修复 | 逐条实测 0/1659,零影响 |
根因不是判断力问题,是流程问题:原始告警被当成结论发布了。 解法是先定义分级,判完再报。
二、缺陷分级(判完才归类,归不进去的不叫问题)
| 级 | 定义 | 必须给出 | 本轮实例 |
|---|---|---|---|
| D0 数据错误 | 输入违反其声明遵循的公开规范 | 规范原文 | T1D GCST90824163 的 effect_allele_frequency 整列反转(违反其 meta.yaml 声明的 GWAS-SSF v1.0) |
| D1 实现错误 | 代码与权威实现/公式矛盾 | 源码或文献 | 导师 se_mr 未取绝对值(TwoSampleMR::mr_wald_ratio 源码为 se_out/abs(b_exp)) |
| D2 结构性隐患 | 当前输出正确,但正确性靠未加断言的巧合 | 说清巧合是什么 | maf 混在 eaf 别名表;pval/mlogp 靠别名顺序;六个脚本的 flip 只按字母配对 |
| D3 代码漂移 | 两份副本不一致 | 必须实测影响 | AMD 仓库 05_harmonise.R 缺 2026-08-01 的 Steiger units 修复(实测 0/1659,零影响) |
| N 非缺陷 | 发表精度 / 核查工具产物 / 已记录的设计选择 | 说清归因 | Mahajan 舍入、pnorm 下限 artifact、Salem 的 column_map、玩具夹具日志 |
报告规则
原始告警不是发现。 只有归进 D0–D3 才叫问题; N 类只说「查过,正常」,不作为问题报出。
三、阈值的出处必须分层
写 Methods 时,有出处的直接引,没出处的必须写明是本研究的操作定义。混为一谈是审稿人最容易抓的点。
有外部依据
| 判据 | 阈值 | 出处 |
|---|---|---|
| 效应等位必须两侧一致 | — | Burgess 2023 Wellcome Open Res 4:186 §4 |
| 用等位频率交叉核对方向 | — | 同上:"double-checked by comparing allele frequency information" |
| 回文 SNP 无法定链 | MAF > 0.42 | TwoSampleMR harmonise vignette |
effect_allele_frequency 必须是效应等位的频率 | — | GWAS-SSF v1.1.0 Table 1(Mandatory) |
| Wald 比值 SE | se_out/abs(b_exp) | TwoSampleMR::mr_wald_ratio 源码 |
| 工具强度 | F ≥ 10 | Staiger & Stock 1997;Burgess 2011 |
| cis 窗口 | ±500 kb | Schmidt 2020 Nat Commun 11:3255 |
| 窗口内 clumping | r² < 0.1 | Schmidt 2020 |
| 共定位 | PP.H4 ≥ 0.7 提示 / ≥ 0.8 发表 / ≥ 0.95 工业级 | Mountjoy 2021;Wallace 2020 PLoS Genet 16:e1008720 |
| 跨平台 | 方向一致是硬要求 | Eldjarn 2023 Nature 622:348 |
| MR-PRESSO | NbDistribution ≥ 5000 发表 | Verbanck 2018 |
本研究自定(必须标明)
| 判据 | 阈值 | 说明 |
|---|---|---|
| eaf 与 1000G「接近」 | |Δ| < 0.05 | 经验值,无文献 |
| 判定「整列反转」 | 反转率 ≥ 50% | 经验值 |
| β/se 重算 p 的容差 | 中位 |Δlog₁₀p| < 0.05 | 经验值 |
| 无 rsID 数据集的排序等位键 | — | 工程选择,依据为实测(1,656 vs 956) |
| 以 1000G 为第三方逐位点裁决 | — | 指南只说「比频率」,用外部面板是本研究的加强 |
四、两个 MR skill 是什么
2026-08-05 从 GPTomics/bioSkills 装到 ~/.claude/skills/ (收录于 GoekeLab/awesome-genomic-skills)。两份 SKILL.md 已逐行读完并 cmp 校验。
bio-causal-genomics-mendelian-randomization(412 行)
通用 MR 方法学。核心是三张表:
- 统计模型分类表:15 种方法(IVW 固定/随机、MR-Egger、加权中位数/众数、MR-RAPS、CAUSE、GSMR-HEIDI、MR-PRESSO、MVMR、MR-Clust、LCV、LHC-MR、MRlap、DRMR…),逐个给出多效性假设、最少工具数、优势、什么情况下失效
- 按场景的决策树:标准两样本 / 单样本 / 部分重叠 / 药靶 cis-MR / MVMR / 中介 / CHP 风险高 / 二分类 / 生存 / 非线性,各自的主分析与敏感性组合
- 单双样本偏倚方向表:单样本 F<10 偏向观察性估计;两样本无重叠 F<10 偏向零;部分重叠居中
- 阈值→出处表、方法冲突时的裁决表、常见错误表(如「F 值从结局算」「把 UKB-on-UKB 当两样本」)
bio-causal-genomics-proteome-mr-drug-target(464 行)
cis-pQTL 药靶专用,与本课题完全对口:
- 数据源分类表:UKB-PPP(Olink, 54,219 人)/ deCODE(SomaScan, 35,559)/ Fenland / INTERVAL / ARIC / FinnGen-PPP / AGES,各自的 N、蛋白数、参考文献、什么情况下不适用
- PP.H4 三档阶梯:0.7 提示 / 0.8 发表 / 0.95 工业级
- 失效模式:Olink vs SomaScan 平台不一致(表位伪影)、cis 窗口内 LD 多效(邻近基因中介)、疾病→蛋白反向因果、PAV 伪影、trans-pQTL 误用、UKB-on-UKB 样本重叠
- ★七条三角验证要求与证据阶梯(见下节)
- 审稿人质疑对照表:九类质疑与标准回应
五、七条三角验证 —— 本课题打分
skill 原文(proteome-mr-drug-target L167–179)要求药靶主张必须有多条并行证据。 对 IFNAR1 × 黄斑病变逐条实测:
| # | 要求 | 实测 | 判定 |
|---|---|---|---|
| 1 | P < 0.05 / N_proteins | N=1587 → 门槛 3.15e-5;我们 p = 3.42e-5 | ❌ 差 8.6% 未过(FDR = 0.0049 过) |
| 2 | 共定位 PP.H4 ≥ 0.8 | 0.940,两法都支持 | ✅ 发表级(未达 0.95 工业级) |
| 3 | 跨平台复制,两边都显著 | 见下方★订正 | ⚠️ 方向达标,显著性不达标 |
| 4 | 跨队列复制(理想非必需) | deCODE(冰岛)+ ARIC | ✅ 部分 |
| 5 | PAV 排除敏感性 | 三候选工具全是非编码(IFNAR1 rs914142 内含子、ERMAP rs11210710 上游、APOL1 rs136168 内含子)→ 无 PAV 可排 | ✅ |
| 6 | 邻近基因不共定位(PP.H4 < 0.5) | 2026-08-05 已做,见下节 | ✅ 通过 |
| 7 | Open Targets L2G ≥ 0.5 | 2026-08-05 已查,见下节 | ⚠️ IFNAR1/ERMAP 不可评估;APOL1 0.914 |
第 6 条实测:邻近基因(2026-08-05)
skill 要求 cis-pQTL 不得与 ±500 kb 内非目标基因的 eQTL/pQTL 共享因果变异。三步实测:
① ±500 kb 内有无其他蛋白的 cis 哨兵
| 候选 | 邻居 |
|---|---|
| IFNAR1 rs914142 (chr21:33353501) | IFNGR2(61.5 kb)、IL10RB(63.5 kb)、GART(145.9 kb)、CRYZL1(271.2 kb) |
| ERMAP rs11210710 | 无 |
| APOL1 rs136168 | 无 |
→ ERMAP、APOL1 天然通过。IFNAR1 落在干扰素受体基因簇里,是最需要排查的一个。
② IFNAR1 与邻居哨兵的 LD(1000G EUR)+ 邻居自身的 MR
| 邻居 | 距离 | r² 与 rs914142 | 邻居自身在黄斑病变 |
|---|---|---|---|
| IFNGR2 rs9808753 | 61.5 kb | 0.0003 | β=+0.029, p=0.184 |
| IL10RB rs2515717 | 63.5 kb | 0.0048 | β=−0.005, p=0.919 |
| CRYZL1 rs13050238 | 271.2 kb | 0.0013 | β=+0.000, p=0.999 |
| GART | 145.9 kb | 哨兵无 rsID,无法算 LD | 未进入筛查 |
三个邻居与本候选的信号完全独立(r² ≤ 0.005),且自身在黄斑病变上全部不显著。 「效应其实来自干扰素受体簇的邻居」这一替代解释没有数据依据 → 第 6 条通过。
与 skill 原文的口径差异(如实声明)
skill 要求的是「对每个 cis-pQTL 跑 coloc.abf vs 邻近基因的 eQTL/pQTL,PP.H4 < 0.5」。 我们做的是更直接但不完全等价的三步:邻居哨兵存在性 → LD 独立性 → 邻居自身 MR。
- 优点:r² ≤ 0.005 已经排除了「同一因果变异」的可能(共定位要问的正是这个)
- 局限:未纳入 eQTL(如 GTEx 视网膜/全血),若邻近基因的表达信号与本候选共定位,本法查不到
- GART 的哨兵在 UKB-PPP 里无 rsID,LD 无法计算,只能记为未评估
第 7 条实测:Open Targets L2G(2026-08-05)
用 Platform GraphQL(credibleSets → l2GPredictions)查含各候选 cis-pQTL 的 GWAS 可信集:
| 候选 | 含该变异的 GWAS credible set | L2G |
|---|---|---|
| IFNAR1 rs914142 | 0 个 | 不可评估 |
| ERMAP rs11210710 | 0 个 | 不可评估 |
| APOL1 rs136168 | 3 个 | 0.914(Diabetic macular edema, GCST90383918)、0.915(Retinal edema)、0.860(APOL1 levels);且 APOL1 是该位点 top 基因 |
判读:L2G 的前提是该变异进入了某个 GWAS 的精细定位可信集。IFNAR1/ERMAP 的 cis-pQTL 在 Open Targets 收录的任何 GWAS 里都不构成可信集成员——这与我们的关联本就未达全基因组显著 (p=3.42e-5)一致。所以第 7 条对本课题的探索级发现属「不适用」,不是「不达标」。
顺带发现的可用外部资源
Open Targets 里有 GCST90383918 Diabetic macular edema 与 GCST90480055 Retinal edema (PheCode 362.9) 两项研究——本课题此前未使用, 可作为黄斑病变的独立外部复制候选数据源。
★ 重要订正:「三平台同向」≠「三平台都复制成功」
以往记录写「IFNAR1 三平台 OR 0.782 / 0.514 / 0.754 同向,是唯一全部通过的候选」。 按 skill 第 3 条复查 results/platform_check/ 后必须收回一半:
r9_somascan_mr.csv(那三个数的出处)三个平台用的是同一个 SNP rs914142 + 同一个结局 GWAS, 只换分母 b_exp(Olink −0.45 / deCODE −0.1663 / ARIC −0.3917)。
由于单 SNP Wald 下 MR 的 p 恒等于结局 p (见谐化页第九节), 三个「平台」的 MR p 值在数学上是同一个数。
- ✅ 「方向一致」有意义 —— 抗体与适配体测的是同向的东西,排除表位伪影
- ❌ 「两个平台都显著」不成立 —— 那不是两次独立检验
真正独立的复制是 decode_reselect_mr.csv(deCODE 自选工具,r² < 0.1 符合 skill):
| SNP | mr_b | OR | p |
|---|---|---|---|
| rs2834027 | −0.240 | 0.786 | 0.25 |
| rs17860260 | −0.218 | 0.804 | 0.43 |
| rs58886971 | +0.005 | 1.005 | 0.93 |
| rs62226453 | −0.106 | 0.900 | 0.79 |
方向 3/4 一致,但无一显著。
量级那一条应写「不适用」
0.782 / 0.514 / 0.754 → log-OR 比 2.7×,超 skill 的「within 2×」。 但三平台暴露单位不同(Olink NPX 的 SD vs SomaScan RFU 的 SD),量级本不可比。 Methods 应写明这一点,而不是报告为「不达标」。
另两条措辞必须改
- ERMAP 在两个 SomaScan 队列都不是有效工具(deCODE p=0.619 F=0.2;ARIC F=8.9 < 10) → 按 F ≥ 10 标准这是「未能检验」,不是「阴性」。写成「不复制」是错的。
- APOL1 与 skill 对照表完全吻合:Olink 显著有害 vs 两个 SomaScan 队列
b_exp符号相反 → "platform-discordant, do not claim"。已排除,判定一致。
证据阶梯上的位置
cis-MR 显著 = exploratory → +coloc ≥0.7 = 与共享因果一致 ← 我们在这里 → +跨平台显著 → +PAV/邻居清白 = 可发表的靶点提名 → +队列复制 +L2G = 临床药理级
第 1 条(Bonferroni 未过)决定文章只能定位 exploratory / nomination,不能写 drug-target claim。 skill 原文认可 FDR 用于 exploratory 场景。
六、按 skill 标准做的全面审计(2026-08-05 实测)
| skill 要求 | 我们 | 判定 |
|---|---|---|
| cis 窗口 ±500 kb | 哨兵距基因中位 0 bp、最大 4,997 bp | ✅ |
| 窗口内 clump r² < 0.1 | 每蛋白 1 个哨兵(更严) | ✅ |
| F 从暴露侧算 | add_f() 用 beta.exposure | ✅ |
| trans 不得入选 | filter: cis/trans == "cis" | ✅ |
| PAV 全部注释 | UKB-PPP 自带 VEP:382/1955 = 19.5% 是 PAV | ✅ |
| PAV 是否驱动显著结果 | 各结局显著结果里 PAV 占 11–22%,不主导 | ✅ |
| Steiger 反向因果 | 跑了,日志中从未剔除过任何 SNP(暴露 R² 远大于结局 R²) | ✅ 已跑非漏跑 |
| 效应量方向链 | 7 个结局逐条复算:b − β_out/β_exp ≤ 5.8e-15、OR − exp(b) ≤ 1.3e-13、EA 错位 0 | ✅ |
| 邻近基因共定位 | 未做 | ❌ |
| Open Targets L2G | 未做 | ❌ |
七、现存问题清单(按优先级)
| # | 问题 | 级别 | 影响 | 状态 |
|---|---|---|---|---|
| 1 | T1D 源 eaf 整列反转(93.7%) | D0 | T1D 支线 220 个回文工具方向反 | ✅ 2026-08-05 已修,见下节 |
| 2 | 哨兵位点硬断言未写成代码 | D2 | 同类 bug 无法自动拦截 | ✅ 已写进 verify_input_sanity.R D 项,7 条断言全过 |
| 3 | 邻近基因共定位未做 | — | 三角验证第 6 条 | ✅ 已做,IFNAR1 邻居 r²≤0.005 且自身不显著 |
| 4 | Open Targets L2G 未取 | — | 三角验证第 7 条 | ✅ 已查,IFNAR1/ERMAP 不可评估、APOL1 0.914 |
| 5 | maf 在 eaf 别名表 / pval 与 mlogp 靠顺序 | D2 | 当前未触发,换数据源可能踩 | 未修 |
| 6 | 六个下游脚本的 flip 只按字母配对(等价 action=1) | D2 | 边界已量化:三候选工具全非回文;deCODE 14 个工具仅 1 个回文且属已出局的 APOL1 | 未修 |
| 7 | AMD 仓库代码落后(05_harmonise.R + eaf 修复) | D3 | 实测 Steiger 零影响;eaf 部分必须同步(R13 也用同一个 T1D 文件) | ✅ 已同步并重跑 R13_dm |
| 8 | 多组学项目 eQTL/sQTL 输入未审计 | — | 影响「ERMAP 视网膜方向与血浆相反」这一条 | 未查 |
| 9 | Mahajan noUKBB 例数(55,005/400,308)出处待确认 | — | readme 只给全量 meta 的 74,124/824,006 | 待查 |
| 10 | Bonferroni 未过(3.42e-5 vs 3.15e-5) | — | 决定文章定位为 exploratory | 已知,写作时处理 |
| 11 | 邻近基因检验未纳入 eQTL | — | 第 6 条用 LD+邻居 MR 替代了 coloc vs eQTL;GART 哨兵无 rsID 未评估 | 待补 |
八、T1D eaf 修复的实测结果(2026-08-05)
做了什么
outcome_manifest.csv增列eaf_orientation(effect/other),仅GCST90824163一行标otherR/adapters/read_tsv.R按该字段取补——不硬编码翻转,让每个数据源自带口径- 新增
R/adapters/assert_eaf.R:每个结局读入后抽非回文位点对 1000G EUR 比频率,反转率 >50% 直接stop() - 断点缓存指纹 v1 → v2 并纳入
eaf_orientation(否则改了 manifest 缓存仍命中,修复静默失效) - 同一套修改同步到 AMD 仓库
mr-pipeline并重跑 R13_dm(R13 用的是同一个 T1D 文件)
修复前后
| 指标 | 修复前 | 修复后 |
|---|---|---|
T1D cor(eaf, 1000G EUR) | −0.9922 | +0.9922 |
| T1D 反转率 | 93.7% | 1.5% |
verify_harmonise.R | 27 PASS / 1 FAIL | 28 PASS / 0 FAIL |
| 各结局显著数 | 24/19/0/5/9/57/28 | 完全不变(符号翻转不改 |β|、se、p) |
分类变化(diabetes_contrast.csv,57 条)
| 分类 | 修复前 | 修复后 |
|---|---|---|
| 糖尿病驱动 | 30(53%) | 35(61%) |
| 并发症增强 | 11 | 11 |
| 并发症特异 | 10 | 10 |
| 方向背离 | 6 | 1 |
翻正的 5 条:TRIM40(黄斑、糖网)、SIGLEC5(黄斑、糖网)、WARS(糖网)→ 全部归入「糖尿病驱动」。 仅剩 GALNT3 × 糖网 一条方向背离(与修复前的预测一致)。
主句数字不变
37% / 63% 两个写进摘要的数字完全不变——5 条是在同一个「63% 桶」(糖尿病驱动+方向背离) 内部移动。变的是「53% → 61%」这个单类占比,以及散点图的「异号 13 → 8 条」。 三个 A 级候选 ERMAP / IFNAR1 / APOL1 分层不变。
顺带被断言抓到的一件事
R9 修完后重跑 36_control_definition_sensitivity.R,它的阴性对照(R9 与 R13 用同一份外部 T1D 文件,估计值应逐位一致)报错中止:最大差 2.14。 原因正是 R13 那边还没修——这是断言起作用的正面例子,而不是新 bug。 同步 R13 并重跑后该项恢复。
八、复现本页的实测
bash
cd /home/research/mr-pipeline-r9
Rscript tools/verify_harmonise.R # 谐化后逐条核查,当前 27 PASS / 1 FAIL
Rscript tools/verify_input_sanity.R full # 输入层三项,当前 0 项失败
Rscript tools/verify_eaf_all_outcomes.R # 全结局 × 1000G,当前 T1D 唯一不通过
Rscript tools/verify_t1d_eaf.R # T1D 专项