In [1]:
# PyABC imports
from pyabc import (ABCSMC, Distribution, RV,
History, MedianEpsilon)
from pyabc.populationstrategy import ConstantPopulationSize, AdaptivePopulationSize
from pyabc.epsilon import MedianEpsilon
from pyabc.sampler import MulticoreEvalParallelSampler
In [2]:
# Custom imports
from ionchannelABC import (ion_channel_sum_stats_calculator,
IonChannelAcceptor,
IonChannelDistance,
EfficientMultivariateNormalTransition,
calculate_parameter_sensitivity,
plot_parameter_sensitivity,
plot_regression_fit,
plot_distance_weights,
plot_sim_results,
plot_parameters_kde)
In [3]:
# Other necessary imports
import numpy as np
import subprocess
import pandas as pd
import io
import os
import tempfile
In [4]:
# Plotting imports
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
%config Inline.Backend.figure_format = 'retina'
In [5]:
from channels.ina_generic import ina as model
model.sample({})
Out[5]:
In [6]:
measurements = model.get_experiment_data()
obs = measurements.to_dict()['y']
exp = measurements.to_dict()['exp']
errs = measurements.to_dict()['errs']
In [7]:
limits = dict(g_Na=(0, 100),
Vhalf_m=(-100,100),
k_m=(0,50),
c_bm=(0,0.1),
c_am=(0,1),
Vmax_m=(-100,0),
sigma_m=(0,50),
Vhalf_h=(-100,0),
k_h=(-50,0),
c_bh=(0,0.1),
c_ah=(0,50),
Vmax_h=(-100,0),
sigma_h=(0,50),
c_bj=(0,10),
c_aj=(50,100),
Vmax_j=(-100,0),
sigma_j=(0,50))
prior = Distribution(**{key: RV("uniform", a, b - a)
for key, (a,b) in limits.items()})
In [8]:
parameters = ['ina.'+k for k in limits.keys()]
In [9]:
distance_fn=IonChannelDistance(
obs=obs,
exp_map=exp,
err_bars=errs,
err_th=0.1)
In [10]:
sns.set_context('talk')
g = plot_distance_weights(model, distance_fn)
g.savefig('results/ina-generic/dist_weights.pdf')
In [14]:
fitted, regression_fit, r2 = calculate_parameter_sensitivity(
model,
parameters,
distance_fn,
sigma=0.05,
n_samples=1000)
In [15]:
sns.set_context('talk')
grid1 = plot_parameter_sensitivity(fitted, plot_cutoff=0.05)
In [16]:
grid2 = plot_regression_fit(regression_fit, r2)
In [17]:
grid1.savefig('results/ina-generic/sensitivity.pdf')
grid2.savefig('results/ina-generic/sensitivity_fit.pdf')
In [32]:
# Finding insensitive parameters
cutoff = 0.05
fitted_pivot = fitted.pivot(index='param',columns='exp')
insensitive_params = fitted_pivot[(abs(fitted_pivot['beta'][0])<cutoff) & (abs(fitted_pivot['beta'][1])<cutoff) &
(abs(fitted_pivot['beta'][2])<cutoff) & (abs(fitted_pivot['beta'][3])<cutoff) &
(abs(fitted_pivot['beta'][4])<cutoff)].index.values
In [42]:
insensitive_params
Out[42]:
In [43]:
insensitive_params = np.delete(insensitive_params,5)
In [91]:
insensitive_params
Out[91]:
In [92]:
insensitive_limits = dict((k, limits[k[4:]]) for k in insensitive_params)
insensitive_prior = Distribution(**{key: RV("uniform", a, b - a)
for key, (a,b) in insensitive_limits.items()})
In [93]:
# Generate random samples for insensitive parameters
def generate_sample(insensitive_prior, n):
samples = [dict() for i in range(n)]
for i in range(n):
parameters = insensitive_prior.rvs()
sample = {key: value for key, value in parameters.items()}
samples[i].update(sample)
return samples
In [94]:
samples = generate_sample(insensitive_prior, 1000)
In [95]:
model.add_external_par_samples(samples)
In [96]:
limits = dict((k, limits[k]) for k in limits if 'ina.'+k not in insensitive_params)
In [97]:
limits
Out[97]:
In [9]:
prior = Distribution(**{key: RV("uniform", a, b - a)
for key, (a,b) in limits.items()})
In [20]:
db_path = ('sqlite:///' +
os.path.join(tempfile.gettempdir(), "hl-1_ina1250.db"))
print(db_path)
In [21]:
# Let's log all the sh!t
import logging
logging.basicConfig()
abc_logger = logging.getLogger('ABC')
abc_logger.setLevel(logging.DEBUG)
eps_logger = logging.getLogger('Epsilon')
eps_logger.setLevel(logging.DEBUG)
cv_logger = logging.getLogger('CV Estimation')
cv_logger.setLevel(logging.DEBUG)
In [22]:
from pyabc.populationstrategy import ConstantPopulationSize
In [23]:
abc = ABCSMC(models=model,
parameter_priors=prior,
distance_function=IonChannelDistance(
obs=obs,
exp_map=exp,
err_bars=errs,
err_th=0.1),
population_size=ConstantPopulationSize(1250),
#population_size=AdaptivePopulationSize(
# start_nr_particles=1000,
# mean_cv=0.2,
# max_population_size=1000,
# min_population_size=100),
summary_statistics=ion_channel_sum_stats_calculator,
transitions=EfficientMultivariateNormalTransition(),
eps=MedianEpsilon(),
sampler=MulticoreEvalParallelSampler(n_procs=12),
acceptor=IonChannelAcceptor())
In [24]:
abc_id = abc.new(db_path, obs)
In [ ]:
history = abc.run(minimum_epsilon=0.05, max_nr_populations=100, min_acceptance_rate=0.005)
In [26]:
history = [History('sqlite:////storage/hhecm/cellrotor/chouston/results/convergence/ina-generic/hl-1_ina50.db'),
History('sqlite:////storage/hhecm/cellrotor/chouston/results/convergence/ina-generic/hl-1_ina100.db'),
History('sqlite:////storage/hhecm/cellrotor/chouston/results/convergence/ina-generic/hl-1_ina500.db'),
History('sqlite:////storage/hhecm/cellrotor/chouston/results/convergence/ina-generic/hl-1_ina750.db'),
History('sqlite:////storage/hhecm/cellrotor/chouston/results/convergence/ina-generic/hl-1_ina1000.db'),
History('sqlite:////storage/hhecm/cellrotor/chouston/results/convergence/ina-generic/hl-1_ina1250.db')]
particle_num = [50,100,500,750,1000,1250]#,2000,5000]
In [27]:
n_samples=5000
th_samples = pd.DataFrame({})
for h, p in zip(history, particle_num):
h.id = len(h.all_runs())
df, w = h.get_distribution(m=0)
th = pd.DataFrame(df.sample(n=n_samples, weights=w, replace=True).to_dict(orient='records'))
th['particle_num'] = p
th_samples = th_samples.append(th)
In [28]:
th_samples = th_samples.melt(value_vars=th_samples.columns[:-1], id_vars=['particle_num'])
In [29]:
sns.set_context('talk')
grid = sns.relplot(x='particle_num',y='value',row='variable',data=th_samples,
kind='line',n_boot=5000,ci='sd',aspect=3,
facet_kws={'sharex': 'row',
'sharey': False})
In [ ]: