这是一个关于出血性脑卒中临床智能诊疗建模的竞赛任务,任务主要包括:
一、背景介绍:介绍了出血性脑卒中的背景和重要性。
二、数据集介绍及建模目标:提供了数据集的详细信息,包括患者信息、临床信息、影像数据等。建模目标包括:
1.血肿扩张风险相关因素探索建模:根据数据判断患者是否在发病后48小时内发生血肿扩张,并预测所有患者发生血肿扩张的概率。
2.血肿周围水肿的发生及进展建模:构建水肿体积随时间进展曲线,并探索不同人群的差异,分析治疗方法对水肿进展的影响,以及血肿体积、水肿体积和治疗方法之间的关系。
3.出血性脑卒中患者预后预测及关键因素探索:预测患者90天mRS评分,分析预后与个人史、疾病史、治疗方法和影像特征之间的关系。
对问题一“血肿扩张风险相关因素探索建模”的建模思路,可以考虑以下几点:
数据预处理:根据表1和表2提取患者的首次影像时间、首次血肿体积、后续影像时间和血肿体积。判断每个患者是否发生血肿扩张(根据定义判定)。
特征工程:根据表1提取患者的个人史、疾病史和发病相关特征。结合表2提取首次影像的血肿体积和位置等特征。
建模
(1) 将提取的特征进行编码和标准化处理,例如使用One-Hot Encoding处理类别特征,使用Min-Max Scaling将连续特征缩放到[0,1]区间。
(2) 将处理后的特征作为自变量X,血肿扩张发生作为因变量Y,建立逻辑回归模型:
P ( Y = 1 ∣ X ) = σ ( β 0 + β 1 X 1 + ⋯ + β p X p ) P(Y=1|X)=\sigma(\beta_0+\beta_1X_1+\cdots+\beta_pX_p) P(Y=1∣X)=σ(β0+β1X1+⋯+βpXp)
σ ( z ) = 1 1 + e − z \sigma(z)=\frac{1}{1+e^{-z}} σ(z)=1+e−z1
(3) 使用逻辑回归中的最大似然估计法估计模型参数 β \beta β。
(4) 在训练数据集上拟合逻辑回归模型,获得模型的参数估计值。
(1) 在验证集上利用ROC曲线和AUC评估模型效果。
(2) ROC曲线通过不同分类阈值下的真正率和假正率绘制。AUC衡量ROC曲线下的面积,值越大表示模型分类性能越好。
(3) 如果AUC接近1,表示模型有很强的分类能力。如果AUC接近0.5,则表示模型分类能力弱。
(4) 可以通过调整模型的参数,优化AUC指标,提高模型分类性能。
(5) 重复上述步骤,选择验证集上AUC指标最优的模型。
#导入需要的库
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, auc, precision_score, recall_score, f1_score, roc_auc_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score
#读取数据
df1 = pd.read_excel('表1.xlsx')
df2 = pd.read_excel('表2.xlsx')
# 数据预处理
X = df1[['年龄','性别','高血压史','发病到影像时间']]
X = pd.concat([X, df2.loc[:, 'ACA_L':'Cerebellum_R']], axis=1)
y = df1['血肿扩张']
# 特征工程
enc = OneHotEncoder()
X = enc.fit_transform(X)
问题二涉及构建水肿体积随时间进展的模型,并探索不同人群之间的差异以及治疗方法与水肿进展的关系。建模思路可以分为以下几个步骤:
对于每个患者,残差是拟合曲线的预测值与实际观测值之间的差异。残差计算可以采用以下公式:
残差 = 实际观测值 − 拟合曲线的预测值 \text{残差} = \text{实际观测值} - \text{拟合曲线的预测值} 残差=实际观测值−拟合曲线的预测值
对于每个患者,你会得到一个残差值。这些残差值可以用于后续的分析。
在这一步骤中,你将根据残差的分布情况将患者分成不同的亚组。这可以使用统计方法来实现,例如,你可以使用聚类分析或者根据残差的分位数将患者分成亚组。亚组的个数可以根据数据的特点和分布情况来确定,通常选择3-5个亚组。
一旦你将患者分成亚组,你可以为每个亚组构建水肿体积随时间进展的曲线,并计算每个患者在各自亚组内的残差。这有助于识别不同亚组之间的水肿进展模式是否存在显著差异。
在这一步骤中,你将使用统计方法来分析不同治疗方法与水肿进展模式的关系。具体的方法可以包括:
方差分析(ANOVA):你可以使用ANOVA来比较不同治疗方法之间水肿体积进展的差异。这将帮助你确定是否存在统计显著性。
回归分析:如果你想进一步探索治疗方法对水肿进展的影响,可以进行多元回归分析。在回归分析中,水肿体积进展可以作为因变量,治疗方法可以作为自变量,同时考虑其他潜在的影响因素。
可视化:使用可视化工具绘制不同治疗方法下的水肿体积随时间的趋势图,以帮助直观理解治疗方法的效果。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.cluster import KMeans
from scipy.stats import f_oneway
from statsmodels.formula.api import ols
# 1. 数据准备
# 读取数据
data = pd.read_excel("表2-患者影像信息血肿及水肿的体积及位置.xlsx")
# 提取前100个患者的数据
sub100_data = data[data['患者编号'].isin(range(1, 101))]
# 2. 构建水肿体积随时间进展曲线
# 拟合曲线的函数
def fit_curve(x, y):
model = LinearRegression()
model.fit(x.reshape(-1, 1), y)
return model.predict(x.reshape(-1, 1))
# 3. 计算残差
residuals = []
for patient_id in range(1, 101):
patient_data = sub100_data[sub100_data['患者编号'] == patient_id]
time_points = patient_data['时间点'].values
ed_volumes = patient_data['水肿体积'].values
predicted_volumes = fit_curve(time_points, ed_volumes)
问题三涉及出血性脑卒中患者预后预测以及关键因素的探索。
在这一步骤中,我们将基于患者的个人史、疾病史、发病相关信息以及首次影像结果,构建一个预测模型来预测患者的90天mRS评分。
建模思路:
公式: 通常使用线性回归模型的公式如下(其中Y为90天mRS评分,X为特征向量):
Y = β 0 + β 1 X 1 + β 2 X 2 + … + β n X n + ϵ Y = \beta_0 + \beta_1X_1 + \beta_2X_2 + \ldots + \beta_nX_n + \epsilon Y=β0+β1X1+β2X2+…+βnXn+ϵ
在这一步骤中,我们将基于前100个患者的所有已知临床、治疗信息以及表2和表3的影像检查结果(包括首次和随访),构建一个更复杂的预测模型来预测所有含随访影像检查的患者的90天mRS评分。
建模思路:
公式: 模型的公式与步骤1中类似,只是在这里我们考虑更多特征和可能使用更复杂的模型。
在这一步骤中,我们将分析出血性脑卒中患者的预后(90天mRS)与个人史、疾病史、治疗方法以及影像特征(包括血肿/水肿体积、位置、信号强度特征、形状特征)之间的关联关系。
建模思路:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt
import seaborn as sns
# 读取数据
data = pd.read_excel("表1-患者列表及临床信息.xlsx")
image_data = pd.read_excel("表2-患者影像信息血肿及水肿的体积及位置.xlsx")
# 加载其他数据表
# 步骤1:构建预测模型(基于首次影像)
# 数据预处理
# 假设选择了一些特征作为X,90天mRS作为Y
X = data[['特征1', '特征2', '特征3']] # 替换为实际特征名称
Y = data['90天mRS']
# 划分训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42)
# 训练线性回归模型
model = LinearRegression()
model.fit(X_train, Y_train)
完整版看我的文档哦
2023 研究生数学建模竞赛(E题)建模秘籍&文章代码思路大全