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)
= load_model("textbook")
cobra_model = load_model("iJO1366") ecoli_model
6 模拟删除
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 单次删除
在模型上执行所有单基因删除
= single_gene_deletion(cobra_model) deletion_results
这些也可以只对一部分基因进行
20]) single_gene_deletion(cobra_model, cobra_model.genes[:
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 |
这也可用于反应
20]) single_reaction_deletion(cobra_model, cobra_model.reactions[:
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(-5:]).round(4) cobra_model, cobra_model.genes[
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 个内核。也可以手动指定内核数。设置使用单个内核将禁用多处理库,这通常有助于调试。
= time() # start timer()
start
double_gene_deletion(25], processes=2)
ecoli_model, ecoli_model.genes[:= time() - start
t1 print("Double gene deletions for 200 genes completed in "
"%.2f sec with 2 cores" % t1)
= time() # start timer()
start
double_gene_deletion(25], processes=1)
ecoli_model, ecoli_model.genes[:= time() - start
t2 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(2:7]).round(4) cobra_model, cobra_model.reactions[
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_reaction_deletion(cobra_model)
single = double_reaction_deletion(cobra_model)
double
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
这可用于一次获得多个删除,也适用于反应或基因对象(取决于您删除的内容)。
= cobra_model.reactions.ATPM
atpm = cobra_model.reactions.TKT1
tkt1 = cobra_model.reactions.PFK
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