(C题|NIPT 的时点选择与胎儿的异常判定)2025年高教杯全国大学生数学建模国赛解题思路|完整代码论文集合

发布于:2025-09-05 ⋅ 阅读:(1396) ⋅ 点赞:(0)

我是Tina表姐,毕业于中国人民大学,对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在,我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合,专为本次赛题设计,旨在帮助您深入理解数学建模的每一个环节。
本次2025年高教杯全国大学生数学建模国赛C题可以做如下考虑 (部分公式和代码因为知乎排版问题显示不完整,文中代码仅有部分,完整论文格式标准,包含全部代码)
在这里插入图片描述
根据题目描述,第一个问题是:

问题 1:试分析胎儿 Y 染色体浓度与孕妇的孕周数和 BMI 等指标的相关特性,给出相应的关系模型,并检验其显著性。

这个问题要求:

  1. 相关性分析:分析胎儿 Y 染色体浓度与以下变量之间的关系:

    • 孕妇的孕周数(数据列 J)
    • 孕妇的 BMI 指标(数据列 K)
    • 其他可能相关的指标
  2. 建立关系模型:基于相关性分析结果,建立数学模型来描述这些变量之间的定量关系

  3. 显著性检验:对建立的模型进行统计检验,验证模型的统计显著性和可靠性

具体来说,需要重点关注:

  • Y 染色体浓度(数据列 V)作为因变量
  • 孕周数和 BMI 作为主要自变量
  • 可能还需要考虑其他相关因素如孕妇年龄、身高、体重等

这是整个研究的基础问题,为后续的分组优化和时点选择提供理论依据。

可视化

问题1:Y染色体浓度相关性分析与建模

1.1 数据预处理

首先需要对数据进行预处理:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
import warnings
warnings.filterwarnings('ignore')

# 数据预处理函数
def preprocess_data(df):
    # 筛选男胎数据(Y染色体浓度非空)
    male_data = df[df['Y染色体浓度'].notna()].copy()
    
    # 处理孕周数据,转换为数值型(周.天的形式)
    def parse_gestational_week(week_str):
        if pd.isna(week_str):
            return np.nan
        try:
            parts = str(week_str).split('+')
            weeks = float(parts[0])
            days = float(parts[1]) if len(parts) > 1 else 0
            return weeks + days/7.0
        except:
            return np.nan
    
    male_data['孕周_数值'] = male_data['孕周'].apply(parse_gestational_week)
    
    # 移除异常值和缺失值
    male_data = male_data.dropna(subset=['Y染色体浓度', '孕周_数值', 'BMI'])
    
    return male_data

1.2 探索性数据分析

def exploratory_analysis(data):
    # 基本统计描述
    print("=== 基本统计描述 ===")
    variables = ['Y染色体浓度', '孕周_数值', 'BMI', '年龄', '身高', '体重']
    desc_stats = data[variables].describe()
    print(desc_stats)
    
    # 相关性矩阵
    correlation_matrix = data[variables].corr()
    print("\n=== 相关性矩阵 ===")
    print(correlation_matrix['Y染色体浓度'].sort_values(ascending=False))
    
    return correlation_matrix

