Sensitivity anaylsis (pysb.tools.sensitivity_analysis
)¶
-
class
pysb.tools.sensitivity_analysis.
InitialsSensitivity
(*args, **kwargs)[source]¶ Deprecated; use
PairwiseSensitivity
instead.
-
class
pysb.tools.sensitivity_analysis.
PairwiseSensitivity
(solver, values_to_sample, objective_function, observable, sens_type='initials', sample_list=None)[source]¶ Pairwise sensitivity analysis of model parameters
This class calculates the sensitivity of a specified model Observable to changes in pairs of initial species concentrations. The results are stored in matrices described in Attributes.
Warning
The interface for this class is considered experimental and may change without warning as PySB is updated.
Parameters: - solver : pysb.simulator.Simulator
Simulator instance used to perform models. Must be initialized with tspan argument set.
- values_to_sample : vector_like
Values to sample for each initial concentration of the model.parameters values.
- objective_function : function
A function that returns a scalar value. Used to calculate fraction of changed that is used for calculating sensitivity. See Example.
- observable : str
Observable name used in the objective_function.
- sens_type: {‘params’, ‘initials’, ‘all’}
Type of sensitivity analysis to perform.
- sample_list: list
List of model pysb.Parameters names to be used.
References
- Harris, L.A., Nobile, M.S., Pino, J.C., Lubbock, A.L.R., Besozzi, D., Mauri, G., Cazzaniga, P., and Lopez, C.F. 2017. GPU-powered model analysis with PySB/cupSODA. Bioinformatics 33, pp.3492-3494. https://academic.oup.com/bioinformatics/article/33/21/3492/3896987
Examples
Sensitivity analysis on the Tyson cell cycle model
>>> from pysb.examples.tyson_oscillator import model >>> import numpy as np >>> from pysb.simulator.scipyode import ScipyOdeSimulator >>> np.set_printoptions(precision=4, suppress=True) >>> tspan=np.linspace(0, 200, 201) >>> observable = 'Y3' >>> values_to_sample = [.8, 1.2] >>> def obj_func_cell_cycle(out): ... timestep = tspan[:-1] ... y = out[:-1] - out[1:] ... freq = 0 ... local_times = [] ... prev = y[0] ... for n in range(1, len(y)): ... if y[n] > 0 > prev: ... local_times.append(timestep[n]) ... freq += 1 ... prev = y[n] ... local_times = np.array(local_times) ... local_freq = np.average(local_times)/len(local_times)*2 ... return local_freq >>> solver = ScipyOdeSimulator(model, tspan, integrator='lsoda', integrator_options={'atol' : 1e-8, 'rtol' : 1e-8, 'mxstep' :20000}) >>> sens = PairwiseSensitivity( values_to_sample=values_to_sample, observable=observable, objective_function=obj_func_cell_cycle, solver=solver ) >>> print(sens.b_matrix) [[((0.8, 'cdc0'), (0.8, 'cdc0')) ((0.8, 'cdc0'), (1.2, 'cdc0')) ((0.8, 'cdc0'), (0.8, 'cyc0')) ((0.8, 'cdc0'), (1.2, 'cyc0'))] [((1.2, 'cdc0'), (0.8, 'cdc0')) ((1.2, 'cdc0'), (1.2, 'cdc0')) ((1.2, 'cdc0'), (0.8, 'cyc0')) ((1.2, 'cdc0'), (1.2, 'cyc0'))] [((0.8, 'cyc0'), (0.8, 'cdc0')) ((0.8, 'cyc0'), (1.2, 'cdc0')) ((0.8, 'cyc0'), (0.8, 'cyc0')) ((0.8, 'cyc0'), (1.2, 'cyc0'))] [((1.2, 'cyc0'), (0.8, 'cdc0')) ((1.2, 'cyc0'), (1.2, 'cdc0')) ((1.2, 'cyc0'), (0.8, 'cyc0')) ((1.2, 'cyc0'), (1.2, 'cyc0'))]] >>> sens.run() >>> print(sens.p_matrix)#doctest: +NORMALIZE_WHITESPACE [[ 0. 0. 5.0243 -4.5381] [ 0. 0. 5.0243 -4.5381] [ 5.0243 5.0243 0. 0. ] [-4.5381 -4.5381 0. 0. ]] >>> print(sens.p_prime_matrix) #doctest: +NORMALIZE_WHITESPACE [[ 0. 0. 5.0243 -4.5381] [ 0. 0. 5.0243 -4.5381] [ 0. 0. 0. 0. ] [ 0. 0. 0. 0. ]] >>> print(sens.p_matrix - sens.p_prime_matrix) #doctest: +NORMALIZE_WHITESPACE [[ 0. 0. 0. 0. ] [ 0. 0. 0. 0. ] [ 5.0243 5.0243 0. 0. ] [-4.5381 -4.5381 0. 0. ]] >>> sens.create_boxplot_and_heatplot() #doctest: +SKIP >>> values_to_sample = [.9, 1.1] >>> sens = PairwiseSensitivity( values_to_sample=values_to_sample, observable=observable, objective_function=obj_func_cell_cycle, solver=solver, sens_type='params' ) >>> print(sens.b_matrix.shape == (14, 14)) True >>> sens.run() >>> print(sens.p_matrix)#doctest: +NORMALIZE_WHITESPACE [[ 0. 0. 13.6596 13.6596 24.3955 4.7909 16.4603 11.3258 0.1621 31.2804 13.6596 13.6596 13.6596 13.6596] [ 0. 0. -10.3728 -10.3728 -3.7277 -14.9803 -7.2934 -12.2416 -18.3144 0. -10.3728 -10.3728 -10.3728 -10.3728] [ 13.6596 -10.3728 0. 0. 7.3582 -6.483 3.0794 -2.269 -10.6969 12.7261 0. 0. 0. 0. ] [ 13.6596 -10.3728 0. 0. 7.3582 -6.483 3.0794 -2.269 -10.6969 12.7261 0. 0. 0. 0. ] [ 24.3955 -3.7277 7.3582 7.3582 0. 0. 10.859 5.2577 -4.376 23.2285 7.3582 7.3582 7.3582 7.3582] [ 4.7909 -14.9803 -6.483 -6.483 0. 0. -3.4036 -9.0762 -15.2185 3.8574 -6.483 -6.483 -6.483 -6.483 ] [ 16.4603 -7.2934 3.0794 3.0794 10.859 -3.4036 0. 0. -7.9417 15.5267 3.0794 3.0794 3.0794 3.0794] [ 11.3258 -12.2416 -2.269 -2.269 5.2577 -9.0762 0. 0. -13.128 10.859 -2.269 -2.269 -2.269 -2.269 ] [ 0.1621 -18.3144 -10.6969 -10.6969 -4.376 -15.2185 -7.9417 -13.128 0. 0. -10.6969 -10.6969 -10.6969 -10.6969] [ 31.2804 0. 12.7261 12.7261 23.2285 3.8574 15.5267 10.859 0. 0. 12.7261 12.7261 12.7261 12.7261] [ 13.6596 -10.3728 0. 0. 7.3582 -6.483 3.0794 -2.269 -10.6969 12.7261 0. 0. 0. 0. ] [ 13.6596 -10.3728 0. 0. 7.3582 -6.483 3.0794 -2.269 -10.6969 12.7261 0. 0. 0. 0. ] [ 13.6596 -10.3728 0. 0. 7.3582 -6.483 3.0794 -2.269 -10.6969 12.7261 0. 0. 0. 0. ] [ 13.6596 -10.3728 0. 0. 7.3582 -6.483 3.0794 -2.269 -10.6969 12.7261 0. 0. 0. 0. ]] >>> print(sens.p_matrix - sens.p_prime_matrix) #doctest: +NORMALIZE_WHITESPACE [[ 0. 0. 13.6596 13.6596 17.0373 11.2739 13.3809 13.5948 10.859 18.5543 13.6596 13.6596 13.6596 13.6596] [ 0. 0. -10.3728 -10.3728 -11.0859 -8.4973 -10.3728 -9.9725 -7.6175 -12.7261 -10.3728 -10.3728 -10.3728 -10.3728] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [ 10.7358 6.6451 7.3582 7.3582 0. 0. 7.7796 7.5267 6.3209 10.5024 7.3582 7.3582 7.3582 7.3582] [ -8.8687 -4.6075 -6.483 -6.483 0. 0. -6.483 -6.8071 -4.5215 -8.8687 -6.483 -6.483 -6.483 -6.483 ] [ 2.8006 3.0794 3.0794 3.0794 3.5008 3.0794 0. 0. 2.7553 2.8006 3.0794 3.0794 3.0794 3.0794] [ -2.3339 -1.8688 -2.269 -2.269 -2.1005 -2.5932 0. 0. -2.4311 -1.8671 -2.269 -2.269 -2.269 -2.269 ] [-13.4976 -7.9417 -10.6969 -10.6969 -11.7342 -8.7355 -11.0211 -10.859 0. 0. -10.6969 -10.6969 -10.6969 -10.6969] [ 17.6207 10.3728 12.7261 12.7261 15.8703 10.3404 12.4473 13.128 0. 0. 12.7261 12.7261 12.7261 12.7261] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ]] >>> sens.create_boxplot_and_heatplot() #doctest: +SKIP >>> sens = PairwiseSensitivity( values_to_sample=values_to_sample, observable=observable, objective_function=obj_func_cell_cycle, solver=solver, sample_list=['k1', 'cdc0'] ) >>> print(sens.b_matrix) [[((0.9, 'k1'), (0.9, 'k1')) ((0.9, 'k1'), (1.1, 'k1')) ((0.9, 'k1'), (0.9, 'cdc0')) ((0.9, 'k1'), (1.1, 'cdc0'))] [((1.1, 'k1'), (0.9, 'k1')) ((1.1, 'k1'), (1.1, 'k1')) ((1.1, 'k1'), (0.9, 'cdc0')) ((1.1, 'k1'), (1.1, 'cdc0'))] [((0.9, 'cdc0'), (0.9, 'k1')) ((0.9, 'cdc0'), (1.1, 'k1')) ((0.9, 'cdc0'), (0.9, 'cdc0')) ((0.9, 'cdc0'), (1.1, 'cdc0'))] [((1.1, 'cdc0'), (0.9, 'k1')) ((1.1, 'cdc0'), (1.1, 'k1')) ((1.1, 'cdc0'), (0.9, 'cdc0')) ((1.1, 'cdc0'), (1.1, 'cdc0'))]]
Attributes: - b_matrix: numpy.ndarray
Matrix of 2-tuples containing (perturbation, species index)
- b_prime_matrix: numpy.ndarray
Same as b_matrix, only where one of the species concentrations is unchanged (i.e. with the single variable contribution removed)
- index : list
List of model parameter names that will be used in analysis
- index_of_param : dict
Dictionary that maps parameters name to index in orig_values array
- objective_function : Identical to Parameters (see above).
- orig_vals : numpy.array
Original values of the model.Parameters.
- p_matrix: numpy.ndarray
Pairwise sensitivity matrix
- p_prime_matrix: numpy.ndarray
Normalized pairwise sensitivity matrix (in the sense that it contains changes from the baseline, unperturbed case)
- params_to_run : np.array
Parameter sets to be passed to simulator
-
create_boxplot_and_heatplot
(self, x_axis_label=None, save_name=None, out_dir=None, show=False)[source]¶ Heat map and box plot of sensitivities
Parameters: - x_axis_label : str, optional
label for x asis
- save_name : str, optional
name of figure to save
- out_dir : str, option
output directory to save figures
- show : bool
Show plot if True
Returns: - matplotlib.figure.Figure
The matplotlib figure object for further adjustments, if required
-
create_individual_pairwise_plots
(self, save_name=None, out_dir=None, show=False)[source]¶ Single plot containing heat plot of each specie pair
Parameters: - save_name : str, optional
name ot save figure as
- out_dir : str, optional
output directory
- show : bool
show figure
Returns: - matplotlib.figure.Figure
The matplotlib figure object for further adjustments, if required
-
create_plot_p_h_pprime
(self, save_name=None, out_dir=None, show=False)[source]¶ Plot of P, H(B), and P’
See
PairwiseSensitivity
attributes for descriptions of these matricesParameters: - save_name : str, optional
name to save figure as
- out_dir : str, optional
location to save figure
- show : bool
show the plot if True
Returns: - matplotlib.figure.Figure
The matplotlib figure object for further adjustments, if required
-
run
(self, save_name=None, out_dir=None)[source]¶ Run sensitivity analysis
Parameters: - save_name : str, optional
prefix of saved files
- out_dir : str, optional
location to save output if required
-
sensitivity_multiset
¶ Sensitivity analysis multiset (also called “Q” matrix)
Returns: - list
List of lists containing the sensitivity analysis multiset