MCM520 ← 资料站首页 NIPT 的时点选择与胎儿的异常判定(2025 国赛 C)优秀范文(一) 打开交互阅读器 →

NIPT 的时点选择与胎儿的异常判定(2025 国赛 C)优秀范文(一)

摘要

本题要求为无创产前检测(NIPT)建立"检测时点选择"与"胎儿异常判定"两套模型。NIPT 通过母体血浆中游离胎儿 DNA(cffDNA)筛查染色体非整倍体(以 T21 为代表),本质是筛查而非诊断的两阶段问题:第一阶段在某一孕周用测序给出"高风险/低风险"判读,第二阶段对高风险者做有创确诊(羊穿 / CVS)。本文把两阶段统一在贝叶斯判定 + 决策理论框架下:①用胎儿浓度 f(g)f(g) 随孕周 gg 饱和上升、检测失败率 pfail(g)p_{\text{fail}}(g) 随孕周下降、有效灵敏度 Se(g)\mathrm{Se}(g) 随孕周上升的闭式模型刻画"时点—表现"规律;②以产妇年龄别患病率 P(D)P(D) 为先验,结合 Se,Sp\mathrm{Se},\mathrm{Sp} 给出阳性/阴性后验 PPV=P(D∣T+)\mathrm{PPV}=P(D\mid T^+)、NPV=P(Dˉ∣T−)\mathrm{NPV}=P(\bar D\mid T^-),揭示"高灵敏度 ≠ 高阳性预测值"这一核心陷阱;③在假阴(灾难性)与假阳(不必要羊穿,含约 0.3%0.3\% 流产风险)代价不等的前提下,以每筛查一人预期代价最小确定风险报告 cutoff z∗z^*,并与 Youden 切点对比;④进一步对孕周做"可靠性 vs 可操作性"权衡,给出最优检测时点 g∗g^*。全部模型为确定性闭式、纯标准库实现,正文/配图/附录/真源四路数字一致。主要结论:在最佳孕周 g=20g=20 周、产妇年龄 35 岁时 PPV=40.1%\mathrm{PPV}=40.1\%(即阳性者仅四成真正患病),年龄 25 岁降至 17.5%17.5\%,说明低患病率下必须报后验而非只看 cutoff;代价最优 cutoff z∗=2.96z^*=2.96 比 Youden 切点(zJ=2.38z_J=2.38)更保守,预期代价由 0.4580.458 降至 0.1890.189;最优检测时点约 g∗=13g^*=13 周,过早在失败率、过晚在可操作性上双双受损。

一、问题重述

给定 NIPT 的筛查场景:在孕周 g∈[9,22]g\in[9,22] 周采血测序,得到各染色体 z 值/reads 计数,据此判读胎儿是否患染色体非整倍体(记为事件 DD)。题目要求回答三件事:一是时点对检测表现的影响——胎儿浓度(fetal fraction)f(g)f(g) 随孕周上升,过早则浓度低、检测失败率与误判率升高,过晚则压缩确诊(羊穿)的临床可操作窗口;二是给定时点下,用贝叶斯把检测的灵敏度 Se\mathrm{Se}、特异度 Sp\mathrm{Sp} 与人群先验(如产妇年龄)结合,给出阳性/阴性的后验患病概率,完成"胎儿异常判定";三是在筛查(非诊断)与有创确诊风险约束下,做阈值与时点的最优决策,平衡假阴(灾难性)与假阳(不必要有创确诊)的代价。赛题通常给不同孕周的样本量、cffDNA 浓度分布、测序计数、产妇年龄与金标准(核型)真值;本文以文献典型值建模合成练习数据,给出可复现的判定与决策流程。

二、模型假设

  1. 单指标主导:以 T21(21 三体)为判定目标,用单一综合风险评分 zz 表征测序证据,评分在 DD 与 Dˉ\bar D 下均近似正态分布,区分度随孕周变化。
  2. 胎儿浓度单调:胎儿浓度 f(g)f(g) 随孕周饱和上升,反映 cffDNA 占比随胎盘发育增大。
  3. 失败率单调:当浓度低于测序所需阈值时检测"无 CALL"(no-call),失败率 pfail(g)p_{\text{fail}}(g) 随孕周指数下降。
  4. 性能随浓度提升:有效灵敏度 Se(g)\mathrm{Se}(g) 随胎儿浓度上升(低浓度下弱阳性信号易被噪声淹没),特异度近天花板、随时点变化很小。
  5. 贝叶斯先验可估:年龄别患病率 P(D)P(D) 可用公开流行病学曲线估计,作为阳性后验的先验;测序噪声为加性高斯。
  6. 两阶段代价可量化:假阴代价 CFNC_{\mathrm{FN}}(漏诊导致患儿出生)远高于假阳代价 CFPC_{\mathrm{FP}}(假阳导致不必要羊穿,其预期损失含约 0.3%0.3\% 流产风险折算);羊穿可操作性随孕周增大而下降。

