Getting Started
===============
Installation
------------
You can **install EoN version 1.1** with pip
::
pip install EoN
If you have installed a previous version and want to reinstall with the most
recent version available through pip (1.1). The easiest way is
::
pip install EoN --upgrade
If you are using Anaconda, go to the Anaconda command line and use
`pip install EoN`
To **install EoN with a later (in development) version** You can clone or
download the Github version at
https://github.com/springer-math/Mathematics-of-Epidemics-on-Networks
Then just move into the main directory and run
::
python setup.py install
EoN requires ``numpy``, ``scipy``, and ``matplotlib``. If you don't have them
and you install through `pip`, these will automatically be added. Some of the
visualization tools provide support for animations, but producing the
animations will require installation of something like ``ffmpeg``.
Current Version
---------------
The documentation provided here is for version 1.2rc1.
If you want to see changes from previous versions, please see
`Changes from v1.0 `_.
Citing
------
If you use EoN, or publish anything based on it, please cite the
`Journal of Open Source Software publication `_
Also, please
`let me know `_
so that I can use it for performance reviews and grant applications and generally
because it makes me happy.
QuickStart Guide
----------------
The code here provides an example of creating a Barabasi-Albert network.
Then it performs several simulations of an SIR epidemic starting with a fraction
rho randomly infected initially. Finally it uses several analytic models to
predict the spread of an epidemic in a random network with the given properties.
::
import networkx as nx
import matplotlib.pyplot as plt
import EoN
N=10**5
G=nx.barabasi_albert_graph(N, 5) #create a barabasi-albert graph
tmax = 20
iterations = 5 #run 5 simulations
tau = 0.1 #transmission rate
gamma = 1.0 #recovery rate
rho = 0.005 #random fraction initially infected
for counter in range(iterations): #run simulations
t, S, I, R = EoN.fast_SIR(G, tau, gamma, rho=rho, tmax = tmax)
if counter == 0:
plt.plot(t, I, color = 'k', alpha=0.3, label='Simulation')
plt.plot(t, I, color = 'k', alpha=0.3)
#Now compare with ODE predictions. Read in the degree distribution of G
#and use rho to initialize the various model equations.
#There are versions of these functions that allow you to specify the
#initial conditions rather than starting from a graph.
#we expect a homogeneous model to perform poorly because the degree
#distribution is very heterogeneous
t, S, I, R = EoN.SIR_homogeneous_pairwise_from_graph(G, tau, gamma, rho=rho, tmax = tmax)
plt.plot(t, I, '-.', label = 'Homogeneous pairwise', linewidth = 5)
#meanfield models will generally overestimate SIR growth because they
#treat partnerships as constantly changing.
t, S, I, R = EoN.SIR_heterogeneous_meanfield_from_graph(G, tau, gamma, rho=rho, tmax=tmax)
plt.plot(t, I, ':', label = 'Heterogeneous meanfield', linewidth = 5)
#The EBCM model does not account for degree correlations or clustering
t, S, I, R = EoN.EBCM_from_graph(G, tau, gamma, rho=rho, tmax = tmax)
plt.plot(t, I, '--', label = 'EBCM approximation', linewidth = 5)
#the preferential mixing model captures degree correlations.
t, S, I, R = EoN.EBCM_pref_mix_from_graph(G, tau, gamma, rho=rho, tmax=tmax)
plt.plot(t, I, label = 'Pref mix EBCM', linewidth=5, dashes=[4, 2, 1, 2, 1, 2])
plt.xlabel('$t$')
plt.ylabel('Number infected')
plt.legend()
plt.savefig('SIR_BA_model_vs_sim.png')
This produces
.. image:: SIR_BA_model_vs_sim.png
The preferential mixing version of the EBCM approach provides the best approximation
to the (gray) simulated epidemics. We now move on to SIS epidemics:
::
plt.clf()
#Now run for SIS. Simulation is much slower so need smaller network
N=10**4
G=nx.barabasi_albert_graph(N, 5) #create a barabasi-albert graph
for counter in range(iterations):
t, S, I = EoN.fast_SIS(G, tau, gamma, rho=rho, tmax = tmax)
if counter == 0:
plt.plot(t, I, color = 'k', alpha=0.3, label='Simulation')
plt.plot(t, I, color = 'k', alpha=0.3)
#Now compare with ODE predictions. Read in the degree distribution of G
#and use rho to initialize the various model equations.
#There are versions of these functions that allow you to specify the
#initial conditions rather than starting from a graph.
#we expect a homogeneous model to perform poorly because the degree
#distribution is very heterogeneous
t, S, I = EoN.SIS_homogeneous_pairwise_from_graph(G, tau, gamma, rho=rho, tmax = tmax)
plt.plot(t, I, '-.', label = 'Homogeneous pairwise', linewidth = 5)
t, S, I = EoN.SIS_heterogeneous_meanfield_from_graph(G, tau, gamma, rho=rho, tmax=tmax)
plt.plot(t, I, ':', label = 'Heterogeneous meanfield', linewidth = 5)
t, S, I = EoN.SIS_compact_pairwise_from_graph(G, tau, gamma, rho=rho, tmax=tmax)
plt.plot(t, I, '--', label = 'Compact pairwise', linewidth = 5)
plt.xlabel('$t$')
plt.ylabel('Number infected')
plt.legend()
plt.savefig('SIS_BA_model_vs_sim.png')
This produces
.. image:: SIS_BA_model_vs_sim.png