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.optimize()
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 the authors summarizes OptGene workflow.

At every iteration, we keep the best 50 individuals found overall so we can generate a library of targets.


In [6]:
from cameo.strain_design import OptGene

In [7]:
optgene = OptGene(model)

In [8]:
result = optgene.run(target=model.reactions.EX_ac_e, 
                     biomass=model.reactions.BIOMASS_Ec_iJO1366_core_53p95M,
                     substrate=model.metabolites.glc__D_e,
                     max_evaluations=5000,
                     plot=False)


Starting optimization at Mon, 22 Jan 2018 13:41:01
Finished after 05:13:14

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,) ((b3734,), (b3737,)) 1 0.0 14.187819 -0.000000 0.402478 -0.000000 -0.000000
1 (SUCTARTtpp, ATPS4rpp, TARTt2_3pp) ((b3733, b4123),) 2 0.0 14.187819 13.731688 0.402478 1.373169 0.552670
2 (RHAT1, ATPS4rpp) ((b3629, b3733),) 2 0.0 14.187819 13.942932 0.402478 1.394293 0.561172
3 (PSP_L, ATPS4rpp) ((b3733, b4388),) 2 0.0 14.976296 14.801391 0.388365 1.480139 0.574834
4 (PHEMEabcpp, ATPS4rpp) ((b3733, b2199), (b3733, b2198)) 2 0.0 14.187819 13.731688 0.402478 1.373169 0.552670
5 (EDTXS4, EDTXS2, ATPS4rpp) ((b1855, b3733),) 2 0.0 14.187819 0.234472 0.402478 0.023447 0.009437
6 (SULFACabcpp, ETHSO3abcpp, ATPS4rpp, MSO3abcpp) ((b0933, b3733),) 2 0.0 14.187819 13.731688 0.402478 1.373169 0.552670
7 (CITL, ATPS4rpp) ((b0614, b3733),) 2 0.0 14.187819 13.942932 0.402478 1.394293 0.561172
8 (ATPS4rpp, NMNPtpp) ((b3733, b0751),) 2 0.0 14.187819 13.731688 0.402478 1.373169 0.552670
9 (ATPS4rpp, GHMT2r, THFAT) ((b3733, b2551),) 2 0.0 14.644674 14.260853 0.393362 1.426085 0.560968
10 (ATPS4rpp, G6PDA) ((b3733, b0678),) 2 0.0 14.187819 13.731688 0.402478 1.373169 0.552670
11 (ATPS4rpp,) ((b3386, b3733), (b0186, b3733)) 2 0.0 14.187819 12.751857 0.402478 1.275186 0.513234
12 (COLIPAKpp, ATPS4rpp) ((b2174, b3733),) 2 0.0 14.187819 13.942932 0.402478 1.394293 0.561172
13 (SUCTARTtpp, ATPS4rpp, TARTt2_3pp) ((b4123, b3733, b4219),) 3 0.0 14.187819 12.751857 0.402478 1.275186 0.513234
14 (PPCSCT, ATPS4rpp) ((b2920, b3733, b4219),) 3 0.0 14.187819 12.751857 0.402478 1.275186 0.513234
15 (PSP_L, ATPS4rpp) ((b3733, b4388, b4219),) 3 0.0 14.976296 12.802175 0.388365 1.280218 0.497192
16 (FEENTERabcpp, ATPS4rpp, FE3DHBZSabcpp) ((b0592, b2224, b3733),) 3 0.0 14.187819 -0.000000 0.402478 -0.000000 -0.000000
17 (NMNPtpp, ATPS4rpp, MTRPOX, SARCOX) ((b2291, b0751, b3733, b1059),) 4 0.0 14.187819 13.942932 0.402478 1.394293 0.561172

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 import OptKnock

In [13]:
optknock = OptKnock(model, fraction_of_optimum=0.1)

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 13.94293 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.