三、符号说明

符号 含义 取值/单位
gg 孕周 9–22 周
f(g)f(g) 胎儿浓度(cffDNA 占比) 随 gg 上升,最高约 12.7%
pfail(g)p_{\text{fail}}(g) 检测失败(no-call)率 随 gg 下降
Se(g),Sp(g)\mathrm{Se}(g),\mathrm{Sp}(g) 有效灵敏度 / 特异度 0.82–0.99
P(D)P(D) 胎儿患病先验(年龄别) 0.10%–1.00%
PPV,NPV\mathrm{PPV},\mathrm{NPV} 阳性 / 阴性预测值(后验) (0,1)(0,1)
zz 风险评分标准化报告阈值 cutoff
CFN,CFPC_{\mathrm{FN}},C_{\mathrm{FP}} 假阴 / 假阳代价 1000 / 50
g∗g^* 最优检测孕周 周

四、模型建立

4.1 时点—表现模型

胎儿浓度取饱和上升形式

f(g)=0.13(1−e−(g−9)/3),f(g)=0.13\bigl(1-e^{-(g-9)/3}\bigr),

孕 10 周约 3.7%3.7\%、孕 20 周约 12.7%12.7\%。失败率随孕周指数下降

pfail(g)=0.03+0.55 e−(g−9)/1.2,p_{\text{fail}}(g)=0.03+0.55\,e^{-(g-9)/1.2},

孕 9 周高达 58.0%58.0\%(近六成样本无 CALL),孕 12 周降到 7.5%7.5\%,孕 20 周仅 3.0%3.0\%。风险评分区分度(决定 AUC)随浓度上升:

Δ(g)=3.5+1.3(1−e−(g−9)/3),\Delta(g)=3.5+1.3\bigl(1-e^{-(g-9)/3}\bigr),

在实验室固定报告 cutoff zwork=2.6z_{\text{work}}=2.6(约 0.47%0.47\% 假阳性率)下,有效灵敏度为 Se(g)=Φ(Δ(g)−zwork)\mathrm{Se}(g)=\Phi(\Delta(g)-z_{\text{work}})、特异度 Sp(g)=Φ(zwork)≈99.5%\mathrm{Sp}(g)=\Phi(z_{\text{work}})\approx99.5\%。由此得 Se(9)=81.6%\mathrm{Se}(9)=81.6\%、Se(12)=95.7%\mathrm{Se}(12)=95.7\%、Se(20)=98.5%\mathrm{Se}(20)=98.5\%,最佳孕周处 Δ(20)=4.767\Delta(20)=4.767、AUC≈0.9996\mathrm{AUC}\approx0.9996。

4.2 贝叶斯判定(核心)

筛查的价值不在"判阴阳",而在"报概率"。给定阳性,后验阳性预测值为

PPV=P(D∣T+)=Se⋅P(D)Se⋅P(D)+(1−Sp)(1−P(D)),\mathrm{PPV}=P(D\mid T^+)=\frac{\mathrm{Se}\cdot P(D)}{\mathrm{Se}\cdot P(D)+(1-\mathrm{Sp})(1-P(D))},

给定阴性,后验阴性预测值(惯例 NPV)为

NPV=P(Dˉ∣T−)=Sp⋅(1−P(D))(1−Se)P(D)+Sp(1−P(D)).\mathrm{NPV}=P(\bar D\mid T^-)=\frac{\mathrm{Sp}\cdot(1-P(D))}{(1-\mathrm{Se})P(D)+\mathrm{Sp}(1-P(D))}.

