I've been trying to implement the Sedaghat model for simulation of the insulin signaling pathway, as it is presented here, using python's GEKKO. The system modeled is the one without feedback and the model's equations and constants' values can be found in Appendix A. While the first 6 diagrams of my results seem to come out fine, the rest model states (x16-x21) seem a bit problematic (fig. 6,7 of the same paper used for comparison).
I have checked the equations and constant values, tried adding lower and upper bounds to the variables and experimented with the m.options.IMODE and m.options.NODES parameters, but these didn't seem to help.
Any piece of advice would be much appreciated.
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from gekko import GEKKO
def insulin_pathway_CM(insulin, time_interval):
m = GEKKO(remote=False)
m.time = np.linspace(0, time_interval-1, time_interval)
# initialization of variables
x1 = m.Param(value=insulin)
x2 = m.Var(9*1e-13)
x3 = m.Var()
x4 = m.Var()
x5 = m.Var()
x6 = m.Var(1e-13)
x7 = m.Var()
x8 = m.Var()
x9 = m.Var(1e-12)
x10 = m.Var()
x11 = m.Var(1e-13)
x12 = m.Var()
x13 = m.Var(0.0031)
x14 = m.Var(0.994)
x15 = m.Var(0.0029)
x16 = m.Var(1)
x17 = m.Var()
x18 = m.Var(1)
x19 = m.Var()
x20 = m.Var(0.96)
x21 = m.Var(0.04)
# initialization of constants
km1 = 0.2
k1 = 6*1e7
km2 = 100*km1
k2 = k1
km3 = km1
k3 = 2500
km4 = 0.003
k4 = km4/9
km4a = 2.1*1e-4
k4a = 2.1*1e-3
km5 = 1.67*1e-18
k5 = 10*km5 # simplification made after testing
# x6 seems to be above 1e-13 for all values of interest
k6 = 0.461
k7 = 4.16
km7 = (2.5/7.45)*k7
km8 = 10
k8 = km8 * (5/70.775) * 1e12
km9 = (94/3.1)*1.39
PI3K = 5*1e-15
k9basal = (0.31/99.4)*km9
k9 = m.Var()
m.Equation(k9 == (1.39 - k9basal)*(x12/PI3K) + k9basal)
km10 = 2.77
k10 = (3.1/2.9)*km10
km11 = 6.9314718
k11 = m.Var()
m.Equation(k11 == (0.1*km11)*(x13-0.31)/2.79)
km12 = 6.93147
k12 = m.Var()
m.Equation(k12 == (0.1*km12)*(x13-0.31)/2.79)
km13 = 0.167
k13 = (4/96)*km13
km14 = 0.001155
k14 = 96*km14
Effect = m.Var()
APequil = 100/11
m.Equation(Effect == (0.2*x17 + 0.8*x19)/APequil)
k13a = ((4/6) - (4/96))*km13*Effect
SHIP = 1
PTEN = 1
PTP = 1
IRp = 8.97*1e-13
# equations
m.Equation(x2.dt() == km1*x3 + km3*PTP*x5 - k1*x1*x2 + km4*x6 - k4*x2)
m.Equation(x3.dt() == k1*x1*x2 - km1*x3 - k3*x3)
m.Equation(x4.dt() == k2*x1*x5 -km2*x4 + km4a*x7 -k4a*x4)
m.Equation(x5.dt() == k3*x3 + km2*x4 - k2*x1*x5 - km3*PTP*x5 + km4a*x8 - k4a*x5)
m.Equation(x6.dt() == k5 - km5*x6 + k6*PTP*(x7 + x8) + k4*x2 - km4*x6)
m.Equation(x7.dt() == k4a*x4 - km4a*x7 - k6*PTP*x7)
m.Equation(x8.dt() == k4a*x5 - km4a*x8 - k6*PTP*x8)
m.Equation(x9.dt() == km7*PTP*x10 - k7*x9*(x4+x5)/IRp)
m.Equation(x10.dt() == k7*x9*(x4+x5)/IRp + km8*x12 - (km7*PTP + k8*x11)*x10)
m.Equation(x11.dt() == km8*x12 - k8*x10*x11)
m.Equation(x12.dt() == k8*x10*x11 - km8*x12)
m.Equation(x13.dt() == k9*x14 + k10*x15 - (km9*PTEN + km10*SHIP)*x13)
m.Equation(x14.dt() == km9*PTEN*x13 - k9*x14)
m.Equation(x15.dt() == km10*SHIP*x13 - k10*x15)
m.Equation(x16.dt() == km11*x17 - k11*x16)
m.Equation(x17.dt() == k11*x16 - km11*x17)
m.Equation(x18.dt() == km12*x19 - k12*x18)
m.Equation(x19.dt() == k12*x18 - km12*x19)
m.Equation(x20.dt() == km13*x21 - (k13 + k13a)*x20 + k14 - km14*x20)
m.Equation(x21.dt() == (k13 + k13a)*x20 - km13*x21)
m.options.IMODE = 7
m.options.OTOL = 1e-8
m.options.RTOL = 1e-8
m.options.NODES = 3
m.solve(disp=False)
# plotting
x45 = []
for i in range(len(x4.value)):
x45.append(x4[i]+x5[i])
fig, axs = plt.subplots(4, 2, figsize=(20, 20))
axs[0, 0].set_title('Free surface receptors (x2)')
axs[0, 0].plot(m.time, x2)
axs[0, 1].set_title('Once and twice bound phosphorylated receptors (x4:orange, x5:green)')
axs[0, 1].plot(m.time, x4, 'tab:orange')
axs[0, 1].plot(m.time, x5, 'tab:green')
axs[1, 0].set_title('Surface phosphorylated receptors (x4 + x5)')
axs[1, 0].plot(m.time, x45, 'tab:red')
axs[1, 1].set_title('Unphosphorylated and tyrosine phosphorylated IRS-1 (x9:orange, x10:green)')
axs[1, 1].plot(m.time, x9, 'tab:orange')
axs[1, 1].plot(m.time, x10, 'tab:green')
axs[2, 0].set_title('Activated PI 3-kinase (x12)')
axs[2, 0].plot(m.time, x12, 'tab:orange')
axs[2, 1].set_title('PI(3,4,5)P3 and PI(3,4,5)P2 (x13:orange, x15:green)')
axs[2, 1].plot(m.time, x13, 'tab:orange')
axs[2, 1].plot(m.time, x15, 'tab:green')
axs[3, 0].set_title('Activated PKC-ζ (x19)')
axs[3, 0].plot(m.time, x19, 'tab:red')
axs[3, 1].set_title('Percentage of cell surface GLUT4 (x21)')
axs[3, 1].plot(m.time, x21, 'tab:cyan')
return
# input as in the paper
time_interval = 60
insulin = np.zeros(60)
insulin[:15] = 1e-7
insulin_pathway_CM(insulin, time_interval)