def visualize_relationships(data):
    fig, axes = plt.subplots(2, 3, figsize=(15, 10))
    
    # Y染色体浓度与孕周的关系
    axes[0,0].scatter(data['孕周_数值'], data['Y染色体浓度'], alpha=0.6)
    axes[0,0].set_xlabel('孕周')
    axes[0,0].set_ylabel('Y染色体浓度(%)')
    axes[0,0].set_title('Y染色体浓度 vs 孕周')
    
    # Y染色体浓度与BMI的关系
    axes[0,1].scatter(data['BMI'], data['Y染色体浓度'], alpha=0.6)
    axes[0,1].set_xlabel('BMI')
    axes[0,1].set_ylabel('Y染色体浓度(%)')
    axes[0,1].set_title('Y染色体浓度 vs BMI')
    
    # Y染色体浓度与年龄的关系
    axes[0,2].scatter(data['年龄'], data['Y染色体浓度'], alpha=0.6)
    axes[0,2].set_xlabel('年龄')
    axes[0,2].set_ylabel('Y染色体浓度(%)')
    axes[0,2].set_title('Y染色体浓度 vs 
基于题目描述和数据特点,我将对问题1进行详细的数学建模分析。

1.1 数据预处理

首先,我们需要筛选男胎样本数据,即Y染色体浓度列(V列)非空的样本。设筛选后的样本数为nnn,第iii个样本的相关变量为:

  • YiY_iYi:第iii个样本的Y染色体浓度(%)
  • WiW_iWi:第iii个样本的孕周数(周)
  • BiB_iBi:第iii个样本的BMI指标
  • AiA_iAi:第iii个样本的孕妇年龄
  • HiH_iHi:第iii个样本的身高
  • MiM_iMi:第iii个样本的体重

1.2 相关性分析

1.2.1 Pearson相关系数计算

计算Y染色体浓度与各指标的Pearson相关系数:

rY,X=∑i=1n(Yi−Yˉ)(Xi−Xˉ)∑i=1n(Yi−Yˉ)2∑i=1n(Xi−Xˉ)2r_{Y,X} = \frac{\sum_{i=1}^{n}(Y_i - \bar{Y})(X_i - \bar{X})}{\sqrt{\sum_{i=1}^{n}(Y_i - \bar{Y})^2}\sqrt{\sum_{i=1}^{n}(X_i - \bar{X})^2}}rY,X=i=1n(YiYˉ)2 i=1n(XiXˉ)2 i=1n(YiYˉ)(XiXˉ)

其中XXX可以是WWW(孕周)、BBB(BMI)、AAA(年龄)等变量。

1.2.2 相关系数显著性检验

对相关系数进行ttt检验:

t=rn−21−r2t = r\sqrt{\frac{n-2}{1-r^2}}t=r1r2n2

该统计量服从自由度为n−2n-2n2ttt分布。

1.3 多元回归模型建立

1.3.1 多元线性回归模型

基于相关性分析结果,建立多元线性回归模型:

Yi=β0+β1Wi+β2Bi+β3Ai+β4Hi+β5Mi+εiY_i = \beta_0 + \beta_1 W_i + \beta_2 B_i + \beta_3 A_i + \beta_4 H_i + \beta_5 M_i + \varepsilon_iYi=β0+β1Wi+β2Bi+β3Ai+β4Hi+β5Mi+εi

其中:

  • β0\beta_0β0:截距项
  • βj\beta_jβj (j=1,2,…,5j=1,2,\ldots,5j=1,2,,5):回归系数
  • εi\varepsilon_iεi:随机误差项,εi∼N(0,σ2)\varepsilon_i \sim N(0, \sigma^2)εiN(0,σ2)
1.3.2 非线性关系探索

考虑到生物学特性,可能存在非线性关系,建立多项式回归模型:

Yi=β0+β1Wi+β2Wi2+β3Bi+β4Bi2+β5Wi⋅Bi+εiY_i = \beta_0 + \beta_1 W_i + \beta_2 W_i^2 + \beta_3 B_i + \beta_4 B_i^2 + \beta_5 W_i \cdot B_i + \varepsilon_iYi=β0+β1Wi+β2Wi2+β3Bi+β4Bi2+β5WiBi+εi

或对数模型:

ln⁡(Yi)=β0+β1Wi+β2Bi+β3Ai+εi\ln(Y_i) = \beta_0 + \beta_1 W_i + \beta_2 B_i + \beta_3 A_i + \varepsilon_iln(Yi)=β0+β1Wi+β2Bi+β3Ai+εi

1.4 模型参数估计

使用最小二乘法估计参数:

β^=(XTX)−1XTY\hat{\boldsymbol{\beta}} = (\mathbf{X}^T\mathbf{X})^{-1}\mathbf{X}^T\mathbf{Y}β^=(XTX)1XTY

其中:

  • Y=[Y1,Y2,…,Yn]T\mathbf{Y} = [Y_1, Y_2, \ldots, Y_n]^TY=[Y1,Y2,,Yn]T
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import r2_score
import warnings
warnings.filterwarnings('ignore')

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 1. 数据加载和预处理
def load_and_preprocess_data(file_path):
    """
    加载并预处理NIPT数据
    """
    # 读取数据
    df = pd.read_excel(file_path)
    
    # 只保留男胎数据(有Y染色体浓度的数据)
    male_df = df[df['Y染色体浓度'].notna()].copy()
    
    # 数据清洗
    # 去除异常值
    male_df = male_df[male_df['Y染色体浓度'] > 0]  # Y染色体浓度应为正值
    male_df = male_df[male_df['BMI'] > 15]  # BMI合理范围
    male_df = male_df[male_df['BMI'] < 50]
    
    # 处理孕周数据(假设格式为"周数+天数")
    def parse_gestational_weeks(week_str):
        try:
            if '+' in str(week_str):
                weeks, days = str(week_str).split('+')
                return float(weeks) + float(days)/7
            else:
                return float(week_str)
        except:
            return np.nan
    
    male_df['孕周数值'] = male_df['孕周'].apply(parse_gestational_weeks)
    male_df = male_df[male_df['孕周数值'].notna()]
    
    return male_df

# 2. 相关性分析
def correlation_analysis(df):
    """
    进行相关性分析
    """
    # 选择相关变量
    correlation_vars = ['Y染色体浓度', '孕周数值', 'BMI', '年龄', '身高', '体重']
    corr_df = df[correlation_vars].copy()
    
    # 计算相关系数矩阵
    correlation_matrix = corr_df.corr()
    
    # 绘制相关性热力图
    plt.figure(figsize=(10, 8))
    sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0,
                square=True, fmt='.3f', cbar_kws={'shrink': 0.8})
    plt.title('变量间相关性热力图')
    plt.tight_layout()
    plt.show()
    
    # 输出Y染色体浓度与其他变量的相关系数
    y_corr = correlation_matrix['Y染色体浓度'].sort_values(key=abs, ascending=False)
    print("Y染色体浓度与各变量的相关系数:")
    print(y_corr)
    
    return correlation_matrix