关键结论:高 Se\mathrm{Se} 不等于高 PPV\mathrm{PPV}。即便 Se=98.5%,Sp=99.5%\mathrm{Se}=98.5\%,\mathrm{Sp}=99.5\%,在低患病率人群中阳性者大多仍是假阳。本文取年龄别先验 P(D∣age)=0.001 e0.115(age−25)P(D\mid\text{age})=0.001\,e^{0.115(\text{age}-25)}:年龄 25/35/40/45 岁对应患病率 0.10%/0.32%/0.56%/1.00%0.10\%/0.32\%/0.56\%/1.00\%。在 g=20g=20 周,三者的 PPV\mathrm{PPV} 分别为 17.5%17.5\%、40.1%40.1\%、54.4%54.4\%——即 35 岁阳性孕妇真正患病者仅四成;而 NPV=99.995%\mathrm{NPV}=99.995\%,阴性结果极可靠。这正说明"阳性=高风险"而非"确诊",必须用贝叶斯结合年龄先验。

4.3 ROC 与 Youden 切点

风险评分在 D/DˉD/\bar D 下服从方差齐的正态,ROC 曲线由区分度 Δ\Delta 决定:

TPR=Φ(Δ−z),FPR=Φ(−z),\mathrm{TPR}=\Phi(\Delta-z),\quad \mathrm{FPR}=\Phi(-z),

其中 zz 为标准化报告阈值。Youden's J=Se+Sp−1J=\mathrm{Se}+\mathrm{Sp}-1 在 zJ=Δ/2z_J=\Delta/2 处最大;对 g=20g=20(Δ=4.767\Delta=4.767)得 zJ=2.38z_J=2.38、J=0.9828J=0.9828、Se=Sp=99.15%\mathrm{Se}=\mathrm{Sp}=99.15\%。Youden 切点等权对待灵敏度与特异度,但二者临床代价并不相等。

4.4 预期代价阈值优化

把"是否判阳并转诊羊穿"视为决策:假阴使真患儿漏诊(代价 CFN=1000C_{\mathrm{FN}}=1000),假阳使健康孕妇承受不必要羊穿(代价 CFP=50C_{\mathrm{FP}}=50,已含约 0.3%0.3\% 流产风险折算)。每筛查一人的预期代价随报告 cutoff zz 变化:

C(z)=CFN(1−Se) P(D)+CFP⋅FPR⋅(1−P(D)).C(z)=C_{\mathrm{FN}}(1-\mathrm{Se})\,P(D)+C_{\mathrm{FP}}\cdot\mathrm{FPR}\cdot(1-P(D)).

对年龄 35 岁(P(D)=0.32%P(D)=0.32\%)最小化得代价最优 cutoff z∗=2.96z^*=2.96,对应 Se∗=96.5%,Sp∗=99.85%\mathrm{Se}^*=96.5\%,\mathrm{Sp}^*=99.85\%,预期代价 C=0.189C=0.189;而 Youden 切点处 C=0.458C=0.458。代价最优比 Youden 更保守(更高阈值、更低假阳性率),因为假阳也携真实流产风险,不应被等权处理。

4.5 最优检测时点(可靠性 vs 可操作性)

检测时点的总期望负担由三部分构成:失败重采代价、决策代价、可操作性惩罚(孕周越大确诊窗口越窄):

E(g)=pfail(g) Cno-call+(1−pfail(g)) Cdec(z∗)+kop(g−9).E(g)=p_{\text{fail}}(g)\,C_{\text{no-call}}+(1-p_{\text{fail}}(g))\,C_{\text{dec}}(z^*)+k_{\text{op}}(g-9).

对代表人群(年龄 35)最小化得最优检测时点 g∗≈13g^*\approx13 周、期望负担 E=3.27E=3.27。过早(如 9 周)失败率 58%58\% 主导,过晚(如 20 周)可操作性惩罚累积,二者权衡下最优落在中段。

五、模型求解与结果分析

5.1 胎儿浓度与时点—表现

图 1 显示胎儿浓度在 9–22 周由约 3%3\% 升至 12.7%12.7\%,是检测可靠性提升的物理基础。图 2 三条曲线揭示同一时点的双重效应:失败率从 58%58\% 降到 3%3\%,有效灵敏度从 81.6%81.6\% 升到 98.5%98.5\%,特异度始终近天花板(99.5%99.5\%)——说明时点改善主要来自"灵敏度提升 + 失败减少",而非特异度。

图1 胎儿浓度 f(g) 随孕周饱和上升(浓度越高检测越可靠)

图2 检测失败率下降、有效灵敏度上升、特异度近天花板(随孕周)

5.2 贝叶斯判定与 PPV 热图

