但血糖-胰岛素响应模拟
这个例子展示了如何模拟和分析模型在SimBiology®使用生理基础但血糖-胰岛素系统在正常和糖尿病模型的人类。
这个例子需要统计和机器学习工具箱™和优化工具箱™。
引用
餐但血糖-胰岛素系统的仿真模型。c . Dalla男人R.A. Rizza, Cobelli。IEEE生物医学工程(2007)54 (10),1740 - 1749。
口服葡萄糖吸收的系统模型:对黄金标准数据验证。c . Dalla男人,m·卡米尔和c Cobelli。IEEE生物医学工程(2006)53 (12),2472 - 2478。
的目标是
实现一个SimBiology但血糖-胰岛素响应模型。
但血糖-胰岛素反应模拟一个或多个餐正常和受损(糖尿病)科目。
执行参数估计使用
sbiofit
强制函数策略。
背景
在2007年出版,Dalla男子等人开发了一个模型为人类glucose-insulin餐后的反应。该模型利用常微分方程描述的动态系统。但血糖-胰岛素反应作者使用他们的模型来模拟一个或多个餐后,正常人体和人体各种胰岛素缺陷。障碍被表示为替代组参数值和初始条件。
我们实现了SimBiology模型,m1
由:
翻译模型方程Dalla et al。(2007)反应,规则,和事件。
组织模型转换为两个隔间,一个用于含有葡萄糖相关物种和反应(命名
葡萄糖的外表
),一个用于insulin-related物种和反应(命名胰岛素分泌
)。使用参数值和初始条件的模型方程,从表1和图1。
包括胃排空率的方程提出了Dalla et al。(2006)。
设置所有物种的单位、隔间和参数所指定的Dalla男人et al。(2007),它允许使用单位转换SimBiology模型模拟。(注意,SimBiology还支持通过设置他们的无量纲万博1manbetx参数的使用
ValueUnits
财产无量纲的
)。设置配置设置
TimeUnits
来小时
,因为在7或24小时进行了模拟。使用1公斤体重改变物种的基础和参数规范化的体重在原始模型。这样做使物种单位在数量或浓度,根据SimBiology。
我们代表了胰岛素缺陷SimBiology对象模型变体使用以下名称:
2型糖尿病
低胰岛素敏感性
高β细胞反应性
低β细胞反应性
高胰岛素敏感性
我们代表了餐SimBiology模型剂量对象:
一个剂量名叫
一顿简单的饭菜
代表一个单一的一餐78克葡萄糖的一个模拟世界中。一个剂量名叫
日常生活
代表一天的饭菜,相对于模拟开始在午夜:早餐是45克葡萄糖在8小时的模拟时间(上午8点),午餐70克葡萄糖12小时(中午),和晚餐70克葡萄糖在20小时(8点)。
SimBiology模型图如下所示:
设置
加载模型。
sbioloadproject (“insulindemo”,“m1”)
抑制一个信息发出警告,在模拟。
warnSettings =警告(“关闭”,“SimBiology: DimAnalysisNotDone_MatlabFcn_Dimensionless”);
但血糖-胰岛素响应模拟正常的话题
选择一顿简单的饭菜
剂量对象并显示其属性。
mealDose = sbioselect (m1,“名字”,“一餐”);get (mealDose)
ans =结构体字段:数量:78区间:0速度:0 RepeatCount: 0开始时间:0活跃:0 AmountUnits:“克”DurationParameterName:“EventMode:“停止”LagParameterName:“RateUnits:“TargetName:“剂量”TimeUnits:“小时”的名字:“一餐”父:[1 x1 SimBiology。模型)指出:“标签:“类型:“repeatdose”用户数据:[]
模拟了7小时。
configset = getconfigset (m1,“活跃”);configset。StopTime=7;
(显示仿真时间单位StopTime
单位)。
configset.TimeUnits
ans =“小时”
模拟一个餐正常的话题。
configset normalMealSim = sbiosimulate (m1, [], mealDose);
但血糖-胰岛素响应模拟为2型糖尿病
选择2型糖尿病的一种变体,显示其属性。
diabeticVar = sbioselect (m1,“名字”,“2型糖尿病”)
diabeticVar = SimBiology变体- 2型糖尿病(不活跃)ContentIndex:类型:名称:房地产:价值:1参数等离子体体积……价值1.49 - 2参数k1值.042 3参数k2值.071 4参数等离子体体积……值.04点5参数m1值.379 6参数m2值.673 7参数m4值.269 m6 8参数m5值.0526 9参数值.8118 10参数肝Extrac……价值。6 11参数kmax值.0465 12参数kmin值.0076 13参数出租车值0 14参数kgri值.0465 15 16参数值参数f值。9 6 e-05 17参数b值.68点18 19参数d值参数c值.00023 .09点20参数kp1值3.09 21参数kp2值.0007 22参数kp3值.005 23参数kp4值.0786 24参数ki值.0066 25参数(Ins印第安纳Glu U…价值1.0 26参数Vm0值4.65 27参数Vmx值.034 28参数p2U 29公里价值466.21参数值.084 30参数K值0 31参数α值.013 32参数β值0。33参数γ值5 34参数ke1值.0007 35 36参数基础等离子体参数ke2值269.0 G……值164.18 37参数基础等离子体我…价值54.81
模拟一个2型糖尿病餐。
diabeticMealSim = sbiosimulate (m1, configset、diabeticVar mealDose);
比较结果的最重要的输出模拟。
血浆葡萄糖(物种
等离子体Glu浓缩的
)血浆胰岛素(物种
血浆Ins浓缩的
)内源性葡萄糖生产(参数
Glu刺激
)葡萄糖的外观(参数
Glu出现率
)葡萄糖利用率(参数
Glu跑龙套
)胰岛素分泌(参数
Ins Secr
)
outputNames = {“等离子Glu浓缩”,“血浆Ins浓缩的”,“Glu刺激”,…“Glu出现率”,“Glu Util”,“Ins Secr”};图;为i = 1:元素个数(outputNames)次要情节(2、3、我);[tNormal, yNormal] = normalMealSim.selectbyname (outputNames{我});[tDiabetic, yDiabetic] = diabeticMealSim.selectbyname (outputNames{我});情节(tNormal yNormal,“- - -”,…tDiabetic yDiabetic,“——”);%注释数据outputParam = sbioselect (m1,“名字”我,outputNames {});标题(outputNames{我});包含(的时间(小时));如果比较字符串(outputParam.Type“参数”)ylabel (outputParam.ValueUnits);其他的ylabel (outputParam.InitialAmountUnits);结束xlim ([0 7]);%添加传奇如果我= = 3({传奇“正常”,“糖尿病”},“位置”,“最佳”);结束结束
注意血糖和胰岛素的含量远远高于等离子体,以及葡萄糖利用率和胰岛素分泌的长时间的持续时间。
模拟一天的三餐正常的话题
设置模拟StopTime
24小时。
configset。StopTime=24;
选择每日剂量。
dayDose = sbioselect (m1,“名字”,“日常生活”);
模拟三餐正常的话题。
configset normalDaySim = sbiosimulate (m1, [], dayDose);
模拟一天的三餐受损的科目
模拟以下缺陷的组合:
障碍1:低胰岛素敏感性
障碍2:损伤1β细胞反应性高
障碍三:低β细胞的反应性
损伤4:损伤3高胰岛素敏感性
存储单元阵列中的障碍。
impairVars {1} = sbioselect (m1,“名字”,“低胰岛素敏感性”);(impairVars impairVars {2} = {1},…sbioselect (m1,“名字”,“高β细胞反应性”));impairVars {3} = sbioselect (m1,“名字”,“低β细胞反应性”);(impairVars impairVars {4} = {3},…sbioselect (m1,“名字”,“高胰岛素敏感性”));
模拟每个障碍。
为i = 1:4 impairSims (i) = sbiosimulate (m1, configset impairVars {}, dayDose);结束
比较血糖和血浆胰岛素的结果。
图;outputNames = {“等离子Glu浓缩”,“血浆Ins浓缩的”};legendLabels = {{“正常”},…{“ins =β\ ',“ins +β\”},…{“β= Ins - \”,“+ Ins -β\”}};yLimits = (80 240;0 500];为i = 1:元素个数(outputNames) [tNormal yNormal] = selectbyname (normalDaySim, outputNames{我});[tImpair, yImpair] = selectbyname (impairSims outputNames{我});%绘制正常次要情节(2、3、3 *我2);情节(tNormal yNormal,“b -”);xlim (24 [0]);ylim (yLimits(我,:));包含(的时间(小时));传奇(legendLabels {1},“位置”,“西北”);%的阴谋低胰岛素次要情节(2、3、3张*);情节(tImpair {1}, yImpair {1},“g——”,tImpair {2}, yImpair {2},“:”);xlim (24 [0]);ylim (yLimits(我,:));包含(的时间(小时));传奇(legendLabels {2},“位置”,“西北”);标题(outputNames{我});%的阴谋低β次要情节(2、3、3 *我);情节(tImpair {3}, yImpair {3},c -。,tImpair {4}, yImpair {4},“m -”);xlim (24 [0]);ylim (yLimits(我,:));包含(的时间(小时));传奇(legendLabels {3},“位置”,“西北”);结束
请注意,要么低胰岛素敏感性(绿色虚线, )或低β细胞敏感性(dashed-dotted青色线, )导致增加和延长血浆葡萄糖浓度(上面一行的情节)。低灵敏度的一个系统可以部分地补偿由高灵敏度在另一个系统。例如,低胰岛素敏感性和高β细胞敏感性(红色虚线表示 )的结果相对正常血糖浓度(上面一行的情节)。然而,在这种情况下,导致血浆胰岛素浓度非常高(底部排块)。
参数估计方法
而不是同时为整个模型估计参数,作者对不同子系统执行参数估计使用强制函数模型的策略。这种方法需要额外的实验数据的“输入”子模型。在拟合过程中,输入数据确定的动态输入的物种。(完整的模型,确定输入的动态微分方程。)SimBiology而言,您可以实现强制函数作为重复分配规则,控制一个物种或参数的值作为模型的输入为一个子系统。在下面几节中,我们使用的参数拟合功能SimBiology完善作者的报告参数值。
拟合葡萄糖的胃肠道模型外观使用nlinfit
胃肠道模型表示如何在一顿饭是葡萄糖运输通过胃、肠道,肠道,然后吸收等离子体。这个子系统的输入是葡萄糖的量在一顿饭,和输出是血浆中葡萄糖的生成速率。然而,我们也估计这顿饭大小自价值报告的作者不一致的参数和仿真结果。因为这个输入只出现在模拟的开始,不需要强制函数。
这个函数sbiofit
万博1manbetx支持SimBiology模型中参数的估计从MATLAB™使用几种不同的算法,统计和机器学习的工具箱,优化工具箱,全局优化工具箱。首先,使用统计和机器学习的工具箱函数估计的参数nlinfit
。
%加载实验数据fitData = groupedData (readtable (“GlucoseData.csv”,“分隔符”,”、“));%设置单位的数据fitData.Properties。VariableUnits = {…“小时”,…%的时间单位毫克/分钟的,…% GluRate单位毫克/分升的,…% PlasmaGluConc单位毫克/分钟的,…% GluUtil单位};%确定哪些模型组件对应于观测数据变量。gastroFitObs =(Glu出现率)= GluRate ';%的价值估计以下参数:gastroFitEst = estimatedInfo ({“kmax”,“kmin”,“出租车”,“剂量”});%保证参数估计时总是积极的评估%使用对数变换参数。[gastroFitEst。变换]=交易(“日志”);%设置初始剂量的估算报告餐剂量。的%的初步估计将从参数值%的模型。gastroFitEst (4)。我nitialValue = mealDose.Amount;%生成仿真数据与初始参数估计configset。StopTime=7; gastroInitSim = sbiosimulate(m1, mealDose);使用| %合适数据nlinfit |,显示在每个迭代输出fitOptions = statset (“显示”,“通路”);[gastroFitResults, gastroFitSims] = sbiofit (m1, fitData…gastroFitObs gastroFitEst, [],“nlinfit”,fitOptions);
规范标准的迭代SSE梯度步- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 3 2 1 2.23537 22.9971 0.596828 1.65217 1.33015 0.107431 43.798 1.6491 0.0778864 0.0239157 4 5 1.64909 0.000586249 0.00224475 1.64909 0.0141494 0.000316238 6 7 1.64909 0.00971641 2.33353 1.64909 0.0139995 2.23854 e-05 e-05 8 1.64909 0.00786815 2.28944 e-05 9 10 1.64909 0.00541449 2.43141 1.64909 0.0098386 2.52605 e-05 e-07迭代终止:SSE不到OPTIONS.TolFun相对变化
拟合的数据使用fminunc
现在,使用优化工具箱函数的参数估计fminunc
。
%配合数据,绘制在每个迭代的目标函数fitOptions2 = optimoptions (“fminunc”,“PlotFcns”,@optimplotfval);[gastroFitResults (2), gastroFitSims (2)] = sbiofit (m1, fitData…gastroFitObs gastroFitEst, [],“fminunc”,fitOptions2);
比较前后的仿真拟合。
gastroSims = selectbyname ([gastroInitSim gastroFitSims),“Glu出现率”);图;情节(gastroSims (1)。时间,gastroSims (1)。数据,“- - -”,…gastroSims (2)。时间,gastroSims (2)。数据,“——”,…gastroSims (3)。时间,gastroSims (3)。数据,“-”。,…fitData。时间、fitData.GluRate“x”);包含(的时间(小时));ylabel (毫克/分钟的);传奇(“报告”,“估计(nlinfit)”,…“估计(fminunc)”,“实验”);标题(葡萄糖的外表适合的);
参数值的变化,相对于报道值。
图;.ParameterEstimates.Estimate fitResults = [gastroFitResults (1)…gastroFitResults (2) .ParameterEstimates.Estimate];%的初始值kmax kmin,出租车来自模型。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”},“位置”,“北”)
注意模型与实验数据的吻合更好如果餐大小(剂量
)明显大于报道,参数kmax
是明显大于报道,出租车
小于报道。
拟合的肌肉和脂肪组织模型葡萄糖利用率
肌肉和脂肪组织模型表示如何利用体内的葡萄糖。“输入”这个子系统血浆中胰岛素的浓度(血浆Ins浓缩的
)、内源性葡萄糖生产(Glu刺激
),葡萄糖的生成速率(Glu出现率
)。“输出”是血浆中葡萄糖的浓度(等离子体Glu浓缩的
)和葡萄糖的速度利用率(Glu跑龙套
)。
由于输入是时间的函数,他们需要实现为迫使功能。具体来说,的值血浆Ins浓缩的
,Glu刺激
,Glu出现率
由重复的作业控制,调用函数的线性插值报道实验值。当使用这些函数来控制一个物种或参数,你必须不活跃的其他规则,用于设置它的值。为了方便的选择这些规则,规则名称属性包含有意义的名称。
%为“输入”:创建迫使功能%血浆胰岛素PlasmaInsRule = sbioselect (m1,“名字”,“血浆Ins浓缩的定义”);PlasmaInsForcingFcn = sbioselect (m1,“名字”,“血浆Ins浓缩的强制函数”)
PlasmaInsForcingFcn = SimBiology规则数组索引:RuleType:规则:1 repeatedAssignment[血浆Ins浓缩的]=[皮摩尔每升]* PlasmaInsulin(时间/(一个小时))
PlasmaInsRule。积极= false;PlasmaInsForcingFcn。积极= true;%内源性葡萄糖生产(Glu刺激)GluProdRule = sbioselect (m1,“名字”,“Glu刺激定义”);GluProdForcingFcn = sbioselect (m1,“名字”,“Glu促使强制函数”)
GluProdForcingFcn = SimBiology规则数组索引:RuleType:规则:1 repeatedAssignment [Glu促使]=[毫克每分钟]* EndogenousGlucoseProduction(时间/(一个小时))
GluProdRule。积极= false;GluProdForcingFcn。积极= true;%葡萄糖的外观(Glu出现率)GluRateRule = sbioselect (m1,“名字”,Glu出现率定义的);GluRateForcingFcn = sbioselect (m1,“名字”,“Glu出现率强制函数”)
GluRateForcingFcn = SimBiology规则数组索引:RuleType:规则:1 repeatedAssignment (Glu出现率)=(毫克每分钟)* GlucoseAppearanceRate(时间/(一个小时))
GluRateRule。积极= false;GluRateForcingFcn。积极= true;%模拟的初始参数值muscleInitSim = sbiosimulate (m1);%确定哪些模型组件对应于观测数据变量。muscleFitObs = {(等离子体Glu浓缩的]= PlasmaGluConc ',…(Glu Util) = GluUtil '};%的价值估计以下参数:muscleFitEst = estimatedInfo ({“(等离子体体积(Glu))”,“k1”,“k2”,…“Vm0”,“Vmx”,“公里”,“p2U”});%保证参数估计时总是积极的评估%使用对数变换参数。[muscleFitEst。变换]=交易(“日志”);%配合数据,显示在每个迭代输出[muscleFitResults, muscleFitSim] = sbiofit (m1, fitData…muscleFitObs muscleFitEst, [],“nlinfit”,fitOptions);
规范标准的迭代SSE梯度步- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 3 2 1 699.121 16344.7 0.480334 426.31 13770.6 0.425703 2181.51 264.226 2415.86 0.351024 4 6 5 246.434 1870.42 0.0881693 244.478 1356.49 0.0109624 243.318 270.056 - 0.00941789 1121 240.756 242.955 609.78 0.0694774 8 9 10 240.75 916.641 0.000157475 240.704 1544.16 7.55918 0.0481101 e-05 13 11 12 240.435 787.678 0.00407475 240.312 693.831 0.00293102 240.131 1718.86 0.00869632 14 15 240.13 498.938 1.64921 240.13 258.705 1.58109 e-07 e-16迭代终止:当前步骤的相对标准小于OPTIONS.TolX
参数值的变化,相对于报道值。
图;muscleFitInitValues = [get (sbioselect (m1,“名字”,“等离子体体积(Glu)”),“价值”)得到(sbioselect (m1,“名字”,“k1”),“价值”)得到(sbioselect (m1,“名字”,“k2”),“价值”)得到(sbioselect (m1,“名字”,“Vm0”),“价值”)得到(sbioselect (m1,“名字”,“Vmx”),“价值”)得到(sbioselect (m1,“名字”,“公里”),“价值”)得到(sbioselect (m1,“名字”,“p2U”),“价值”));栏(muscleFitResults.ParameterEstimates。估计。/ muscleFitInitValues - 1);甘氨胆酸ax =;斧子。XTickLabel = {muscleFitEst.Name};ylabel (估计的相对变化值的);标题(比较报告和葡萄糖估计参数值);
清理对模型所做的变更。
PlasmaInsRule。积极= true;GluProdRule。积极= true;GluRateRule。积极= true;PlasmaInsForcingFcn。积极= false;GluProdForcingFcn。积极= false;GluRateForcingFcn。积极= false;
比较前后的仿真拟合
muscleSims = selectbyname ([muscleInitSim muscleFitSim),…{“等离子Glu浓缩”,“Glu Util”});图;情节(muscleSims (1)。时间,muscleSims (1) . data (: 1),“- - -”,…muscleSims (2)。时间,muscleSims (2) . data (: 1),“——”,…fitData。时间、fitData.PlasmaGluConc“x”);包含(的时间(小时));ylabel (“mg / dl”);传奇(“初始(模拟)”,“估计(模拟)”,“实验”);标题(“血浆葡萄糖配合”);
图;情节(muscleSims (1)。时间,muscleSims (1) . data (:, 2),“- - -”,…muscleSims (2)。时间,muscleSims (2) . data (:, 2),“——”,…fitData。时间、fitData.GluUtil“x”);包含(的时间(小时));ylabel (毫克/分钟的);传奇(“初始(模拟)”,“估计(模拟)”,“实验”);标题(葡萄糖利用合适的);
注意,显著增加一些参数,如Vmx
,允许一个更好的后期数据的血浆葡萄糖浓度。
清理
恢复设置的警告。
警告(warnSettings);
结论
SimBiology包含几个功能,方便的实现和仿真一个复杂但血糖-胰岛素系统模型。反应、事件和规则提供一个自然的方式来描述系统的动态。单位转换允许物种和参数中指定单位方便,保证了尺寸模型的一致性。剂量对象是一个简单的方法来描述重复输入一个模型,如每日餐安排在这个例子。SimBiology还提供内置支持分析仿真和参数估计等任务。万博1manbetx