6  模拟删除

import pandas
from time import time

from cobra.io import load_model
from cobra.flux_analysis import (
    single_gene_deletion, single_reaction_deletion, double_gene_deletion,
    double_reaction_deletion)

cobra_model = load_model("textbook")
ecoli_model = load_model("iJO1366")

6.1 敲除单个基因和反应

在分析代谢模型时,一个经常被问到的问题是,如果某种反应不允许有任何通量,会发生什么。这可以通过以下方式使用 cobrapy 进行测试

print('complete model: ', cobra_model.optimize())
with cobra_model:
    cobra_model.reactions.PFK.knock_out()
    print('pfk knocked out: ', cobra_model.optimize())
complete model:  <Solution 0.874 at 0x2551f601bd0>
pfk knocked out:  <Solution 0.704 at 0x2551f603b50>

在评估遗传的操作策略时,更有趣的是检查如果给定的基因被敲除会发生什么,因为这样做在冗余的情况下不会影响任何反应,或者如果基因参与多个反应,则会影响更多的反应。

print('complete model: ', cobra_model.optimize())
with cobra_model:
    cobra_model.genes.b1723.knock_out()
    print('pfkA knocked out: ', cobra_model.optimize())
    cobra_model.genes.b3916.knock_out()
    print('pfkB knocked out: ', cobra_model.optimize())
complete model:  <Solution 0.874 at 0x2551f60ec90>
pfkA knocked out:  <Solution 0.874 at 0x2551f60e590>
pfkB knocked out:  <Solution 0.704 at 0x2551f60e0d0>

6.2 单次删除

在模型上执行所有单基因删除

deletion_results = single_gene_deletion(cobra_model)

这些也可以只对一部分基因进行

single_gene_deletion(cobra_model, cobra_model.genes[:20])
ids growth status
0 {b1241} 0.873922 optimal
1 {b1478} 0.873922 optimal
2 {b0727} 0.858307 optimal
3 {b2587} 0.873922 optimal
4 {b1849} 0.873922 optimal
5 {b0474} 0.873922 optimal
6 {b2296} 0.873922 optimal
7 {b0116} 0.782351 optimal
8 {b0351} 0.873922 optimal
9 {b3734} 0.374230 optimal
10 {b3732} 0.374230 optimal
11 {s0001} 0.211141 optimal
12 {b3733} 0.374230 optimal
13 {b1276} 0.873922 optimal
14 {b0118} 0.873922 optimal
15 {b0356} 0.873922 optimal
16 {b3115} 0.873922 optimal
17 {b0726} 0.858307 optimal
18 {b3735} 0.374230 optimal
19 {b3736} 0.374230 optimal

这也可用于反应

single_reaction_deletion(cobra_model, cobra_model.reactions[:20])
ids growth status
0 {ACONTb} -1.376403e-15 optimal
1 {ENO} 8.053080e-16 optimal
2 {ACALD} 8.739215e-01 optimal
3 {CYTBD} 2.116629e-01 optimal
4 {ALCD2x} 8.739215e-01 optimal
5 {CS} -7.494929e-15 optimal
6 {D_LACt2} 8.739215e-01 optimal
7 {ACKr} 8.739215e-01 optimal
8 {ETOHt2r} 8.739215e-01 optimal
9 {Biomass_Ecoli_core} 0.000000e+00 optimal
10 {AKGt2r} 8.739215e-01 optimal
11 {AKGDH} 8.583074e-01 optimal
12 {ACALDt} 8.739215e-01 optimal
13 {ACONTa} -1.405299e-15 optimal
14 {ACt2r} 8.739215e-01 optimal
15 {ATPS4r} 3.742299e-01 optimal
16 {EX_ac_e} 8.739215e-01 optimal
17 {CO2t} 4.616696e-01 optimal
18 {ADK1} 8.739215e-01 optimal
19 {ATPM} 9.166475e-01 optimal

6.3 双重删除

双重删除以类似的方式运行。

double_gene_deletion(
    cobra_model, cobra_model.genes[-5:]).round(4)
