PV Signal Assurance — 药物警戒信号核验
企业药物警戒部门按次调用的确定性信号核验服务。每次调用产出一个可审计、可复现、带版本溯源的结论包。
本技能是决策辅助工具:不构成监管提交材料,不替代具备资质的药学/医学人员审评。
0. 全局硬规则(不可跳过)
- 标识必核:ENSG / rsID / OpenGWAS 数据集 ID / 药物标识——禁止凭记忆给出,必须外部核验。
- 查不到就报错:数据不可得 / 接口失败 / 限流 / 字段缺失 → 明确写
data_unavailable并说明原因。禁止用近似值或推测值顶替,禁止造假。 - 判空白须三路检索:概念词 + 药物名/靶点名/商品名 + 预印本源(
source:PPR)。 - 版本钉死 + 全程溯源:每次调用写
run_metadata,每个数字带source / query / retrieved_at。 - 免责声明必附:见
references/compliance.md。
路由(sub-command = 原子计费单元)
| sub-command | 脚本 | 计费档 | 说明 |
|---|---|---|---|
verify-target |
scripts/verify_target.py |
轻 / 高频 | 单靶点:ID 核验 + eQTL 可得性 + IV 强度 + IV 数分级 |
signal-prescreen |
scripts/signal_prescreen.py |
标准 | L1 + 三路文献 + FAERS 量 + go/no-go dossier |
mr-repair |
scripts/mr_repair.py |
Premium | 接破损 MR 层 → 修正重跑 → validated instruments |
literature-verify |
scripts/literature_verify.py |
按条 | 对"某药-某事件关联"主张做三路核验 |
运行环境:Python ≥ 3.9,仅标准库,无第三方依赖。所有脚本自写 UTF-8 输出。
python scripts/verify_target.py --gene CSNK1A1 --ensg ENSG00000113712 --out ./out
L1 · verify-target(单次调用闭合成结论)
Step 1 — 基因/靶点标识核验(必须先做)
python scripts/verify_target.py --symbol CSNK1A1 --ensg ENSG00000113712 --out ./out
三项同时成立才算通过:① display_name 与目标一致 ② seq_region_name 合理 ③ 落点与预期细胞遗传学条带一致。
脚本对 GRCh38(rest.ensembl.org)与 GRCh37(grch37.rest.ensembl.org)双版本查坐标 + 各自算条带,避免用 GRCh38 坐标去比对 GRCh37 的 eQTL 而误判(IKZF3 两版本差约 1.9 Mb)。
Step 2 — eQTL 可得性 + IV 强度
- OpenGWAS 需要 JWT(环境变量
OPENGWAS_JWT)。未配置时脚本抛Unavailable,不猜、不补;此时改用opengwasMCP 工具取数。 - 取 tophits(
pval=5e-8, clump=1, r2=0.001, kb=10000, pop=EUR),单 SNPF = beta**2 / se**2,全部须>10。 - 阳性对照:同跑已知可用基因(默认
TTR/eqtl-a-ENSG00000127863),区分"目标无数据"与"检索机制故障"。
Step 3 — 按 IV 数分级(不可越级)
| 独立 IV 数 | 可做的分析 |
|---|---|
| 1 | 仅 Wald ratio,无异质性检验 |
| 2 | IVW + Wald;MR-Egger / MR-PRESSO 不可用 |
| ≥3 | IVW + 加权中位 + MR-Egger + MR-PRESSO |
输出:verdict.json + dossier.md + audit_log.json。
L2 · signal-prescreen
python scripts/signal_prescreen.py --gene CSNK1A1 --ensg ENSG00000113712 \
--drug "lenalidomide" --brand "Revlimid" --out ./out
在 L1 基础上追加:
- 三路文献饱和(EuropePMC
hitCount):①概念词 ②药物名/靶点名/商品名 ③ 上述 +source:PPR。
判读:<10真空;10–30窗口期;>30需切细分切口。 - FAERS 量实测(openFDA):单药
≥500可做稳健四法;100–500探索性;<100不单独立题。 - 反直觉铁律:报告量大 ≠ 文献空白(报告量越大越可能已被做过)。
输出:go/no-go dossier(decision = go | no-go | conditional + 证据表 + 局限 + 下一步)。
L3 · mr-repair
python scripts/mr_repair.py --exposure instruments.csv --outcome outcome.csv \
--coloc coloc_results.json --out ./out
- 诊断红 flag:
n_iv>50/|ivw_beta|<0.01且 CI 极窄 /egger_intercept_p≈0/cochran_q_p≈0。 - 修正管线:cis-SNP 提取 → Z→β(
β = Z/√[2·EAF·(1−EAF)·(N+Z²)])→ 结局 harmonisation 先于聚类 → 距离聚类(主 ±500 kb / 敏 ±100 kb)→ 弱工具剔除(F≥10)→ 估计(1 IV: Wald;2+: IVW;≥3: +Egger/加权中位/LOO)→ coloc 对齐(MR top SNP 须匹配best_causal_snp)。 - 诚实边界:MR-PRESSO 需 R
MRPRESSO包,脚本只输出其全局检验输入并明确标注,不伪造 PRESSO 结果。 - 估计量(Wald / IVW-fixed / IVW-MRE / MR-Egger / 加权中位 / Cochran Q)为纯 Python 实现,含 t 与 χ² 分布尾部(Numerical Recipes 标准算法)。
输出:mr_results_FIXED.json/.csv、mr_instruments_FIXED.csv、coloc_mr_summary_FIXED.json、审计。
L4 · literature-verify
python scripts/literature_verify.py --claim "lenalidomide" --event "peripheral neuropathy" --out ./out
三路核验 → support | refute | insufficient + 证据链(含预印本占位)。
确定性内核(产品化外壳)
见 references/determinism.md。要点:版本钉死、缓存键 (target, dataset_version)、全字段溯源、fail-loud。
- 缓存目录:
$PVA_CACHE_DIR或技能根.pva_cache/。 - 复跑同键命中缓存 → 不计重复调用(计费折扣依据)。
输出契约
见 references/output_contract.md 与 schemas/。三件套:verdict.json(机器可读)+ dossier.md(人读)+ audit_log.json(审计)。
阈值与依据
见 references/thresholds.md(每条阈值附来源与适用边界)。
合规与免责
见 references/compliance.md。每次输出强制附免责声明。
常见踩坑
- ❌ 凭记忆写 ENSG → ✅ 双版本 Ensembl 核验 + 条带比对
- ❌ 只搜概念词判空白 → ✅ 概念词 + 药物名 + PPR
- ❌ 见报告量大推空白 → ✅ 先检索再判断
- ❌ 2 IV 写 Egger/PRESSO → ✅ 按 IV 数选方法
- ❌ 查不到换相近 ID 顶 → ✅ 报
data_unavailable - ❌ MR 自动声称因果 → ✅ 标注遗传学相关性