图 3 给出 PPV=P(D∣T+)\mathrm{PPV}=P(D\mid T^+) 在"孕周 × 年龄"上的热图:颜色越红(PPV 越高)集中在高孕周、高龄区。可见即便最佳时点,年轻人群 PPV 仍低(年龄 25 仅 17.5%17.5\%),老年人群显著升高(年龄 40 达 54.4%54.4\%)。这正是"不能对所有人群报统一风险"的定量依据。

图3 阳性预测值 PPV = P(D|T+) 热图(行=孕周,列=产妇年龄)

5.3 ROC 与 Youden 切点

图 4 给出 Δ=4.767\Delta=4.767(AUC≈0.9996\mathrm{AUC}\approx0.9996)的 ROC 曲线与随机线,标注 Youden 最优切点 zJ=2.38z_J=2.38(Se=Sp=99.15%\mathrm{Se}=\mathrm{Sp}=99.15\%)。曲线贴近左上角说明该时点检测分辨力极强,但"分辨力强"仍不等于"阳性就大概率患病"——后验还取决于患病率(见 5.2)。

图4 ROC 曲线(区分度=4.77,AUC≈0.9996)与 Youden 最优切点

5.4 代价最优 cutoff

图 5 为年龄 35 岁时预期代价 C(z)C(z) 曲线:在 z∗=2.96z^*=2.96 处取到最小 C=0.189C=0.189,明显低于 Youden 切点处的 0.4580.458。该图直观说明最优阈值由代价结构决定——当假阳也含真实流产风险时,应把 cutoff 上移以减少不必要的有创确诊。

图5 预期代价 C(z) 随报告 cutoff 变化(年龄35,P(D)=0.0032)

5.5 最优检测孕周

图 6 为期望总负担 E(g)E(g) 随孕周变化:在 g∗≈13g^*\approx13 周处取到最小 E=3.27E=3.27,左侧由高失败率抬升、右侧由可操作性惩罚抬升,呈典型"碗形"。这给出本题第一问的定量答案——最优检测时点不在最早也不在最晚,而在中段。

图6 期望总负担 E(g) 随孕周变化(可靠性 vs 可操作性权衡)

5.6 先验敏感性

图 7 对比"真实年龄别先验"与"朴素统一先验(0.30%0.30\%)"下的 PPV:若对所有孕妇套用统一先验,对高龄(40/45 岁)孕妇会低估其真实阳性预测值,导致风险沟通偏差。说明贝叶斯判定对先验(年龄)敏感,临床应按年龄分层报后验。

图7 先验敏感性:年龄别先验 vs 朴素统一先验下的 PPV(g=20)

5.7 蒙特卡洛鲁棒性

图 8 对 Se,Sp\mathrm{Se},\mathrm{Sp} 施加高斯扰动(固定种子,2000 次)重算 PPV:分布集中、均值稳定,说明本文 PPV 结论对检测性能的小幅波动稳健,不是脆弱的边界效应。

图8 蒙特卡洛:性能扰动下 PPV 的分布(g=20,年龄35,n=2000)

六、灵敏度分析

  • 代价比 CFN/CFPC_{\mathrm{FN}}/C_{\mathrm{FP}}:比值越大,z∗z^* 越偏保守(更少假阳),最优时点基本不变;比值趋近 1 时 z∗z^* 趋近 Youden 切点。
  • 患病率误设:用统一先验会系统性低估高龄 PPV(图 7),强调年龄分层的必要性。
  • 失败率曲线:若测序技术改进使 pfailp_{\text{fail}} 整体下移,E(g)E(g) 碗形左移,最优时点可提前。
  • 可操作性系数 kopk_{\mathrm{op}}:增大则 g∗g^* 前移,提示确诊通道紧张时应尽早筛查。

七、模型评价

优点:①把"筛查非诊断"的两阶段结构显式建模,避免把灵敏度误当确诊率;②用贝叶斯把年龄先验与似然结合,给出可沟通的后验概率;③以决策理论统一阈值与时点优化,结论可操作;④全程确定性闭式、纯标准库,可复现、易教学。

缺点与改进:①Se,Sp\mathrm{Se},\mathrm{Sp} 用光滑闭式近似真实测试的离散报告,未用原始 reads 计数做似然;②仅以 T21 单指标为代表,未纳入 T18/T13 与多染色体联合判定;③可操作性惩罚为线性近似,未结合具体临床路径时延。改进方向:用测序计数做似然层、对多指标训练分类器(见范文二)、把时点优化放入随机规划(见范文三)。

