注:本内容由"数模加油站" 原创出品,虽无偿分享,但创作不易。
欢迎参考teach,但请勿抄袭、盗卖或商用。
C 题参考思路
C 题是一类标准的数据分析类题目,其目的是根据题目所给的附件数据资料及题目中的背景介绍分析孕妇的各项指标与其胎儿 Y 染色体浓度的关系,以更精确、及时、准确的进行
NIPT 检测,减少某些孕妇因胎儿不健康而缩短治疗窗口期所带来的潜在风险。
从 2023 年的蔬菜定价模型,2024 年的农作物种植策略,到今年的 NIPT 检测 C 题的数据分析性质日趋明显,针对这类问题,我建议不要过分依赖 python,Matlab 等编程工具以及大模型,更建议先快速的浏览所给附件的属性栏,通过 excel 自身的筛查功能以及快速浏览文件的能力进行初步分析,尽快抓到异常值。在数据分析类题目中,数据预处理占很重要一部分分数。同时要加强对题目的阅读,抓到每题的前提条件,自变量与因变量,最重要的是抓住题目背景知识中蕴含数据异常值的判定条件。例如本题中要抓住,孕周 10 周~25 周,
Y 染色体浓度大于 4%等重要数字,是否是判定条件结合后续的题目要求再研究,但是要有这个数字敏感度。
整个问题的解决流程主要可以分为三大块:对源数据进行预处理,建立 Y 染色体浓度与孕妇 BMI、孕期、孕情等因素的关系模型,提出针对无 Y 染色体的女胎较好的 NIPT 检测方法。进而也需要参赛团队有对应方面的一些知识积累和技能掌握:第一,提取文本信息能力,正如前面所言,数据分析类题目,从题目背景中读懂出题人的意思,找到异常值的判定方式以及对每小问的前提条件,所求目标,自变量因变量的选取,是占绝大部分分数的;第二,数据预处理能力,通过 excel,Matlab,python 等工具的使用,根据前面提取的误差条件,进行数据的预处理;第三,数理统计的相关知识,掌握相关的关系模型,进行显著性检验等。 本题中,问题 123 都是只需要分析附件中男胎数据的内容。而问题 4 是只需要分析女胎的相关内容。
针对问题一,其可能的变量有孕妇的孕周数、BM I,IVF 妊娠,怀孕次数,生产次数,其因变量只有胎儿 Y 染色体的浓度。IVF 妊娠除自然受孕外,另外两种方式的数据样本较少,建议采取 excel 筛选比较的方式。对样本数据较多的孕周数,BMI 等内容,进行数据分析,选取合适的模型。根据常识判断,BMI 与 Y 染色体浓度大致成反比例关系,孕周数与 Y 染色体浓度大致成正比关系。对此问题,采取最小二乘回归及逻辑回归尝试其拟合效果即可。然后分析其显著性,
针对问题二,用问题 1 的逻辑回归估计 BMI 值,对给定 BMI,求满足 Y 染色体浓度要求的最小孕周阈值 ,BMI 分组情况可以采取两种方式分组:方案 A:采用题面常组 [20,28),[28,32),[32,36),[36,40),[40,+∞)。方案 B:对 问题中所做曲线关于 BMI 类别做做 1D 聚类/自然断点,得到 4--6 组并给出各组时点。根据模型选取时点,根据所得结果结合题目背景≤12 周风险低,13--27 周风险高,≥28 周极高,进行风险量化。后续记得进行灵敏度分析与鲁棒性检验。
针对问题三 事实上,身高体重在 BMI 中已有体现,我们只需考虑年龄,妊娠方式等内容的影响,用 L1 正则逻辑回归(可稀疏化、稳定选择)预测,并在样本内评估 AUC;本质上,是第一二题的补充。
针对问题四,阅读相关文献,通过科学性内容,高风险:若任一指标满足
‖Z13‖ ≥ 3 或 ‖Z18‖ ≥ 3 或 ‖Z21‖ ≥ 3,判定为高风险。对附件中数据进行混淆矩阵分析,结合科学性内容佐证,双轨并行。
算法参考代码:
逻辑回归:
python
import pandas as pd import matplotlib.pyplot as plt data=pd.read_csv('Dry_Bean_Dataset.csv') df=pd.DataFrame(data) color=[] for i in df['Class'][0:3349]: if i=='SEKER':
color.append('red') else:
color.append('blue') plt.scatter(df['MajorAxisLength'][0:3349],df['MinorAxisLength'][0:3349],color=color) plt.xlabel('MajorAxisLength') plt.ylabel('MinorAxisLength') plt.show()
最小二乘回归:
python
voud LeastSquareLinearFit(float x[], float y[], const int num, double &a, double &b)
{
uint64_t sum_x = 0; uint64_t sum_y = 0; uint64_t sum_x2 = 0; uint64_t sum_xy = 0;
for(uint32_t i = 0; i < num; i++)
{ sum_x += x[i]; sum_y += y[i]; sum_x2 += x[i]*x[i]; sum_xy += x[i]*y[i];
}
a = (double)(sum_x2*sum_y - sum_x*sum_xy)/(double)(num*sum_x2sum_x*sum_x); // 偏移 b = (double)(num*sum_xy - sum_x*sum_y)/(double)(num*sum_x2 - sum_x*sum_x);
// 斜率
}
后续都在"数模加油站"...