Skip to content

判定标准与 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 GCST90824163effect_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.42TwoSampleMR harmonise vignette
effect_allele_frequency 必须是效应等位的频率GWAS-SSF v1.1.0 Table 1(Mandatory)
Wald 比值 SEse_out/abs(b_exp)TwoSampleMR::mr_wald_ratio 源码
工具强度F ≥ 10Staiger & Stock 1997;Burgess 2011
cis 窗口±500 kbSchmidt 2020 Nat Commun 11:3255
窗口内 clumpingr² < 0.1Schmidt 2020
共定位PP.H4 ≥ 0.7 提示 / ≥ 0.8 发表 / ≥ 0.95 工业级Mountjoy 2021;Wallace 2020 PLoS Genet 16:e1008720
跨平台方向一致是硬要求Eldjarn 2023 Nature 622:348
MR-PRESSONbDistribution ≥ 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 × 黄斑病变逐条实测:

#要求实测判定
1P < 0.05 / N_proteinsN=1587 → 门槛 3.15e-5;我们 p = 3.42e-5差 8.6% 未过(FDR = 0.0049 过)
2共定位 PP.H4 ≥ 0.80.940,两法都支持✅ 发表级(未达 0.95 工业级)
3跨平台复制,两边都显著见下方★订正⚠️ 方向达标,显著性不达标
4跨队列复制(理想非必需)deCODE(冰岛)+ ARIC✅ 部分
5PAV 排除敏感性三候选工具全是非编码(IFNAR1 rs914142 内含子、ERMAP rs11210710 上游、APOL1 rs136168 内含子)→ 无 PAV 可排
6邻近基因不共定位(PP.H4 < 0.5)2026-08-05 已做,见下节通过
7Open Targets L2G ≥ 0.52026-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 rs980875361.5 kb0.0003β=+0.029, p=0.184
IL10RB rs251571763.5 kb0.0048β=−0.005, p=0.919
CRYZL1 rs13050238271.2 kb0.0013β=+0.000, p=0.999
GART145.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(credibleSetsl2GPredictions)查含各候选 cis-pQTL 的 GWAS 可信集:

候选含该变异的 GWAS credible setL2G
IFNAR1 rs9141420 个不可评估
ERMAP rs112107100 个不可评估
APOL1 rs1361683 个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 edemaGCST90480055 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):

SNPmr_bORp
rs2834027−0.2400.7860.25
rs17860260−0.2180.8040.43
rs58886971+0.0051.0050.93
rs62226453−0.1060.9000.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/β_exp5.8e-15OR − exp(b)1.3e-13、EA 错位 0
邻近基因共定位未做
Open Targets L2G未做

七、现存问题清单(按优先级)

#问题级别影响状态
1T1D 源 eaf 整列反转(93.7%)D0T1D 支线 220 个回文工具方向反2026-08-05 已修,见下节
2哨兵位点硬断言未写成代码D2同类 bug 无法自动拦截已写进 verify_input_sanity.R D 项,7 条断言全过
3邻近基因共定位未做三角验证第 6 条已做,IFNAR1 邻居 r²≤0.005 且自身不显著
4Open Targets L2G 未取三角验证第 7 条已查,IFNAR1/ERMAP 不可评估、APOL1 0.914
5mafeaf 别名表 / pvalmlogp 靠顺序D2当前未触发,换数据源可能踩未修
6六个下游脚本的 flip 只按字母配对(等价 action=1)D2边界已量化:三候选工具全非回文;deCODE 14 个工具仅 1 个回文且属已出局的 APOL1未修
7AMD 仓库代码落后(05_harmonise.R + eaf 修复)D3实测 Steiger 零影响;eaf 部分必须同步(R13 也用同一个 T1D 文件)已同步并重跑 R13_dm
8多组学项目 eQTL/sQTL 输入未审计影响「ERMAP 视网膜方向与血浆相反」这一条未查
9Mahajan noUKBB 例数(55,005/400,308)出处待确认readme 只给全量 meta 的 74,124/824,006待查
10Bonferroni 未过(3.42e-5 vs 3.15e-5)决定文章定位为 exploratory已知,写作时处理
11邻近基因检验未纳入 eQTL第 6 条用 LD+邻居 MR 替代了 coloc vs eQTL;GART 哨兵无 rsID 未评估待补

八、T1D eaf 修复的实测结果(2026-08-05)

做了什么

  1. outcome_manifest.csv 增列 eaf_orientationeffect/other),仅 GCST90824163 一行标 other
  2. R/adapters/read_tsv.R 按该字段取补——不硬编码翻转,让每个数据源自带口径
  3. 新增 R/adapters/assert_eaf.R每个结局读入后抽非回文位点对 1000G EUR 比频率,反转率 >50% 直接 stop()
  4. 断点缓存指纹 v1 → v2 并纳入 eaf_orientation(否则改了 manifest 缓存仍命中,修复静默失效)
  5. 同一套修改同步到 AMD 仓库 mr-pipeline 并重跑 R13_dm(R13 用的是同一个 T1D 文件)

修复前后

指标修复前修复后
T1D cor(eaf, 1000G EUR)−0.9922+0.9922
T1D 反转率93.7%1.5%
verify_harmonise.R27 PASS / 1 FAIL28 PASS / 0 FAIL
各结局显著数24/19/0/5/9/57/28完全不变(符号翻转不改 |β|、se、p)

分类变化(diabetes_contrast.csv,57 条)

分类修复前修复后
糖尿病驱动30(53%)35(61%)
并发症增强1111
并发症特异1010
方向背离61

翻正的 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 专项

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