主要内容

模拟葡萄糖-胰岛素反应

这个例子展示了如何在SimBiology®中使用一个基于生理的血糖-胰岛素系统模型在正常人和糖尿病人身上模拟和分析一个模型。

这个例子需要统计和机器学习工具箱™ 和优化工具箱™.

工具书类

  1. 葡萄糖胰岛素系统的膳食仿真模型。C. Dalla Man,R.A.Rizza和C. Cobelli。生物医学工程的IEEE交易(2007)54(10),1740-1749。

  2. 口服葡萄糖吸收的系统模型:金标准数据验证。C.Dalla Man、M.Camilleri和C.Cobelli。生物医学工程的IEEE交易(2006) 53(12), 2472-2478.

目的

  • 实施葡萄糖-胰岛素反应的SimBiology模型。

  • 模拟正常和受损(糖尿病)受试者对一餐或多餐的葡萄糖-胰岛素反应。

  • 使用以下方法进行参数估计SBIOfit.使用强制功能策略。

背景

在2007年的出版物中,Dalla Man等人开发了一个餐后人类葡萄糖-胰岛素反应模型。该模型使用常微分方程描述了系统的动力学。作者使用他们的模型模拟了正常人和患有糖尿病的人在一顿或多餐后的葡萄糖-胰岛素反应各种类型的胰岛素损伤。这些损伤表现为一组交替的参数值和初始条件。

我们实现了SimBiology模型,m1,作者:

  • 翻译达拉曼等人的模型方程。(2007)转变为反应,规则和事件。

  • 将模型组织成两个隔间,一个用于葡萄糖相关物种和反应(命名为葡萄糖外观)和一个有关胰岛素相关的物种和反应(命名胰岛素分泌).

  • 使用来自模型方程和表1和图1的参数值和初始条件。

  • 包括Dalla-Man等人(2006年)提出的胃排空率方程。

  • 设置所有物种,隔间和参数的单位,由Dalla Man等人指定的。(2007),允许使用单元转换模拟偶发模型。(请注意,SimBiology还支持使用无量纲参数来通金宝app过设置它们价值单笔财产无量纲的.)

  • 设置配置集TimeUnits小时,因为模拟过程持续了7到24小时。

  • 以1千克体重为基础,转换原始模型中按体重标准化的物种和参数。按照SimBiology的要求,这样做可以使物种的数量或浓度达到单位。

我们将SimBiology模型中的胰岛素损伤表示为具有以下名称的变异对象:

  • 2型糖尿病

  • 低胰岛素敏感性

  • 高细胞响应性

  • 低电池响应性

  • 高胰岛素敏感性

我们将SimBiology模型中的膳食表示为剂量对象:

  • 一个剂量名叫单粉表示在模拟开始时一餐78克葡萄糖。

  • 一个剂量名叫日常生活相对于午夜开始的模拟,表示一天的膳食价值:早餐在模拟时间的8小时(上午8点)为45克葡萄糖,午餐在12小时(中午)为70克葡萄糖,晚餐在20小时(晚上8点)为70克葡萄糖。

SimBiology模型的示意图如下所示:

设置

加载模型。