# 3. 散点图分析
def scatter_analysis(df):
    """
    绘制散点图分析关系
    """
    fig, axes = plt.subplots(2, 2, figsize=(15, 12))
    
    # Y染色体浓度 vs 孕周
    axes[0,0].scatter(df['孕周数值'], df['Y染色体浓度'], alpha=0.6, color='blue')

根据题目描述,问题2是:

临床证明,男胎孕妇的BMI是影响胎儿Y染色体浓度的最早达标时间(即浓度达到或超过4%的最早时间)的主要因素。试对男胎孕妇的BMI进行合理分组,给出每组的BMI区间和最佳NIPT时点,使得孕妇可能的潜在风险最小,并分析检测误差对结果的影响。

这个问题的核心要求包括:

  1. BMI分组:对男胎孕妇根据BMI进行合理分组,确定每组的BMI区间

  2. 最佳NIPT时点:为每个BMI组确定最佳的NIPT检测时点(孕周)

  3. 风险最小化:使得孕妇的潜在风险最小(考虑早期发现风险低,中期风险高,晚期风险极高的原则)

  4. 误差分析:分析检测误差对结果的影响

  5. 达标时间:重点关注Y染色体浓度达到4%的最早时间与BMI的关系

这个问题需要在保证NIPT准确性(Y染色体浓度≥4%)的前提下,尽可能早地进行检测以降低风险。
更多内容具体可以看看我的下方名片!
里面包含有本次竞赛一手资料与分析!
另外在赛中,我们也会陪大家一起解析建模比赛
记得关注Tina表姐哦~