In [1]:
import os, tempfile
import logging
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
In [2]:
from ionchannelABC import theoretical_population_size
from ionchannelABC import IonChannelDistance, EfficientMultivariateNormalTransition, IonChannelAcceptor
from ionchannelABC.experiment import setup
from ionchannelABC.visualization import plot_sim_results, plot_kde_matrix_custom
import myokit
In [3]:
from pyabc import Distribution, RV, History, ABCSMC
from pyabc.epsilon import MedianEpsilon
from pyabc.sampler import MulticoreEvalParallelSampler, SingleCoreSampler
from pyabc.populationstrategy import ConstantPopulationSize
In [6]:
from experiments.isus_wang import (wang_act_and_kin, # contains both steady-state and time constant
wang_inact)
from experiments.isus_courtemanche import (courtemanche_inact_kin,
courtemanche_deact)
In [7]:
modelfile = 'models/courtemanche_isus.mmt'
Plot steady-state and tau functions of original model
In [8]:
from ionchannelABC.visualization import plot_variables
In [9]:
sns.set_context('talk')
V = np.arange(-100, 50, 0.01)
cou_par_map = {'ri': 'isus.a_inf',
'si': 'isus.i_inf',
'rt': 'isus.tau_a',
'st': 'isus.tau_i'}
f, ax = plot_variables(V, cou_par_map, modelfile, figshape=(2,2))
Combine model and experiments to produce:
In [10]:
observations, model, summary_statistics = setup(modelfile,
wang_act_and_kin,
courtemanche_deact)
In [11]:
assert len(observations)==len(summary_statistics(model({})))
In [12]:
g = plot_sim_results(modelfile,
wang_act_and_kin,
courtemanche_deact)
In [13]:
limits = {'log_isus.r1': (0, 2),
'isus.r2': (-100, 100),
'isus.r3': (1e-7, 50),
'isus.p1': (-100, 100),
'isus.p2': (1e-7, 50),
'log_isus.p3': (-3, 2),
'isus.p4': (-100, 100),
'isus.p5': (1e-7, 50),
'isus.p6': (-100, 100),
'isus.p7': (1e-7, 50),
'log_isus.p8': (-3, 2),
'isus.p9': (-100, 100),
'isus.p10': (1e-7, 50)}
prior = Distribution(**{key: RV("uniform", a, b - a)
for key, (a,b) in limits.items()})
In [14]:
# Test this works correctly with set-up functions
assert len(observations) == len(summary_statistics(model(prior.rvs())))
In [12]:
db_path = ("sqlite:///" + os.path.join(tempfile.gettempdir(), "courtemanche_isus_agate_original.db"))
In [13]:
logging.basicConfig()
abc_logger = logging.getLogger('ABC')
abc_logger.setLevel(logging.DEBUG)
eps_logger = logging.getLogger('Epsilon')
eps_logger.setLevel(logging.DEBUG)
In [14]:
pop_size = theoretical_population_size(2, len(limits))
print("Theoretical minimum population size is {} particles".format(pop_size))
In [15]:
abc = ABCSMC(models=model,
parameter_priors=prior,
distance_function=IonChannelDistance(
exp_id=list(observations.exp_id),
variance=list(observations.variance),
delta=0.05),
population_size=ConstantPopulationSize(2000),
summary_statistics=summary_statistics,
transitions=EfficientMultivariateNormalTransition(),
eps=MedianEpsilon(initial_epsilon=100),
sampler=MulticoreEvalParallelSampler(n_procs=16),
acceptor=IonChannelAcceptor())
In [16]:
obs = observations.to_dict()['y']
obs = {str(k): v for k, v in obs.items()}
In [17]:
abc_id = abc.new(db_path, obs)
In [ ]:
history = abc.run(minimum_epsilon=0., max_nr_populations=100, min_acceptance_rate=0.01)
In [15]:
history = History('sqlite:///results/courtemanche/isus/original/courtemanche_isus_agate_original.db')
In [16]:
df, w = history.get_distribution()
In [17]:
df.describe()
Out[17]:
In [18]:
sns.set_context('poster')
mpl.rcParams['font.size'] = 14
mpl.rcParams['legend.fontsize'] = 14
g = plot_sim_results(modelfile,
wang_act_and_kin,
courtemanche_deact,
df=df, w=w)
plt.tight_layout()
In [19]:
import pandas as pd
N = 100
cou_par_samples = df.sample(n=N, weights=w, replace=True)
cou_par_samples = cou_par_samples.set_index([pd.Index(range(N))])
cou_par_samples = cou_par_samples.to_dict(orient='records')
In [20]:
sns.set_context('talk')
mpl.rcParams['font.size'] = 14
mpl.rcParams['legend.fontsize'] = 14
f, ax = plot_variables(V, cou_par_map,
'models/courtemanche_isus.mmt',
[cou_par_samples],
figshape=(2,2))
plt.tight_layout()
In [21]:
m,_,_ = myokit.load(modelfile)
In [22]:
originals = {}
for name in limits.keys():
if name.startswith("log"):
name_ = name[4:]
else:
name_ = name
val = m.value(name_)
if name.startswith("log"):
val_ = np.log10(val)
else:
val_ = val
originals[name] = val_
In [23]:
sns.set_context('paper')
g = plot_kde_matrix_custom(df, w, limits=limits, refval=originals)
plt.tight_layout()
In [24]:
observations, model, summary_statistics = setup(modelfile,
wang_inact,
courtemanche_inact_kin)
In [25]:
assert len(observations)==len(summary_statistics(model({})))
In [26]:
g = plot_sim_results(modelfile,
wang_inact,
courtemanche_inact_kin)
In [27]:
limits = {'isus.q1': (-200, 0),
'isus.q2': (1e-7, 50),
'log_isus.q3': (-1, 4),
'isus.q4': (-200, 0),
'isus.q5': (1e-7, 50),
'isus.q6': (-200, 0),
'isus.q7': (1e-7, 50)}
prior = Distribution(**{key: RV("uniform", a, b - a)
for key, (a,b) in limits.items()})
In [28]:
# Test this works correctly with set-up functions
assert len(observations) == len(summary_statistics(model(prior.rvs())))
In [32]:
db_path = ("sqlite:///" + os.path.join(tempfile.gettempdir(), "courtemanche_isus_igate_original.db"))
In [33]:
pop_size = theoretical_population_size(2, len(limits))
print("Theoretical minimum population size is {} particles".format(pop_size))
In [35]:
abc = ABCSMC(models=model,
parameter_priors=prior,
distance_function=IonChannelDistance(
exp_id=list(observations.exp_id),
variance=list(observations.variance),
delta=0.05),
population_size=ConstantPopulationSize(1000),
summary_statistics=summary_statistics,
transitions=EfficientMultivariateNormalTransition(),
eps=MedianEpsilon(initial_epsilon=100),
sampler=MulticoreEvalParallelSampler(n_procs=16),
acceptor=IonChannelAcceptor())
In [36]:
obs = observations.to_dict()['y']
obs = {str(k): v for k, v in obs.items()}
In [37]:
abc_id = abc.new(db_path, obs)
In [ ]:
history = abc.run(minimum_epsilon=0., max_nr_populations=100, min_acceptance_rate=0.01)
In [29]:
history = History('sqlite:///results/courtemanche/isus/original/courtemanche_isus_igate_original.db')
In [30]:
df, w = history.get_distribution()
In [31]:
df.describe()
Out[31]:
In [32]:
sns.set_context('poster')
mpl.rcParams['font.size'] = 14
mpl.rcParams['legend.fontsize'] = 14
g = plot_sim_results(modelfile,
wang_inact,
courtemanche_inact_kin,
df=df, w=w)
plt.tight_layout()
In [33]:
N = 100
cou_par_samples = df.sample(n=N, weights=w, replace=True)
cou_par_samples = cou_par_samples.set_index([pd.Index(range(N))])
cou_par_samples = cou_par_samples.to_dict(orient='records')
In [34]:
sns.set_context('talk')
mpl.rcParams['font.size'] = 14
mpl.rcParams['legend.fontsize'] = 14
f, ax = plot_variables(V, cou_par_map,
'models/courtemanche_isus.mmt',
[cou_par_samples],
figshape=(2,2))
plt.tight_layout()
In [35]:
m,_,_ = myokit.load(modelfile)
In [36]:
originals = {}
for name in limits.keys():
if name.startswith("log"):
name_ = name[4:]
else:
name_ = name
val = m.value(name_)
if name.startswith("log"):
val_ = np.log10(val)
else:
val_ = val
originals[name] = val_
In [37]:
sns.set_context('paper')
g = plot_kde_matrix_custom(df, w, limits=limits, refval=originals)
plt.tight_layout()
In [ ]: