Transmission Models
Python Version Documentation
A Python library for modeling viral transmission networks using phylogenetic and epidemiological data. This package implements the Didelot et al. (2017) framework for transmission tree inference with unsampled hosts.
Classes
See the Classes page for detailed class documentation.
Functions
See the Functions page for a complete list of functions and their usage.
Tree Visualization
Interactive visualization of transmission trees is supported via a JavaScript library. See the Tree Visualization Library Documentation for full documentation, usage examples, and API reference.
Overview
This library provides tools for Bayesian inference of transmission chains using timing of events, contact and genetic data. It implements the Mixed-Membership Stochastic Block Model approach to transmission network analysis, allowing researchers to:
Reconstruct transmission networks from genetic and epidemiological data
Infer unsampled hosts in transmission chains
Incorporate genetic sequence evolution in transmission modeling
Perform Bayesian inference using MCMC sampling
Visualize transmission networks and phylogenetic relationships
Installation
Prerequisites
This package requires Python 3.8 or higher and the following dependencies:
numpy
pandas
scipy
matplotlib
seaborn
Installing the Package
To install the package in editable mode for development:
git clone https://github.com/oscarcapote/transmission_models.git
cd transmission_models
pip install -e .
This will install the package in editable mode, meaning any changes you make to the source code will be immediately available without reinstalling.
Verifying Installation
After installation, you can verify the package is working correctly:
from transmission_models import *
print("Transmission Models package installed successfully!")
Features
Transmission Network Modeling: Build and analyze transmission networks with unsampled hosts
Phylogenetic Integration: Incorporate genetic sequence data.
MCMC Sampling: Bayesian inference using Markov Chain Monte Carlo methods.
Prior Distributions: Flexible prior specification for genetic and location data
Visualization: Tools for plotting transmission networks and phylogenetic trees
High-performance: Optimized algorithms for large-scale transmission analysis
Requirements
Python >= 3.8
Required packages: * numpy * scipy * networkx * matplotlib * pandas
Optional but recommended: * imageio (for animation support)
Usage
The library can be used for transmission network inference where you have: * Genetic sequence data from sampled hosts * Epidemiological data (sampling times, infection times) * Optional location or contact data * Need to infer unsampled hosts in transmission chains
Basic Example
from transmission_models import host
from transmission_models.models import didelot_unsampled
# Define model parameters
sampling_params = {
"pi": 0.1, # sampling probability
"k_samp": 2.0, # shape parameter for gamma distribution
"theta_samp": 1.0 # scale parameter for gamma distribution
}
offspring_params = {
"r": 1.5, # rate of infection
"p_inf": 0.3 # probability of infection
}
infection_params = {
"k_inf": 2.0, # shape parameter for gamma distribution
"theta_inf": 1.0 # scale parameter for gamma distribution
}
# Create a transmission model
model = didelot_unsampled(sampling_params, offspring_params, infection_params)
# Add a root host
root = model.add_root(t_sampl=10, id="root", genetic_data=['A', 'T', 'C', 'G'], t_inf=0)
# Run MCMC sampling
from transmission_models.models.MCMC import MCMC
mcmc = MCMC(model)
for i in range(1000):
move, gg, pp, P, accepted, DL = mcmc.MCMC_iteration()
if i % 100 == 0:
print(f"Iteration {i} - Move: {move}, Accepted: {accepted}")
How It Works
The Transmission Models library implements the Didelot et al. (2017) framework for transmission tree inference. This approach:
Models transmission networks as directed trees
Incorporates genetic sequence evolution using mutation models
Handles unsampled hosts through Bayesian inference
Uses MCMC sampling to explore the posterior distribution
The model combines three main components:
Sampling Model: Gamma distribution for sampling times
Offspring Model: Negative binomial distribution for offspring number
Infection Model: Gamma distribution for infection times
Documentation and Examples
Download the package from the repository
Tutorial: See Example.ipynb for detailed usage examples
API Reference: Complete documentation of all classes and functions
References
Didelot, X., Gardy, J., & Colijn, C. (2017). Bayesian inference of transmission chains using timing of events, contact and genetic data. PLoS computational biology, 13(4), e1005496.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Indices and tables
Contents:
- Classes
- Host
- Didelot Unsampled
didelot_unsampleddidelot_unsampled.__init__()didelot_unsampled.add_root()didelot_unsampled.successors()didelot_unsampled.parent()didelot_unsampled.out_degree()didelot_unsampled.choose_successors()didelot_unsampled.get_root_subtrees()didelot_unsampled.get_unsampled_hosts()didelot_unsampled.get_candidates_to_chain()didelot_unsampled.get_N_candidates_to_chain()didelot_unsampled.get_sampling_model_likelihood()didelot_unsampled.get_sampling_model_log_likelihood()didelot_unsampled.get_offspring_model_likelihood()didelot_unsampled.get_offspring_model_log_likelihood()didelot_unsampled.get_infection_model_likelihood()didelot_unsampled.get_infection_model_log_likelihood()didelot_unsampled.log_likelihood_host()didelot_unsampled.log_likelihood_hosts_list()didelot_unsampled.log_likelihood_transmission_tree()didelot_unsampled.get_log_likelihood_transmission()didelot_unsampled.Delta_log_sampling()didelot_unsampled.Delta_log_offspring()didelot_unsampled.Delta_log_infection()didelot_unsampled.Delta_log_likelihood_host()didelot_unsampled.infection_time_from_sampling_step()didelot_unsampled.infection_time_from_infection_model_step()didelot_unsampled.add_unsampled_with_times()didelot_unsampled.remove_unsampled_with_times()didelot_unsampled.add_remove_step()didelot_unsampled.MCMC_step()didelot_unsampled.add_genetic_prior()didelot_unsampled.add_same_location_prior()didelot_unsampled.compute_Delta_loc_prior()didelot_unsampled.create_transmision_phylogeny_nets()didelot_unsampled.get_newick()didelot_unsampled.save_json()didelot_unsampled.show_log_likelihoods()didelot_unsampled.__init__()didelot_unsampled.Tdidelot_unsampled.set_T()didelot_unsampled.samp_t_inf_between()didelot_unsampled.add_root()didelot_unsampled.successors()didelot_unsampled.parent()didelot_unsampled.out_degree()didelot_unsampled.choose_successors()didelot_unsampled.compute_Delta_loc_prior()didelot_unsampled.get_candidates_to_chain()didelot_unsampled.get_N_candidates_to_chain()didelot_unsampled.get_root_subtrees()didelot_unsampled.get_unsampled_hosts()didelot_unsampled.get_sampling_model_likelihood()didelot_unsampled.get_sampling_model_log_likelihood()didelot_unsampled.Delta_log_sampling()didelot_unsampled.get_offspring_model_likelihood()didelot_unsampled.get_offspring_model_log_likelihood()didelot_unsampled.Delta_log_offspring()didelot_unsampled.get_infection_model_likelihood()didelot_unsampled.get_infection_model_log_likelihood()didelot_unsampled.Delta_log_infection()didelot_unsampled.log_likelihood_host()didelot_unsampled.Delta_log_likelihood_host()didelot_unsampled.log_likelihood_hosts_list()didelot_unsampled.log_likelihood_transmission_tree()didelot_unsampled.log_posterior_transmission_tree()didelot_unsampled.get_log_posterior_transmission_tree()didelot_unsampled.show_log_likelihoods()didelot_unsampled.log_likelihood_transmission_tree_old()didelot_unsampled.get_log_likelihood_transmission()didelot_unsampled.add_genetic_prior()didelot_unsampled.add_same_location_prior()didelot_unsampled.create_transmision_phylogeny_nets()didelot_unsampled.get_newick()didelot_unsampled.save_json()didelot_unsampled.json_to_tree()didelot_unsampled.infection_time_from_sampling_step()didelot_unsampled.infection_time_from_infection_model_step()didelot_unsampled.add_unsampled_with_times()didelot_unsampled.remove_unsampled_with_times()didelot_unsampled.add_remove_step()didelot_unsampled.MCMC_step()
- MCMC
- Priors
genetic_prior_treegenetic_prior_tree.__init__()genetic_prior_tree.search_firsts_sampled_siblings()genetic_prior_tree.search_first_sampled_parent()genetic_prior_tree.get_mut_time_dist()genetic_prior_tree.get_closest_sampling_siblings()genetic_prior_tree.prior_host()genetic_prior_tree.prior_pair()genetic_prior_tree.log_prior_host_list()genetic_prior_tree.log_prior_host()genetic_prior_tree.log_prior_T()genetic_prior_tree.Delta_log_prior()
get_roots_data_subtrees()location_distance_prior_treelocation_distance_prior_tree.__init__()location_distance_prior_tree.search_firsts_sampled_siblings()location_distance_prior_tree.search_first_sampleed_parent()location_distance_prior_tree.get_mut_time_dist()location_distance_prior_tree.get_closest_sampling_siblings()location_distance_prior_tree.prior_host()location_distance_prior_tree.log_prior_T()
same_location_prior_treesame_location_prior_tree.__init__()same_location_prior_tree.get_roots_data_subtrees()same_location_prior_tree.search_firsts_sampled_siblings()same_location_prior_tree.get_mut_time_dist()same_location_prior_tree.get_closest_sampling_siblings()same_location_prior_tree.prior_host()same_location_prior_tree.log_prior_T()
search_first_sampled_parent()
- Module Documentation
- Classes Module
- Main Classes
- Submodules
hostdidelot_unsampleddidelot_unsampled.__init__()didelot_unsampled.Tdidelot_unsampled.set_T()didelot_unsampled.samp_t_inf_between()didelot_unsampled.add_root()didelot_unsampled.successors()didelot_unsampled.parent()didelot_unsampled.out_degree()didelot_unsampled.choose_successors()didelot_unsampled.compute_Delta_loc_prior()didelot_unsampled.get_candidates_to_chain()didelot_unsampled.get_N_candidates_to_chain()didelot_unsampled.get_root_subtrees()didelot_unsampled.get_unsampled_hosts()didelot_unsampled.get_sampling_model_likelihood()didelot_unsampled.get_sampling_model_log_likelihood()didelot_unsampled.Delta_log_sampling()didelot_unsampled.get_offspring_model_likelihood()didelot_unsampled.get_offspring_model_log_likelihood()didelot_unsampled.Delta_log_offspring()didelot_unsampled.get_infection_model_likelihood()didelot_unsampled.get_infection_model_log_likelihood()didelot_unsampled.Delta_log_infection()didelot_unsampled.log_likelihood_host()didelot_unsampled.Delta_log_likelihood_host()didelot_unsampled.log_likelihood_hosts_list()didelot_unsampled.log_likelihood_transmission_tree()didelot_unsampled.log_posterior_transmission_tree()didelot_unsampled.get_log_posterior_transmission_tree()didelot_unsampled.show_log_likelihoods()didelot_unsampled.log_likelihood_transmission_tree_old()didelot_unsampled.get_log_likelihood_transmission()didelot_unsampled.add_genetic_prior()didelot_unsampled.add_same_location_prior()didelot_unsampled.create_transmision_phylogeny_nets()didelot_unsampled.get_newick()didelot_unsampled.save_json()didelot_unsampled.json_to_tree()didelot_unsampled.infection_time_from_sampling_step()didelot_unsampled.infection_time_from_infection_model_step()didelot_unsampled.add_unsampled_with_times()didelot_unsampled.remove_unsampled_with_times()didelot_unsampled.add_remove_step()didelot_unsampled.MCMC_step()
genetic_prior_treegenetic_prior_tree.__init__()genetic_prior_tree.search_firsts_sampled_siblings()genetic_prior_tree.search_first_sampled_parent()genetic_prior_tree.get_mut_time_dist()genetic_prior_tree.get_closest_sampling_siblings()genetic_prior_tree.prior_host()genetic_prior_tree.prior_pair()genetic_prior_tree.log_prior_host_list()genetic_prior_tree.log_prior_host()genetic_prior_tree.log_prior_T()genetic_prior_tree.Delta_log_prior()
location_distance_prior_treelocation_distance_prior_tree.__init__()location_distance_prior_tree.search_firsts_sampled_siblings()location_distance_prior_tree.search_first_sampleed_parent()location_distance_prior_tree.get_mut_time_dist()location_distance_prior_tree.get_closest_sampling_siblings()location_distance_prior_tree.prior_host()location_distance_prior_tree.log_prior_T()
same_location_prior_treesame_location_prior_tree.__init__()same_location_prior_tree.get_roots_data_subtrees()same_location_prior_tree.search_firsts_sampled_siblings()same_location_prior_tree.get_mut_time_dist()same_location_prior_tree.get_closest_sampling_siblings()same_location_prior_tree.prior_host()same_location_prior_tree.log_prior_T()
MCMC
- MCMC Module
- Classes Module
- Functions
- Utility Functions
- Main Functions
- Visualization
- Data Conversion
tree_to_newick()pdf_in_between()sample_in_between()random_combination()search_firsts_sampled_siblings()search_first_sampled_parent()Delta_log_gamma()hierarchy_pos()hierarchy_pos_times()plot_transmision_network()tree_to_dict()cast_types()tree_to_json()get_host_from_dict()read_tree_dict()json_to_tree()build_infection_based_network()random()tree_slicing_to_offspring()tree_slicing_to_chain()tree_slicing_step()
- Prior Functions
- Utils Module
- Main Functions
- Visualization
- Data Conversion
tree_to_newick()pdf_in_between()sample_in_between()random_combination()search_firsts_sampled_siblings()search_first_sampled_parent()Delta_log_gamma()hierarchy_pos()hierarchy_pos_times()plot_transmision_network()tree_to_dict()cast_types()tree_to_json()get_host_from_dict()read_tree_dict()json_to_tree()build_infection_based_network()random()
- Utility Functions
- Tree Visualization Library Documentation