Taxa knockouts¶
An interesting question concerning any given microbial community is how dependent the growth of one bacteria is one the presence of other bacteria. One strategy to answer that is to perform in silico knockouts for each individual taxa in a community and observe how this changes the growth rates of other bacteria. If the knowckout of one bacteria increases the growth of another one this indicates competitivity whereas a dimished growth rate indicted cooperativity. In order to get unique growth rate solutions we will again use cooperative tradeoff.
For large models as managed in micom running those knockouts can be challenging due to numerical problems and the tendency of the solvers to get stuck in a previous solutions. micom
thus implements an optimized knockout algorithms that avoids numerical and solver issues as much as possible.
Still you should be aware that knockouts are computationally instensive due to the large numbers of quadratic and linear programming problems that have to be solved. For realistic communities with 10-100 taxa and many samples you should expect a full knockout experiment to take between 1 and 5 hours. Here we will perform the knockouts for our small E. coli example.
[1]:
from micom import Community, data
tax = data.test_taxonomy()
com = Community(tax)
ko = com.knockout_taxa(fraction=1.0)
ko
[1]:
compartments | Escherichia_coli_1 | Escherichia_coli_2 | Escherichia_coli_3 | Escherichia_coli_4 |
---|---|---|---|---|
Escherichia_coli_1 | -0.873922 | 0.305549 | 0.305549 | 0.305549 |
Escherichia_coli_2 | 0.305549 | -0.873922 | 0.305549 | 0.305549 |
Escherichia_coli_3 | 0.305549 | 0.305549 | -0.873922 | 0.305549 |
Escherichia_coli_4 | 0.305549 | 0.305549 | 0.305549 | -0.873922 |
By default knockout_species
returns the changes in growth rate meaning the difference between the growth rate after the knockout and the growth rate before. Rows denote the taxa that has been kncked out and columns the changes in growth rate. As we can see all knockouts increase the growth rates of the remaining E. coli strains in this example which makes sense since all of them compete for the same resources. Alternatively we can also just get the new growth rates after the knockout
[2]:
com.knockout_taxa(fraction=1.0, method="raw")
[2]:
compartments | Escherichia_coli_1 | Escherichia_coli_2 | Escherichia_coli_3 | Escherichia_coli_4 |
---|---|---|---|---|
Escherichia_coli_1 | 0.000000 | 1.179471 | 1.179471 | 1.179471 |
Escherichia_coli_2 | 1.179471 | 0.000000 | 1.179471 | 1.179471 |
Escherichia_coli_3 | 1.179471 | 1.179471 | 0.000000 | 1.179471 |
Escherichia_coli_4 | 1.179471 | 1.179471 | 1.179471 | 0.000000 |
…or the relative change ((new - old)/old):
[3]:
com.knockout_taxa(fraction=1.0, method="relative change")
[3]:
compartments | Escherichia_coli_1 | Escherichia_coli_2 | Escherichia_coli_3 | Escherichia_coli_4 |
---|---|---|---|---|
Escherichia_coli_1 | -1.00000 | 0.34963 | 0.34963 | 0.34963 |
Escherichia_coli_2 | 0.34963 | -1.00000 | 0.34963 | 0.34963 |
Escherichia_coli_3 | 0.34963 | 0.34963 | -1.00000 | 0.34963 |
Escherichia_coli_4 | 0.34963 | 0.34963 | 0.34963 | -1.00000 |
In certain circumstances the diagonal entries can be confusing since the knocked out taxa always loses its entire growth. We can suppress the diagonal using the diag
argument.
[4]:
com.knockout_taxa(diag=False)
[4]:
compartments | Escherichia_coli_1 | Escherichia_coli_2 | Escherichia_coli_3 | Escherichia_coli_4 |
---|---|---|---|---|
Escherichia_coli_1 | NaN | 0.305549 | 0.305549 | 0.305549 |
Escherichia_coli_2 | 0.305549 | NaN | 0.305549 | 0.305549 |
Escherichia_coli_3 | 0.305549 | 0.305549 | NaN | 0.305549 |
Escherichia_coli_4 | 0.305549 | 0.305549 | 0.305549 | NaN |
[ ]: