seird Module#

SEIRD compartmental epidemic model with mortality.

The SEIRD model adds a **D**eath compartment to account for disease-induced mortality, essential for understanding outbreak severity.

Equations#

\[\begin{split}\\frac{dS}{dt} &= -\\frac{\\beta S I}{N} \\\\ \\frac{dE}{dt} &= \\frac{\\beta S I}{N} - \\sigma E \\\\ \\frac{dI}{dt} &= \\sigma E - (\\gamma + \\mu) I \\\\ \\frac{dR}{dt} &= \\gamma I \\\\ \\frac{dD}{dt} &= \\mu I\end{split}\]

where: - \(\\beta\) = transmission rate (day⁻¹) - \(\\sigma\) = progression rate E→I (day⁻¹) - \(\\gamma\) = recovery rate (day⁻¹) - \(\\mu\) = mortality rate (day⁻¹) - \(R_0 = \\beta / (\\gamma + \\mu)\) - \(CFR = \\mu / (\\gamma + \\mu)\)

Class#

class episia.models.seird.SEIRDModel(parameters)[source]#

Bases: CompartmentalModel

SEIRD epidemic model with disease-induced mortality.

Parameters:

parameters (SEIRDParameters) – SEIRDParameters instance.

Example:

from episia.models import SEIRDModel
from episia.models.parameters import SEIRDParameters

params = SEIRDParameters(
    N=1_000_000,
    I0=1,
    E0=5,
    beta=0.35,
    sigma=1/5.2,
    gamma=0.09,
    mu=0.01,       # ~10% CFR at peak load
    t_span=(0, 365),
)
result = SEIRDModel(params).run()
print(f"Total deaths: {result.compartments['D'][-1]:,.0f}")
result.plot().show()
__init__(parameters)[source]#
Parameters:

parameters (SEIRDParameters)

property compartment_names: List[str]#

Ordered list of compartment names, e.g. [‘S’, ‘I’, ‘R’].

summary()[source]#

Extended summary including mortality metrics.

Return type:

Dict[str, Any]

Examples#

Mortality modeling:

from episia.models import SEIRDModel
from episia.models.parameters import SEIRDParameters

params = SEIRDParameters(
    N=1_000_000,
    I0=10,
    E0=50,
    beta=0.35,
    sigma=1/5.2,
    gamma=0.09,    # 90% recover
    mu=0.01,       # 10% die
    t_span=(0, 365)
)

model = SEIRDModel(params)
result = model.run()

total_deaths = result.compartments['D'][-1]
print(f"Total deaths: {total_deaths:,.0f}")
print(f"CFR: {params.cfr:.1%}")
print(f"Attack rate: {result.metadata['metrics']['attack_rate']:.1%}")

result.plot().show()

Estimating hospital burden:

result = SEIRDModel(params).run()

# Peak infectious = peak hospital/ICU demand
peak_inf = result.peak_infected
peak_day = result.peak_time

print(f"Peak hospital demand: {peak_inf:,.0f} patients at day {peak_day:.0f}")
print(f"Cumulative deaths: {result.compartments['D'][-1]:,.0f}")