本项目为 2025 年全国大学生数学建模竞赛 C 题(NIPT 时点选择与胎儿异常判定)的完整解决方案,包含数据预处理、四个问题的建模与求解代码,以及全部可复现的实验结果。
无创产前检测(Non-Invasive Prenatal Testing, NIPT)通过检测孕妇外周血中游离胎儿 DNA 来评估胎儿染色体异常风险。本项目围绕以下四个问题展开:
| 问题 | 主题 | 核心方法 |
|---|---|---|
| 问题一 | 男胎 Y 染色体浓度(Y_Conc)随孕周的增长规律 | 线性混合效应模型(LMM)+ Logit 变换 |
| 问题二 | 基于 BMI 分组的最佳 NIPT 检测时点决策 | 高斯过程回归(GPR)+ AFT 生存分析 + 遗传算法(GA) |
| 问题三 | 多因素协同下的时点优化与自适应达标比例 | 多元 AFT + Elastic-Net 特征筛选 + 遗传算法 |
| 问题四 | 女胎染色体(13/18/21 号)异常判定 | 多通道分类器 + 批次去偏校准 + SMOTE + 一致性投票 |
2025C/
├── data.xlsx # 原始数据(男胎检测数据 / 女胎检测数据 两个 Sheet)
├── nipt-coding-guide-v2.md # 建模规范文档(Spec)
├── nipt_processed_data.csv # 预处理后的统一数据集(37 列,1687 条样本)
├── step1_data_preprocessing.py # 步骤一:数据预处理
├── step2_problem1_yconc_lmm.py # 步骤二:问题一(Y 染色体浓度增长规律模型)
├── step3_problem2_bmi_decision.py # 步骤三:问题二(基于 BMI 分组的最佳时点决策)
├── step4_problem3_multivariate_decision.py # 步骤四:问题三(多因素协同时点优化)
├── step5_problem4_female_aneuploidy.py # 步骤五:问题四(女胎异常判定)
├── problem1_outputs/ # 问题一输出(模型摘要、系数表、ICC、轨迹图)
├── problem2_outputs/ # 问题二输出(最优策略、AFT 参数、灵敏度分析)
├── problem3_outputs/ # 问题三输出(4×9 策略矩阵、P 灵敏度分析)
├── problem4_outputs/ # 问题四输出(患者级预测、混淆矩阵、信号诊断)
└── .vscode/ # VSCode 配置
data.xlsx:竞赛原始数据,包含 男胎检测数据 与 女胎检测数据 两个工作表;nipt_processed_data.csv:由step1_data_preprocessing.py生成的标准化数据,列名统一为英文(如Patient_ID、Gestational_Week、BMI、GC_Total、Y_Conc、Z_13/Z_18/Z_21、Aneuploidy_Status、Healthy_Outcome等),并新增GA(孕周浮点数值)与Quality_Pass(GC 质控标记)两列。
- Python 3.9+(已在 Python 3.9 环境下运行验证)
- 主要依赖库:
numpy
pandas
scipy
statsmodels
scikit-learn
matplotlib
lightgbm
imblearn
安装依赖:
pip install numpy pandas scipy statsmodels scikit-learn matplotlib lightgbm imblearn按顺序运行以下脚本即可完整复现全部结果:
# 1. 数据预处理(生成 nipt_processed_data.csv)
python step1_data_preprocessing.py
# 2. 问题一:Y 染色体浓度增长规律模型
python step2_problem1_yconc_lmm.py --plot
# 3. 问题二:基于 BMI 分组的最佳 NIPT 时点决策
python step3_problem2_bmi_decision.py
# 4. 问题三:多因素协同时点优化(含 P 四档灵敏度分析)
python step4_problem3_multivariate_decision.py --p-sweep
# 5. 问题四:女胎染色体异常判定
python step5_problem4_female_aneuploidy.py各脚本均支持 --csv 指定输入数据、--output-dir 指定输出目录等参数,可通过 python <脚本名> -h 查看全部选项。
建模思路:同一孕妇存在多次纵向测量,因此以孕妇个体(Patient_ID)作为随机效应建立线性混合效应模型(LMM);为防止预测浓度越界,对 Y 染色体浓度作 Logit 变换后建模,固定效应包含孕周(GA)与 BMI 的一次、二次项(均值中心化)。
关键结果(REML 估计,631 条有效记录 / 251 位孕妇):
| 固定效应 | 系数 | 标准误 | z | P>|z| | | :--- | ---: | ---: | ---: | ---: | | Intercept | -2.603 | 0.034 | -76.82 | <0.001 | | GA_c | 0.036 | 0.004 | 9.08 | <0.001 | | GA_c² | 0.003 | 0.001 | 3.79 | <0.001 | | BMI_c | -0.023 | 0.011 | -2.10 | 0.036 | | BMI_c² | -0.001 | 0.002 | -0.68 | 0.499 |
- 组内相关系数 ICC = 0.7297,说明孕妇个体间差异解释了大部分变异,纵向混合模型是必要的;
- 孕周对 Y 浓度有显著正效应(且二次项显著,增长略呈加速趋势);
- BMI 对 Y 浓度有显著负效应(血液稀释效应),BMI² 项不显著。
建模思路:三段式流程 ——
- GPR 轨迹插值:用高斯过程回归(
ConstantKernel × RBF + WhiteKernel)对每位孕妇的 BMI 时序轨迹在孕周 [10, 25] 区间内平滑插值; - AFT 生存分析:以“Y 浓度首次达到 4%”为事件、未达标为右删失,拟合 LogNormal 加速失效时间模型
ln(T) = β0 + β1·BMI + σ·W,得到任意时点的累积达标概率 F(t); - 遗传算法优化:求解 4 条 BMI 分界线
[b₁, b₂, b₃, b₄]与 5 个组别推荐时点[t₁, …, t₅],最小化未达标风险与检测延误惩罚的加权和(0.7 : 0.3),并满足各组保障率 ≥ 95%、分界线有序、时点单调等约束。
关键结果(基准场景 kappa = 1.0):
AFT: ln(T) = 2.1125 + 0.0177 × BMI, sigma = 0.2169
最优分界线 b = [28.19, 31.12, 32.04, 34.45]
推荐时点 t = [20.53, 20.75, 21.42, 21.95, 25.00]
最小保障率 0.9524,平均保障率 0.9738,综合加权风险 3615.36
同时提供了检测噪声场景 kappa ∈ {0.75, 1.00, 1.25, 1.50} 的灵敏度分析:噪声越大推荐时点越靠后,kappa ≥ 1.25 时 95% 保障率约束在 [10, 25] 孕周窗口内不可行(高 BMI 孕妇无法在 25 周前达标)。
建模思路:将协变量扩展为 BMI、Age、Height、Initial_Weight,先用 Elastic-Net 惩罚回归筛选显著特征,再拟合多元 LogNormal AFT 模型,最后用遗传算法针对不同保障率门限 P 求解最优策略。
关键结果:Elastic-Net 保留了 BMI 与 Initial_Weight,剔除 Age、Height;默认 P = 0.95 时最优策略为:
最优分界线 b = [31.05, 31.73, 33.86, 35.55]
推荐时点 t = [20.52, 20.99, 21.69, 22.20, 25.00]
保障率门限 P 灵敏度分析(4×9 决策策略矩阵):
| P | b₁ | b₂ | b₃ | b₄ | t₁ | t₂ | t₃ | t₄ | t₅ |
|---|---|---|---|---|---|---|---|---|---|
| 0.50 | 31.14 | 33.90 | 35.76 | 38.92 | 14.46 | 15.29 | 15.80 | 16.86 | 18.77 |
| 0.75 | 31.15 | 33.78 | 35.33 | 38.69 | 16.73 | 17.65 | 18.01 | 19.11 | 21.72 |
| 0.90 | 31.61 | 34.06 | 35.99 | 39.07 | 19.08 | 20.12 | 20.85 | 22.21 | 25.00 |
| 0.99 | 28.19 | 28.37 | 28.83 | 29.01 | 22.69 | 23.00 | 23.22 | 23.45 | 25.00 |
结论:达标保障率要求越高,推荐检测时点越晚;P = 0.99 时在孕周 [10, 25] 窗口内无法满足全部组约束,输出为最优尽力解。
建模思路:
- 批次去偏校准:用健康男胎对照样本对各染色体 Z 值关于 GC、BMI、Total_Reads 线性回归,得到校准残差 Z;
- 多通道专家模型:为 13/18/21 号染色体分别建立独立二分类通道(特征 = 校准 Z + 染色体 GC + BMI + Age + Total_Reads + Mapped_Ratio),用 SMOTE 缓解样本失衡,梯度提升分类器(优先 LightGBM,未安装时回退 HistGradientBoosting);
- 刚性安全守门人:|Z_calibrated| ≥ 3.0 时一票否决强制判阳性;
- 患者级一致性投票:同一孕妇多次检测至少 2 次异常方确诊(检测次数 < 2 时 1 次异常即报警)。
评估方式:患者级分层 5 折交叉验证(避免同一孕妇样本泄漏),结果如下:
| 通道 | 患者数 | Precision | Recall | F1 |
|---|---|---|---|---|
| T13 | 147 | 0.121 | 0.222 | 0.157 |
| T18 | 147 | 0.194 | 0.233 | 0.212 |
| T21 | 147 | 0.071 | 0.167 | 0.100 |
| 任意异常 | 147 | 0.385 | 0.568 | 0.459 |
诚实说明:信号诊断显示本数据集中异常样本与正常样本在校准 Z 上几乎不可分,|Z| ≥ 3 硬红线对真实阳性几乎不触发,指南要求的 100% 召回在现有特征下不可达;输出为忠实评估值,不进行虚假报告。
| 文件 | 说明 |
|---|---|
| problem1_model_summary.txt | LMM 模型摘要(REML,含固定效应与随机效应方差) |
| problem1_fixed_effects.csv | 固定效应系数表(含 Wald 检验 p 值) |
| problem1_random_effects.csv | 随机效应方差协方差 |
| problem1_icc.csv | ICC 等汇总指标 |
| problem1_yconc_trajectory.png | Y 染色体浓度随孕周增长轨迹图 |
| 文件 | 说明 |
|---|---|
| problem2_strategy.csv | 基准场景最优策略(4 条分界线 + 5 个推荐时点) |
| problem2_strategy_kappa*.csv | 各 kappa 场景最优策略 |
| problem2_aft_params.csv | LogNormal AFT 模型参数 |
| problem2_group_stats*.csv | 各组 BMI 区间、推荐时点、样本量、保障率与风险明细 |
| problem2_kappa_sweep.csv / _report.txt | kappa 灵敏度分析结果与偏差报告 |
| problem2_model_summary.txt | 模型与策略汇总 |
| problem2_decision_curves.png | 决策曲线图 |
| 文件 | 说明 |
|---|---|
| problem3_strategy.csv | 默认 P = 0.95 场景最优策略 |
| problem3_strategy_matrix.csv | P 四档(0.50/0.75/0.90/0.99)4×9 决策策略矩阵 |
| problem3_strategy_P*.csv | 各 P 档最优策略 |
| problem3_elasticnet_screening.csv | Elastic-Net 特征筛选结果 |
| problem3_aft_params.csv | 多元 AFT 模型参数 |
| problem3_group_stats*.csv | 各组保障率与风险明细 |
| problem3_p_sweep.csv / _report.txt | P 灵敏度分析结果与偏差报告 |
| problem3_model_summary.txt | 模型与策略汇总 |
| problem3_decision_curves.png | 决策曲线图 |
| 文件 | 说明 |
|---|---|
| problem4_metrics.csv | 各通道(T13/T18/T21/ANY)患者级评估指标 |
| problem4_model_summary.txt | 患者级评估报告(混淆矩阵、信号诊断、数据限制说明) |
| problem4_patient_predictions.csv | 患者级预测明细 |
| problem4_signal_diagnostic.csv | 校准 Z 的分布统计与 |
| problem4_z_diagnostics.png | Z 值诊断图 |
- 原始数据以
data.xlsx形式提供,运行step1_data_preprocessing.py生成nipt_processed_data.csv;后续各步骤自动优先读取该文件,若不存在则回退读取data.xlsx; - 问题二、三中的遗传算法存在随机性,可通过
--seed参数固定随机种子;默认结果与仓库内输出一致; - 问题四若未安装 LightGBM,将自动回退到 scikit-learn 的 HistGradientBoostingClassifier,结果可能略有差异。
- 本仓库为数学建模竞赛练习/复现项目,代码与结果仅供学习交流使用;
- 数据与竞赛题目版权归竞赛主办方所有,请勿用于商业用途。