ids growth status
0 {b2935, b2465} 0.0000 optimal
1 {b0008, b2935} 0.8739 optimal
2 {b2464} 0.8739 optimal
3 {b3919, b2465} 0.7040 optimal
4 {b0008} 0.8739 optimal
5 {b0008, b2464} 0.8648 optimal
6 {b2935, b2464} 0.8739 optimal
7 {b2935} 0.8739 optimal
8 {b2935, b3919} 0.7040 optimal
9 {b3919, b2464} 0.7040 optimal
10 {b2464, b2465} 0.8739 optimal
11 {b3919} 0.7040 optimal
12 {b0008, b2465} 0.8739 optimal
13 {b2465} 0.8739 optimal
14 {b0008, b3919} 0.7040 optimal

默认情况下,双重删除功能将自动使用多重处理,如果可用,则将任务拆分为最多 4 个内核。也可以手动指定内核数。设置使用单个内核将禁用多处理库,这通常有助于调试。

start = time()  # start timer()
double_gene_deletion(
    ecoli_model, ecoli_model.genes[:25], processes=2)
t1 = time() - start
print("Double gene deletions for 200 genes completed in "
      "%.2f sec with 2 cores" % t1)

start = time()  # start timer()
double_gene_deletion(
    ecoli_model, ecoli_model.genes[:25], processes=1)
t2 = time() - start
print("Double gene deletions for 200 genes completed in "
      "%.2f sec with 1 core" % t2)

print("Speedup of %.2fx" % (t2 / t1))
Double gene deletions for 200 genes completed in 5.06 sec with 2 cores
Double gene deletions for 200 genes completed in 2.85 sec with 1 core
Speedup of 0.56x

也可以对反应运行双重删除。

double_reaction_deletion(
    cobra_model, cobra_model.reactions[2:7]).round(4)
ids growth status
0 {ACKr, ACt2r} 0.8739 optimal
1 {ACONTb, ACt2r} -0.0000 optimal
2 {ADK1, ACt2r} 0.8739 optimal
3 {ACKr} 0.8739 optimal
4 {ACONTa, ACKr} 0.0000 optimal
5 {ACONTb, ACONTa} -0.0000 optimal
6 {ADK1, ACONTa} -0.0000 optimal
7 {ACONTb} -0.0000 optimal
8 {ACONTb, ACKr} -0.0000 optimal
9 {ADK1, ACKr} 0.8739 optimal
10 {ACONTb, ADK1} -0.0000 optimal
11 {ADK1} 0.8739 optimal
12 {ACONTa} -0.0000 optimal
13 {ACt2r} 0.8739 optimal
14 {ACONTa, ACt2r} -0.0000 optimal

6.4 访问单个删除结果

请注意,删除的索引是 python set 对象。这是适当的类型,因为删除的顺序无关紧要。删除反应 1 和反应 2 与删除反应 2 和反应 1 的效果相同。

为了更轻松地访问结果,COBRAPpy 删除函数返回的所有 DataFrame 都有一个 knockout 索引器,使访问变得更加简单。索引器中的每个条目都被视为单个删除条目。因此,您需要传递双重删除的集合。

single = single_reaction_deletion(cobra_model)
double = double_reaction_deletion(cobra_model)

print(single.knockout["ATPM"])
print(double.knockout[{"ATPM", "TKT1"}])
       ids    growth   status
92  {ATPM}  0.916647  optimal
             ids   growth   status
19  {ATPM, TKT1}  0.90584  optimal

这可用于一次获得多个删除,也适用于反应或基因对象(取决于您删除的内容)。

atpm = cobra_model.reactions.ATPM
tkt1 = cobra_model.reactions.TKT1
pfk = cobra_model.reactions.PFK

print(single.knockout[atpm, tkt1, pfk])
print(double.knockout[{atpm, tkt1}, {atpm, pfk}, {atpm}])
       ids    growth   status
60  {TKT1}  0.864759  optimal
81   {PFK}  0.704037  optimal
92  {ATPM}  0.916647  optimal
               ids    growth   status
19    {ATPM, TKT1}  0.905840  optimal
1136   {PFK, ATPM}  0.704037  optimal
3996        {ATPM}  0.916647  optimal