八、结论

本文在贝叶斯判定 + 决策理论框架下统一回答了 NIPT 的时点选择与异常判定:①胎儿浓度随孕周上升使失败率由 58%58\% 降到 3%3\%、灵敏度由 81.6%81.6\% 升到 98.5%98.5\%;②低患病率下阳性预测值远低于灵敏度,年龄 35 岁阳性者仅 40.1%40.1\% 真正患病,必须用贝叶斯报后验;③代价最优报告 cutoff z∗=2.96z^*=2.96 比 Youden 切点更保守,预期代价降 59%59\%;④最优检测时点约 g∗=13g^*=13 周,由"可靠性 vs 可操作性"权衡决定。全文模型确定性、可复现,正文/配图/附录/真源四路一致。

参考文献

  1. Norton M E, et al. Cell-free DNA analysis for noninvasive examination of trisomy. NEJM, 2015.
  2. Gil M M, et al. Analysis of cell-free DNA in maternal blood in screening for aneuploidies. Ultrasound Obstet Gynecol, 2015.
  3. Bianchi D W, et al. DNA sequencing versus standard prenatal aneuploidy screening. NEJM, 2014.
  4. Youden W J. Index for rating diagnostic tests. Cancer, 1950.
  5. 2025 高教社杯全国大学生数学建模竞赛 C 题(NIPT 的时点选择与胎儿的异常判定).

附录:核心 Python 实现

import os, sys, math, random
# 定位并导入真源模块(与配图同源,四路一致)
try:
    _HERE = os.path.dirname(os.path.abspath(__file__))
except NameError:
    _HERE = os.getcwd()
sys.path.insert(0, os.path.abspath(os.path.join(_HERE, "..", "..", "..", "tools")))
import gen_cumcm2025c as G

# ---- 复算关键数字 ----
print("胎儿浓度 f(10)=%.3f f(20)=%.3f" % (G.fetal_fraction(10.0), G.fetal_fraction(20.0)))
print("失败率 p_fail(9)=%.3f p_fail(12)=%.3f p_fail(20)=%.3f"
      % (G.p_fail(9.0), G.p_fail(12.0), G.p_fail(20.0)))
DR = G.delta(20.0)
print("区分度 DELTA(20)=%.3f AUC=%.4f" % (DR, G.phi(DR / math.sqrt(2.0))))
print("灵敏度 Se(9)=%.4f Se(12)=%.4f Se(20)=%.4f"
      % (G.se(9.0), G.se(12.0), G.se(20.0)))
print("特异度 Sp(20)=%.4f" % G.sp(20.0))
print("患病率 P(D|35)=%.5f P(D|40)=%.5f" % (G.p_d(35.0), G.p_d(40.0)))
print("PPV(g=20): 年龄35=%.4f 年龄40=%.4f" % (G.ppv(20.0, 35.0), G.ppv(20.0, 40.0)))
print("NPV(g=20,年龄35)=%.5f" % G.npv(20.0, 35.0))

# ROC / Youden / 代价最优 cutoff / 最优时点
zJ, J = G.youden_opt(DR)
print("Youden zJ=%.2f J=%.4f Se=Sp=%.4f" % (zJ, J, G.phi(DR - zJ)))
pd35 = G.p_d(35.0)
z_star, c_star = G.optimal_cutoff(pd35, DR)
print("代价最优 cutoff z*=%.2f C=%.4f Se*=%.4f Sp*=%.4f"
      % (z_star, c_star, G.phi(DR - z_star), G.phi(z_star)))
g_star, e_star = G.optimal_week(pd35, DR)
print("最优孕周 g*=%.1f 期望负担 E=%.4f" % (g_star, e_star))

# 蒙特卡洛鲁棒性(与配图同源)
rng = random.Random(G.SEED)
se0, sp0, vals = G.se(20.0), G.sp(20.0), []
for _ in range(2000):
    s = min(0.999, max(0.5, se0 + rng.gauss(0, 0.012)))
    p = min(0.999, max(0.9, sp0 + rng.gauss(0, 0.004)))
    vals.append(s * pd35 / (s * pd35 + (1 - p) * (1 - pd35)))
print("MC PPV 均值=%.4f 标准差=%.4f" % (sum(vals) / len(vals),
      math.sqrt(sum((v - sum(vals) / len(vals)) ** 2 for v in vals) / len(vals))))