Predict gene knockout strategies

In cameo we have two ways of predicting gene knockout targets: using evolutionary algorithms (OptGene) or linear programming (OptKnock)

If you're running this notebook on [try.cameo.bio](http://try.cameo.bio), things might run very slow due to our inability to provide access to the proprietary [CPLEX](https://www-01.ibm.com/software/commerce/optimization/cplex-optimizer/) solver on a public webserver. Furthermore, Jupyter kernels might crash and restart due to memory limitations on the server.
In [1]:
from cameo import models
In [2]:
model = models.bigg.iJO1366
In [3]:
wt_solution = model.solve()
growth = wt_solution.fluxes["BIOMASS_Ec_iJO1366_core_53p95M"]
acetate_production = wt_solution.fluxes["EX_ac_e"]
In [4]:
from cameo import phenotypic_phase_plane
In [5]:
p = phenotypic_phase_plane(model, variables=['BIOMASS_Ec_iJO1366_core_53p95M'], objective='EX_ac_e')
p.plot(points=[(growth, acetate_production)])

OptGene

OptGene is an approach to search for gene or reaction knockouts that relies on evolutionary algorithms[1]. The following image from authors summarizes the OptGene workflow.

Every iteration we keep the best 50 individuals so we can generate a library of targets.

In [6]:
from cameo.strain_design.heuristic.evolutionary_based import OptGene
In [7]:
optgene = OptGene(model)
In [8]:
result = optgene.run(target="EX_ac_e", 
                     biomass="BIOMASS_Ec_iJO1366_core_53p95M",
                     substrate="glc__D_e",
                     max_evaluations=5000,
                     plot=False)
Starting optimization at Wed, 29 Mar 2017 20:41:05
Finished after 00:15:48
In [9]:
result
Out[9]:

OptGene Result

  • Simulation: fba
  • Objective Function: $$bpcy = \frac{(BIOMASS\_Ec\_iJO1366\_core\_53p95M * EX\_ac\_e)}{EX\_glc\_\_D\_e}$$
reactions genes size fva_min fva_max target_flux biomass_flux yield fitness
0 (ATPS4rpp,) ((b3738,), (b3736,)) 1.0 0.000000 14.187819 -0.000000 0.402478 -0.000000 -0.000000
1 (ACNAMt2pp, ATPS4rpp) ((b3731, b3224),) 2.0 0.000000 14.187819 12.540613 0.402478 1.254061 0.504732
2 (SUCptspp, ATPS4rpp, ACMUMptspp) ((b2429, b3731),) 2.0 0.000000 14.187819 13.920956 0.402478 1.392096 0.560288
3 (SUCOAS, ATPS4rpp) ((b0728, b3731),) 2.0 12.224462 14.187819 13.942932 0.402478 1.394293 0.561172
... ... ... ... ... ... ... ... ... ...
29 (ADMDC, ATPS4rpp) ((b0120, b3731),) 2.0 0.000000 14.187819 13.942932 0.402478 1.394293 0.561172
30 (TDSR1, ATPS4rpp, DSBCGT) ((b2893, b3731),) 2.0 0.000000 14.187819 12.729881 0.402478 1.272988 0.512350
31 (ATPS4rpp,) ((b0997, b2489, b3731),) 3.0 0.000000 14.187819 13.942932 0.402478 1.394293 0.561172
32 (CYTBO3_4pp, ATPS4rpp, ZNabcpp) ((b1858, b3731, b0432),) 3.0 0.000000 14.187819 13.942932 0.402478 1.394293 0.561172

33 rows × 9 columns

In [10]:
result.plot(0)
In [11]:
result.display_on_map(0, "iJO1366.Central metabolism")

OptKnock

OptKnock uses a bi-level mixed integer linear programming approach to identify reaction knockouts[2]:

$$ \begin{matrix} maximize & \mathit{v_{chemical}} & & (\mathbf{OptKnock}) \\ \mathit{y_j} & & & \\ subject~to & maximize & \mathit{v_{biomass}} & (\mathbf{Primal}) \\ & \mathit{v_j} & & & & \\ \end{matrix}\\ \begin{bmatrix} subject~to & \sum_{j=1}^{M}S_{ij}v_{j} = 0,\\ & v_{carbon\_uptake} = v_{carbon~target}\\ & v_{apt} \ge v_{apt\_main}\\ & v_{biomass} \ge v_{target\_biomass}\\ & v_{j}^{min} \cdot y_j \le v_j \le v_{j}^{max} \cdot y_j, \forall j \in \boldsymbol{M} \\ \end{bmatrix}\\ \begin{align} & y_j = {0, 1}, & & \forall j \in \boldsymbol{M} & \\ & \sum_{j \in M} (1 - y_j) \le K& & & \\ \end{align} $$
In [12]:
from cameo.strain_design.deterministic.linear_programming import OptKnock
In [13]:
optknock = OptKnock(model, fraction_of_optimum=0.1)
2583
1705
/Users/niso/Dev/cameo/cameo/flux_analysis/structural.py:166: ClusterWarning:

scipy.cluster: The symmetric non-negative hollow observation matrix looks suspiciously like an uncondensed distance matrix

Running multiple knockouts with OptKnock can take a few hours or days...

In [14]:
result = optknock.run(max_knockouts=1, target="EX_ac_e", biomass="BIOMASS_Ec_iJO1366_core_53p95M")
In [15]:
result
Out[15]:

OptKnock:

  • Target: EX_ac_e
reactions size EX_ac_e biomass fva_min fva_max
0 {ATPS4rpp} 1.0 13.942932 0.402477 0.0 14.187819
In [16]:
result.plot(0)
In [17]:
result.display_on_map(0, "iJO1366.Central metabolism")

References

[1]Patil, K. R., Rocha, I., Förster, J., & Nielsen, J. (2005). Evolutionary programming as a platform for in silico metabolic engineering. BMC Bioinformatics, 6, 308. doi:10.1186/1471-2105-6-308

[2]Burgard, A.P., Pharkya, P., Maranas, C.D. (2003), "OptKnock: A Bilevel Programming Framework for Identifying Gene Knockout Strategies for Microbial Strain Optimization," Biotechnology and Bioengineering, 84(6), 647-657.