sbioloadproject ('insulindemo'“m1”

禁止在模拟期间发出的信息警告。

Warnsettings =警告(“关”“SimBiology: DimAnalysisNotDone_MatlabFcn_Dimensionless”);

模拟正常人的葡萄糖-胰岛素反应

选择单粉剂量对象并显示其属性。

mealDose=sbioselect(m1,'姓名'“单餐”);得到(米多糖)
ans =结构体字段:金额:78间隔:0速率:0重复计数:0开始时间:0活动:0数量单位:'gram'DurationParameterName:'EventMode:'stop'LagParameterName:'RateUnits:'TargetName:'Dose'时间单位:'hour'名称:'Single Meeting'父项:[1x1 SimBiology.Model]注释:'Tag:'Type:'repeatdose'用户数据:[]

模拟7小时。

configset=getconfigset(m1,“活跃”);configset.stoptime = 7;

显示模拟时间单位(和停止单位)。

configset。TimeUnits
ans =“小时”

为一个正常的实验对象模拟一顿饭。

normalMealSim=sbiosimulate(m1,configset,[],mealDose);

模拟2型糖尿病患者的葡萄糖 - 胰岛素反应

选择2型糖尿病型变体并显示其属性。

糖尿病= SBIOSELECT(M1,'姓名''2型糖尿病'
diabetes var = SimBiology Variant - Type 2 diabetes (inactive) ContentIndex: Type: Name: Property: Value: 1 parameter Plasma Volume…值1.49 2参数k1值0.042 3参数k2值0.071 4参数Plasma Volume…Value 0.04 5 parameter m1 Value 0.379 6 parameter m2 Value 0.673 7 parameter m4 Value 0.269 8 parameter m5 Value 0.0526 9 parameter m6 Value 0.8118 10 parameter Hepatic extrc…价值0.6 11参数kmax值0.0465 12参数kmin值0.0076 13参数出租车值0.023 14参数kgri值0.0465 15参数f值0.9 16参数值6 e-05 17参数b值0.68 18参数c值0.00023 19参数d值0.09 20参数kp1值3.09 21 22个参数kp3值参数kp2值0.00070.005 23参数kp4值0.0786 24参数ki值0.0066 25参数[Ins Ind Glu U…值1 26 27参数Vmx值参数Vm0值4.65 466.21 0.034 28公里参数值29参数p2U值0.084 30参数K值0.99 31参数α值0.013 32参数β值0.05 33参数γ值0.5 34参数ke1值0.0007 35参数ke2值269 36参数基础等离子体G……值164.18 37参数基础血浆I…价值54.81

为2型糖尿病患者模拟一顿饭。

diabeticMealSim=sbiosimulate(m1,配置集,diabeticVar,mealDose);

比较模拟最重要输出的结果。

  • 血浆葡萄糖(物种等离子体glu粗

  • 血浆胰岛素(种)血浆Ins浓缩的

  • 内源性葡萄糖生产(参数谷氨酸产物

  • 葡萄糖外观率(参数Glu出现率

  • 葡萄糖利用率(参数glu ilil.

  • 胰岛素分泌(参数Ins Secr

outputNames = {“血浆葡萄糖浓度”“等离子体浓度”“Glu-Prod”...“Glu出现率”“Glu Util”“这是秘密”};数字;为了i=1:numel(outputNames)子图(2,3,i);[tNormal,ynNormal]=normalMealSim.selectbyname(outputNames{i});[tDiabetic,yDiabetic]=diabeticMealSim.selectbyname(outputNames{i});plot(tNormal,yNormal,' - '...糖尿病,糖尿病,“——”);%注释数据outputparam = sbioselect(m1,'姓名'我,outputNames {});标题(outputNames{我});Xlabel(的时间(小时));如果strcmp(outputparam.type,“参数”) ylabel (outputParam.ValueUnits);其他的ylabel (outputParam.InitialAmountUnits);结束xlim ([0 7]);%添加传奇如果我== 3传说({'普通的'“糖尿病”},“位置”'最好的事物');结束结束

图中包含6个轴对象。标题为Plasma Glu Conc的轴对象1包含2个类型为line的对象。标题为Plasma Ins Conc的轴对象2包含2个类型为line的对象。标题为Glu Prod的轴对象3包含2个类型为line的对象。这些对象表示正常、糖尿病。标题为Glu的轴对象4包含2个对象类型为line。标题为Glu Util的轴对象5包含2个类型为line的对象。标题为Ins Secr的轴对象6包含2个类型为line的对象。

注意血浆中葡萄糖和胰岛素的浓度更高,以及葡萄糖利用和胰岛素分泌的持续时间延长。

给正常受试者模拟一日三餐

设置模拟停止到24小时。

configset.StopTime=24;

选择每日膳食剂量。

Daydose = SbioSelect(M1,'姓名'“日常生活”);

为一个正常的实验对象模拟三餐。

normalDaySim = sbiosimulate(m1, configset, [], dayDose);

为受损受试者模拟一天三餐

模拟下列损害组合:

  • 损害1:胰岛素敏感性低

  • 损伤2:高β细胞反应性损伤1

  • 缺陷3:低细胞反应性

  • 减值4:损伤3具有高胰岛素敏感性

将损伤存储在单元格数组中。

Whemairvars {1} = SBIOSELECT(M1,'姓名''低胰岛素敏感性');disbadivars{2}=[disbadivars{1},...sbioselect(m1,'姓名'“高β细胞反应性”));impairVars {3} = sbioselect (m1,'姓名'“低β细胞反应性”);disbadivars{4}=[disbadivars{3},...sbioselect(m1,'姓名'“高胰岛素敏感性”));

模拟每个损伤。

为了i = 1:4劣质(i)= sbiosmulate(m1,configset,whemairvars {i},daydose);结束

比较血糖和血浆胰岛素结果。

图;outputNames = {“血浆葡萄糖浓度”“等离子体浓度”};Legendlabels = {{'普通的'},...{“ins =β\ '“-Ins+\beta”},...{'=Ins-\beta'“+ Ins -β\”}};yLimits=[80240;0500];为了i = 1:numel(outputNames) [tNormal, yNormal] = selectbyname(normalDaySim, outputNames{i});[tImpair, yImpair] = selectbyname(损伤,outputNames{i});%绘制正常子地块(2,3,3*i-2);地块(T正常、Y正常、,“b-”);XLIM([024]);ylim(ylimits(我,:));Xlabel(的时间(小时));传奇(legendLabels{1},“位置”“西北”);%低胰岛素子图(2,3,3 *i-1);情节(tImpair {1}, yImpair {1},“g——”, tImpair {2}, yImpair {2},“:”);XLIM([024]);ylim(ylimits(我,:));Xlabel(的时间(小时));传奇(legendLabels{2},“位置”“西北”);头衔(outputNames{i});%低贝塔曲线图子地块(2,3,3*i);地块(tImpair{3},yImpair{3},c -。, tImpair {4}, yImpair {4},“m -”);XLIM([024]);ylim(ylimits(我,:));Xlabel(的时间(小时));传奇(legendLabels{3},“位置”“西北”);结束

图包含6个轴对象。轴对象1包含类型线的对象。该对象表示正常。轴对象2带有标题等离子体Glu Cr,包含2个类型的线。这些对象表示-ins = \ beta,-ins + \ beta。轴对象3包含2个类型的2个对象。这些对象代表= INS  -  \ BETA,+ INS  -  \ beta。轴对象4包含类型线的对象。该对象表示正常。轴对象5具有标题等离子体inc,包含2个类型的型号。 These objects represent -Ins =\beta, -Ins +\beta. Axes object 6 contains 2 objects of type line. These objects represent =Ins -\beta, +Ins -\beta.

注意,低胰岛素敏感性(绿色虚线, - 一世 N S. = β )或低β-细胞敏感度(虚线 - 点缀的青色线, = 一世 N S. - β )导致血糖浓度增加和延长(图的顶部一行)。一个系统中的低灵敏度可以通过另一个系统中的高灵敏度得到部分补偿。例如,低胰岛素敏感性和高β细胞敏感性(红色虚线, - 一世 N S. + β )导致相对正常的等离子体葡萄糖浓度(顶部的图表)。然而,在这种情况下,所得的血浆胰岛素浓度非常高(底部的图)。

参数估计方法

作者不是同时估计整个模型的参数,而是使用强制函数策略对模型的不同子系统进行参数估计。这种方法需要子模型“输入”的额外实验数据。在拟合过程中,输入数据决定输入物种的动态。(在完整模型中,输入的动力学由微分方程确定。)在SimBiology术语中,您可以将强制函数作为重复赋值规则来实现,该规则控制作为模型子系统输入的物种或参数的值。在以下部分中,我们使用SimBiology的参数拟合功能来优化作者报告的参数值。

用糖尿病术语用葡萄糖外观nlinfit

胃肠道模型表示膳食中的葡萄糖如何通过胃、肠道和肠道运输,然后被吸收到血浆中。该子系统的输入是膳食中的葡萄糖量,输出是血浆中葡萄糖的出现率。但是,我们也根据作者与参数和模拟结果不一致。由于此输入仅在模拟开始时出现,因此不需要强制功能。

这个函数SBIOfit.金宝app支持SimBiology模型中的参数估计,使用MATLAB™、统计学和机器学习工具箱、优化工具箱和全局优化工具箱中的几种不同算法。首先,利用统计学和机器学习工具箱函数估计参数nlinfit

%加载实验数据fitData = groupedData (readtable (“GlucoseData.csv”'delimiter'','));%设置数据的单位fitData.Properties.VariableUnits = {...“小时”...%时间单位毫克/分钟的...% GluRate单位'Milligram / Direiliter'...% PlasmaGluConc单位毫克/分钟的...% GluUtil单位};%确定哪些模型组件对应于观察到的数据变量。gastrofitobs ='[Glu Appear Rate] = Glu ';%估计以下参数的值:gastroFitEst = estimatedInfo ({“kmax”“kmin”“出租车”“剂量”});%确保参数估计值在估计过程中始终为正值%在所有参数上使用日志转换。[gastroFitEst.Transform]=交易('日志');%将剂量的初始估计设置为报告的膳食剂量。这%剩余的初始估计将从参数值% 该模型。胃功能测试(4)。初始值=米糖。量;%用初始参数估计生成模拟数据configset.stoptime = 7;gastroinitsim = sbiosmulate(m1,mealldose);%使用| nlinfit |拟合数据,在每次迭代时显示输出fitOptions = statset (“显示”'iter');[gastroFitResults,gastroFitSims]=sbiofit(m1,fitData,...gastroFitObs gastroFitEst, [],“nlinfit”, fitOptions);
迭代SSE梯度步长----------------------------------------------------------- 0 43.798 1 2.23537 22.9971 0.596828 2 1.65253 1.36198 0.104842 3 1.64911 0.0938221 0.0264691 4 1.64909 0.000741057 0.0025351 5 1.64909 0.0158726 0.000584717 6 1.64908 0.000990127 6.11615e-05 7 1.64908 0.0418539 1.67247e-06上证综指相对变化小于期权。TolFun

拟合数据使用fminunc

现在,使用优化工具箱函数估算参数fminunc

%拟合数据,绘制每次迭代的目标函数fitOptions2=最佳选项(“fminunc”“PlotFcns”,@optimplotfval);[胃酸虫(2),Gastrofitsims(2)] = SBIOfit(M1,FitData,...gastroFitObs gastroFitEst, [],“fminunc”, fitOptions2);

图优化Plot函数包含一个轴对象。标题为当前函数值:1.64909的轴对象包含一个类型为line的对象。

比较拟合前后的仿真结果。

gastrosims = selectbyname([gastroinitsim gastrofitsims],“Glu出现率”);图;曲线图(gastroSims(1).时间,gastroSims(1).数据,' - '...gastroSims(2)。时间,gastroSims(2)。数据,“——”...胃模拟(3).时间,胃模拟(3).数据,“-”。...fitdata.time,fitdata.glurate,“x”);Xlabel(‘时间(小时)’);ylabel (毫克/分钟的);传奇(“报告”“估计(nlinfit)”...“估计(fminunc)”“实验性”);头衔(葡萄糖的外表适合的);

图中包含一个Axis对象。标题为“外观匹配”的Axis对象包含4个line类型的对象。这些对象表示报告的、估计的(nlinfit)、估计的(fminunc)、实验的。

绘制参数值相对于报告值的变化。

图形fitResults=[gastroFitResults(1).参数估计值.估计值...胃镜检查结果(2)。参数估计。估计];% kmax、kmin和kabs的初始值来自模型。gastroFitInitValues=[get(sbioselect)(m1,'姓名'“kmax”),'价值')获取(sbioselect)(m1,'姓名'“kmin”),'价值')获取(sbioselect)(m1,'姓名'“出租车”),'价值') gastroFitEst(4)。InitialValue];relFitChange = fitResults ./ [gastroFitInitValues gastroFitInitValues] - 1;酒吧(relFitChange);甘氨胆酸ax =;斧子。XTickLabel = {gastroFitEst.Name};ylabel (“估计值的相对变化”);头衔(“比较报告的和估计的胃肠道参数值”);传奇({“nlinfit”“fminunc”},“位置”'北'

图中包含一个轴对象。具有标题比较报告和估计的胃肠道参数值的轴对象包含2型栏的2个对象。这些对象代表nlinfit,fminunc。

请注意,如果膳食大小(剂量)明显大于报告的参数kmax显著大于报告,并且kabs.小于报道。

肌肉和脂肪组织葡萄糖利用模型的拟合

肌肉和脂肪组织模型表示葡萄糖在体内是如何被利用的。这个子系统的“输入”是血浆中的胰岛素浓度(血浆Ins浓缩的)内源性葡萄糖生成(谷氨酸产物)和葡萄糖出现率(Glu出现率).“输出”是血浆中的葡萄糖浓度(等离子体glu粗)葡萄糖利用率(glu ilil.).

因为输入是时间的函数,所以需要将其实现为强制函数血浆Ins浓缩的谷氨酸产物,Glu出现率通过重复赋值来控制,这些赋值调用函数对所报告的实验值进行线性插值。当使用这些函数来控制物种或参数时,必须使用于设置其值的任何其他规则处于非活动状态。为了方便选择这些规则,规则Name属性包含有意义的名称。

%为“输入”创建强制函数:%血浆胰岛素PlasmaInsRule=sbioselect(m1,'姓名'“等离子体浓度定义”);PlasmaInsForcingFcn = sbioselect (m1,'姓名'“等离子体Ins凝聚强迫函数”
plasmainsforcingfcn =素质规则阵列索引:ruletype:规则:1重复分配[血浆INS chec] = [picomole每升] *血浆(时间/ [一小时])
PlasmaInsRule.Active=false;PlasmaInsForcingFcn.Active=true;内源性葡萄糖生成% (Glu Prod)GluProdRule = sbioselect (m1,'姓名'“Glu产品定义”);GluProdForcingFcn = sbioselect (m1,'姓名''glu prod forcing功能'
GluProdForcingFcn=SimBiology规则数组索引:规则类型:规则:1重复分配[Glu-Prod]=[毫克/分钟]*内源性葡萄糖生产(时间/[一小时])
GluProdRule。积极= false;GluProdForcingFcn。积极= true;葡萄糖出现率(Glu出现率)GluRateRule = sbioselect (m1,'姓名''glu出现率定义');GluRateForcingFcn = sbioselect (m1,'姓名'“Glu出现率强制函数”
GluRateForcingFcn = SimBiology规则数组索引:规则类型:规则:1 repeatedAssignment [Glu Appear Rate] =[毫克每分钟]* glucseappear Rate(time/[1小时])
gluraterule.active = false;glurateforcingfcn.active = true;%用初始参数值进行模拟muscleInitSim = sbiosimulate (m1);%确定哪些模型组件对应于观察到的数据变量。muscleFitObs = {'[Plasma GluConc] = PlasmaGluConc'...'[Glu Util] = Glu '};%估计以下参数的值:muscleFitEst = estimatedInfo ({“[血浆体积(Glu)]”“k1”“k2”...“Vm0”“Vmx”“公里”“p2U”});%确保参数估计值在估计过程中始终为正值%在所有参数上使用日志转换。[musclefitest.transform] =交易('日志');%拟合数据,在每次迭代时显示输出[musclefitsults,muscleFitSim]=sbiofit(m1,fitData,...musclefitobs,musclefitest,[],“nlinfit”, fitOptions);
标准规范SSE梯度的迭代步骤  ----------------------------------------------------------- 0 3 2 1 1085.44 39017.5 0.610029 658.482 28190.2 0.49956 2181.52 428.941 8399.83 0.409971 315.959 10289 0.219481 - 5 7 6 288.552 4888.73 0.0894927 285.953 5219.43 0.00834476 269.237 2105.71 0.0475673 3779.5 260.906 261.296 3015.47 0.0736442 9。80.0221389 10 258.052 3092.32 0.0152296 11 249.589 426.223 0.0149145 12 249.014 1801.05 0.0336886 13 247.493 540.53 0.0107311 14 247.46 817.181 0.00128719 15 247.373 884.727 0.00266643 16 247.369 2796.38 0.000966967 17 247.366 554.204 0.000119328 18 247.364 913.918 5.32739e-05 19 247.364 1170.12 1.4102e-17终止:当前步骤的相对规范小于OPTIONS。TolX

绘制参数值相对于报告值的变化。

图;msclefitinitvalues = [get(sbioselect(m1,'姓名''等离子体体积(glu)'),'价值')获取(sbioselect)(m1,'姓名'“k1”),'价值')获取(sbioselect)(m1,'姓名'“k2”),'价值')获取(sbioselect)(m1,'姓名'“Vm0”),'价值')获取(sbioselect)(m1,'姓名'“Vmx”),'价值')获取(sbioselect)(m1,'姓名'“公里”),'价值')获取(sbioselect)(m1,'姓名'“p2U”),'价值')];bar(musclefiteresults.ParameterEstimates.Estimate./muscleFitInitValues-1);ax=gca;ax.XTickLabel={muscleFitEst.Name};ylabel(“估计值的相对变化”);头衔(“比较报告和估计的葡萄糖参数值”);

图中包含一个轴对象。标题为“比较报告和估计的葡萄糖参数值”的axis对象包含一个类型为bar的对象。

清理对模型的更改。

PlasmaInsRule。积极= true;GluProdRule。积极= true;GluRateRule。积极= true;PlasmaInsForcingFcn。积极= false;GluProdForcingFcn。积极= false;GluRateForcingFcn。积极= false;

比较拟合前后的模拟结果

肌肉= selectbyname([muscleinitsim musclefitsim],...{“血浆葡萄糖浓度”“Glu Util”});图;绘图(muscleSims(1).时间,muscleSims(1).数据(:,1),' - '...肌肉ims(2).时间,肌肉ims(2).数据(:,1),“——”...fitData.Time,fitData.Plasmaglucon,“x”);Xlabel(‘时间(小时)’);ylabel (‘mg/dl’);传奇(“初始(模拟)”'估计(模拟)'“实验性”);头衔(“血浆葡萄糖配合”);

图中包含一个轴对象。具有标题等离子体葡萄糖配合的轴对象包含3个类型的线。这些对象代表初始(模拟),估计(仿真),实验。

图;情节(muscleSims(1)。时间,muscleSims (1) . data (:, 2),' - '...肌肉ims(2).时间,肌肉ims(2).数据(:,2),“——”...fitData.Time,fitData.GluUtil,“x”);Xlabel(‘时间(小时)’);ylabel (毫克/分钟的);传奇(“初始(模拟)”'估计(模拟)'“实验性”);头衔(“葡萄糖利用适合”);

图中包含一个轴对象。标题为Glucose Utilization Fit的轴对象包含3个类型为line的对象。这些对象代表初始(模拟),估计(仿真),实验。

请注意,显著增加某些参数,例如VMX.,允许更好地适合晚期血浆葡萄糖浓度。

清理

恢复设置的警告。

警告(warnSettings);

结论

SimBiology包含多个功能,有助于实施和模拟葡萄糖-胰岛素系统的复杂模型。反应、事件和规则提供了描述系统动力学的自然方式。单位转换允许以方便的单位指定物种和参数,并确保尺寸一致性剂量对象是描述模型重复输入的简单方法,如本例中的每日膳食计划。SimBiology还为模拟和参数估计等分析任务提供内置支持。金宝app