好的网站建设网站,wordpress 微信接口,wordpress 链接优化,湖北企业建站系统信息2020年第九届数学建模国际赛小美赛
B题 血氧饱和度的变异性
原题再现#xff1a; 脉搏血氧饱和度是监测患者血氧饱和度的常规方法。在连续监测期间#xff0c;我们希望能够使用模型描述血氧饱和度的模式。 我们有36名受试者的数据#xff0c;每个受试者以1 Hz的频率连…2020年第九届数学建模国际赛小美赛
B题 血氧饱和度的变异性
原题再现 脉搏血氧饱和度是监测患者血氧饱和度的常规方法。在连续监测期间我们希望能够使用模型描述血氧饱和度的模式。 我们有36名受试者的数据每个受试者以1 Hz的频率连续测试血氧饱和度约1小时。我们还记录了参与者的以下信息包括年龄、BMI、性别、吸烟史和/或当前吸烟状况以及可能影响阅读的任何重要疾病。 我们想用这些数据来发现血氧饱和度变化的典型模式这样我们就可以用几个参数来描述一个人。我们还想知道血氧饱和度序列的模式是否与年龄有关即老年人与年轻人相比哪些特征发生了变化。理想情况下这些特征应具有生物学或医学意义。
整体求解过程概述(摘要) 脉搏血氧饱和度是监测患者血氧饱和度的常规方法。脉搏血氧饱和度的使用有助于减少有创动脉血气分析和低氧血症检测的需要。一个可靠有效的血氧饱和度数学模型对进一步研究具有重要意义。 首先计算36名受试者血氧饱和度的均值和标准差然后进行初步的线性分析。结果表明氧饱和度波动较大并伴有过饱和度。一般来说脉搏血氧饱和度显示出很小的变异性。根据poincare曲线分析血氧饱和度的变化主要由长期变化组成。此外我们还分析了平均SpO2与群体变异性之间的Pearson相关系数发现SpO2水平与群体变异性呈负相关。DFA分析结果表明时间序列是典型的分形时间序列具有明显的长程相关性和长程幂律。 在此基础上探讨了血样多样性各参数的具体模式并提出利用ARMA时间序列模型对血氧饱和度的多样性进行建模和分析。我们对样本进行了单位根检测确定样本为平稳序列。然后对样本的自相关函数ACF或偏自相关函数PACF进行统计分析确定模型的阶数。最后通过机器学习得到ARMA模型的具体参数。通过残差分析和D-W检验验证了模型的正确性。通过模型分析可知健康成人血氧饱和度浓度具有三阶自相关和三阶偏相关的特征。 通过样本熵分析、趋势波动分析和多尺度熵分析探讨了血氧饱和度序列模式与年龄的关系得出以下结论1年龄对平均血氧浓度无显著影响。2 青年人和老年人的血氧饱和度变化是慢性的。3 从不同的尺度来看老年人的样本熵小于青年人且在较高的尺度下差异更为明显。从长远来看老化对OSV复杂性的降低有重要影响。 综上所述该模型在血氧饱和度分析中准确、真实发现了年龄和血氧饱和度序列的具体特征具有生物学或医学意义。
模型假设 为了简化问题并消除复杂性我们做出以下假设。 1 问题中给出的数据是真实可靠的。该指令设置了一个限制即提供的数据文件只包含我们应该用于此问题的数据并且只有当这些数据真实可靠时我们的分析才有效。 2 没有其他影响因素。问题中提供的数据涵盖了可能影响研究人群OSV的所有重要医疗条件。
问题重述 问题背景 脉搏血氧饱和度pulseoximetry是一种无创性测量血氧饱和度SpO2的技术。无论是在重症监护室、外科手术室还是在一些门诊它都被证明是一种广泛应用的临床方法。在这些环境中使用脉搏血氧饱和度有助于减少有创动脉血气分析和检测低氧血症的需要。 利用血氧饱和度的变异性分析来进一步测量血氧合的调节已引起越来越多的认识。生理变异性分析的好处在于它可以为我们提供有关生理控制系统完整性的有用信息。氧饱和度变异性OSV分析可用于控制组织氧合监测的心肺系统的完整性[13]。此外它还用于睡眠呼吸紊乱的诊断其中SpO2特征充分描述了SpO2调节以识别睡眠呼吸紊乱的风险。在早产儿中血氧饱和度变异性表现出明显的特征OSV稳定增加而平均SpO2值变化不大[8]。此外研究人员试图寻找OSV的诊断价值。例如最近在孟加拉国一家三级医院开展的一项研究调查了实施OSV作为预测工具是否可以提高危重症儿童的入院率。 因此一个稳定有效的血氧饱和度数学模型将为进一步的研究做出重要贡献。 问题重述 •建立氧气典型变化模式的数学模型以确定人类健康特征与OSV之间的关系。 •了解血氧饱和度序列的模式是否与年龄相关以及与年轻人相比老年人的哪些特征表现出明显的变化。
模型的建立与求解整体论文缩略图 全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
部分程序代码(代码和文档not free)
li_avenp.mean(li_np,axis0) #Average of 36 people in 0-3500 seconds
li_ave_pernp.mean(li_np,axis1) #Average blood oxygen per person
li_std_pernp.std(li_np,axis1) #Blood oxygen variance per person
li_simpli_np[0,:] #Data sample of the first person
#np.set_printoptions(thresholdnp.inf)
print(li_std_per ,li_std_per)
#Drawing
fig1 plt.figure()
#Draw blood oxygen time series
plt.plot(range(len(li_simp)),li_simp)
plt.xlabel(Data points)
plt.ylim(90,105)
plt.ylabel(Oxygen saturation(\%))
plt.title(’Oxygen Saturation Variability Over 1 Hour’)
#The relationship between mean blood oxygen and standard deviation
fig2 plt.figure()
li_ave_stdnp.std(li_ave_per)
li_ave_avenp.mean(li_ave_per)
print(li_ave_ave ,li_ave_ave)
print(li_ave_std ,li_ave_std)
li_std_avenp.mean(li_std_per)
li_std_stdnp.std(li_std_per)
print(li_std_ave ,li_std_ave)
print(li_std_std ,li_std_std)
plt.scatter(li_ave_per,li_std_per)
plt.xlim(90,105)
plt.ylim(0,1.5)
plt.xlabel(’Mean SpO2 (\%)’)
plt.ylabel(’Standard Deviation of SpO2 (\%)’)
plt.title(Relationship between Mean Oxygen Saturation Level and Total Variability)
#Linear regression
model LinearRegression()
model model.fit(li_ave_per.reshape(-1,1), li_std_per)
plt.plot([93,100],[i*model.coef_model.intercept_ for i in [93,100]])
#Correlation coefficient between mean blood oxygen and standard deviation
li_ave_std_rnp.mean(np.multiply((li_ave_per-np.mean(li_ave_per)),(li_std_per-np.mean(li_std_per))))/(np.std(li_std_per)*np.std(li_ave_per))
plt.text(92, 0.6, r\%.3f \% li_ave_std_r)
fig3 plt.figure()
for i in range(len(li_simp)-1):
plt.plot(li_simp[i], li_simp[i1], color’b’, marker’o’)
plt.xlabel(’SpO2(n)(\%)’)
plt.ylabel(’SpO2(n1)(\%)’)
plt.xlim(90,105)
plt.ylim(90,105)
plt.title(Poincare Plot for SpO2 data)
#SD calculation
all_SD1[]
all_SD2[]
for j in range(36):
SD1 []
SD2 []
li_templi_np[j,:]
for i in range(len(li_temp)-1):
SD1.append(li_temp[i1]-li_temp[i])
SD2.append(li_temp[i1]li_temp[i])
ST1 np.std(SD1)/np.sqrt(2)
ST2 np.std(SD2)/np.sqrt(2)
all_SD1.append(ST1)
all_SD2.append(ST2)
SD1_avenp.mean(all_SD1)
SD2_avenp.mean(all_SD2)
SD1_stdnp.std(all_SD1)
SD2_stdnp.std(all_SD2)
print(SD1_ave \%.2f\%SD1_ave)
print(SD2_ave \%.2f\%SD2_ave)
print(SD1_std \%.2f\%SD1_std)
print(SD2_std \%.2f\%SD2_std)
plt.text(100,94,SD1:\%.2f \% all_SD1[0] \%)
plt.text(100,93,SD2:\%.2f \% all_SD2[0] \%)function SampEnVal SampEn(data, m, r)
data data(:)’;
N length(data);
Nkx1 0;
Nkx2 0;
for k N - m:-1:1
x1(k, :) data(k:k m - 1);
x2(k, :) data(k:k m);
end
for k N - m:-1:1
x1temprow x1(k, :);
x1temp ones(N - m, 1)*x1temprow;
dx1(k, :) max(abs(x1temp - x1), [], 2)’;
Nkx1 Nkx1 (sum(dx1(k, :) r) - 1)/(N - m - 1);
x2temprow x2(k, :);
x2temp ones(N - m, 1)*x2temprow;
dx2(k, :) max(abs(x2temp - x2), [], 2)’;
Nkx2 Nkx2 (sum(dx2(k, :) r) - 1)/(N - m - 1);
end
Bmx1 Nkx1/(N - m);
Bmx2 Nkx2/(N - m);
SampEnVal -log(Bmx2/Bmx1);function [mse,sf] MSE_Costa2005(x,nSf,m,r)
% pre-allocate mse vector
mse zeros([1 nSf]);
% coarse-grain and calculate sample entropy for each scale factor
for ii 1 : nSf
% get filter weights
f ones([1 ii]);
f f/sum(f);
% get coarse-grained time series (i.e., average data within non-overlapping time
windows)
y filter(f,1,x);
y y(length(f):end);
y y(1:length(f):end);
% calculate sample entropy
mse(ii) SampleEntropy(y,m,r,0);
end
% get sacle factors
sf 1 : nSf;function F_nDFA(DATA,win_length,order)
Nlength(DATA);
nfloor(N/win_length);
N1n*win_length;
yzeros(N1,1);
Ynzeros(N1,1);
fitcoefzeros(n,order1);
mean1mean(DATA(1:N1));
for i1:N1
y(i)sum(DATA(1:i)-mean1);
end
yy’;
for j1:n
fitcoef(j,:)polyfit(1:win_length,y(((j-1)*win_length1):j*win_length),order);
end
for j1:n
Yn(((j-1)*win_length1):j*win_length)polyval(fitcoef(j,:),1:win_length);
end
sum1sum((y’-Yn).^2)/N1;
sum1sqrt(sum1);
F_nsum1;全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可