UTLDR

The UTLDR model [1] describe a complex framework allowing to extend SEIR/SEIS to incorporate medical and non medical interventions. The acronym summarizes the five macro statuses an agent can be involved into:

  • U ndetected

  • T tested

  • L ocked

  • D ead

  • R ecovered

The U macro status follows the same rules of a classic SEIR(S) model and model the general epidemic evolution when no intervention is established.

The T macro status implements Testing (e.g., identification of exposed/infected agents) and model different classes of response (e.g., quarantine, hospitalization, ICU ospitalization).

The L macro status implements Lockdowns (that can be fine tuned on node attributes) and, as such, social contacts reduction.

Finally, the R and D statuses model the final outcome of an infection (either death or recovery) and are sensible to the various paths for reaching them.

Moreover, UTLDR allows also to include (effective/uneffective) vaccination effects.

UTLDR schema

UTLDR schema: U black statuses, T green statuses, L orange statuses.

Statuses

During the simulation a node can experience the following statuses:

Name

Code

Susceptible

0

Infected

1

Exposed

2

Recovered

3

Identified Exposed

4

Hospitalized Mild conditions

5

Hospitalized in ICU

6

Hospitalized in Severe conditions (not ICU)

7

Lockdown Susceptible

8

Lockdown Exposed

9

Lockdown Infected

10

Dead

11

Vaccinated

12

Parameters

Name

Type

Value Type

Default

Mandatory

Description

sigma

Model

float in [0, 1]

True

Incubation rate

beta

Model

float in [0, 1]

True

Infection rate

gamma

Model

float in [0, 1]

True

Recovery rate (Mild, Asymtomatic, Paucisymtomatic)

gamma_t

Model

float in [0, 1]

0.6

False

Recovery rate (Severe in ICU)

gamma_f

Model

float in [0, 1]

0.95

False

Recovery rate (Severe not ICU)

omega

Model

float in [0, 1]

0

False

Death probability (Mild, Asymtomatic, Paucisymtomatic)

omega_t

Model

float in [0, 1]

0

False

Death probability (Severe in ICU)

omega_f

Model

float in [0, 1]

0

False

Death probability (Severe not ICU)

phi_e

Model

float in [0, 1]

0

False

Testing probability (if Exposed)

phi_i

Model

float in [0, 1]

0

False

Testing probability (if Infected)

kappa_e

Model

float in [0, 1]

0.7

False

1 - False Negative probability (if Exposed)

kappa_i

Model

float in [0, 1]

0.9

False

1 - False Negative probability (if Infected)

epsilon_e

Model

float in [0, 1]

1

False

Social restriction, percentage of pruned edges (Quarantine)

epsilon_l

Model

float in [0, 1]

1

False

Social restriction, percentage of pruned edges (Lockdown)

lambda

Model

float in [0, 1]

1

False

Lockdown effectiveness

mu

Model

float in [0, 1]

1

False

Lockdown duration (1/expected iterations)

p

Model

float in [0, 1]

0

False

Probability of long range (random) interactions

p_l

Model

float in [0, 1]

0

False

Probability of long range (random) interactions (Lockdown)

lsize

Model

float in [0, 1]

0.25

False

Percentage of long range interactions w.r.t. short range ones

icu_b

Model

int in [0, inf]

N

False

ICU beds availability

iota

Model

float in [0, 1]

1

False

Severe case probability (requiring ICU)

z

Model

float in [0, 1]

0

False

Probability of infection from corpses

s

Model

float in [0, 1]

0

False

Probability of no immunization after recovery

v

Model

float in [0, 1]

0

False

Vaccination probability (once per agent)

f

Model

float in [0, 1]

0

False

Probability of vaccination nullification (1/temporal coverage)

activity

Node

float in [0, 1]

1

False

Node’s interactions per iteration (percentage of neighbors)

segment

Node

str

None

False

Node’s class (e.g., age, gender)

The initial infection status can be defined via:

  • fraction_infected: Model Parameter, float in [0, 1]

  • Infected: Status Parameter, set of nodes

The two options are mutually exclusive and the latter takes precedence over the former.

Example

In the code below is shown an example of instantiation and execution of an UTLDR simulation on a random graph.

import networkx as nx
import numpy as np
import ndlib.models.ModelConfig as mc
import ndlib.models.epidemics as epd

# Network topology
g = nx.erdos_renyi_graph(1000, 0.1)

model = epd.UTLDRModel(g)
config = mc.Configuration()

# Undetected
config.add_model_parameter("sigma", 0.05)
config.add_model_parameter("beta", {"M": 0.25, "F": 0})
config.add_model_parameter("gamma", 0.05)
config.add_model_parameter("omega", 0.01)
config.add_model_parameter("p", 0.04)
config.add_model_parameter("lsize", 0.2)

# Testing
config.add_model_parameter("phi_e", 0.03)
config.add_model_parameter("phi_i", 0.1)
config.add_model_parameter("kappa_e", 0.03)
config.add_model_parameter("kappa_i", 0.1)
config.add_model_parameter("gamma_t", 0.08)
config.add_model_parameter("gamma_f", 0.1)
config.add_model_parameter("omega_t", 0.01)
config.add_model_parameter("omega_f", 0.08)
config.add_model_parameter("epsilon_e", 1)
config.add_model_parameter("icu_b", 10)
config.add_model_parameter("iota", 0.20)
config.add_model_parameter("z", 0.2)
config.add_model_parameter("s", 0.05)

# Lockdown
config.add_model_parameter("lambda", 0.8)
config.add_model_parameter("epsilon_l", 5)
config.add_model_parameter("mu", 0.05)
config.add_model_parameter("p_l", 0.04)

# Vaccination
config.add_model_parameter("v", 0.15)
config.add_model_parameter("f", 0.02)

nodes = g.nodes
ngender = ['M', 'F']
work = ['school', 'PA', 'hospital', 'none']
for i in nodes:
    config.add_node_configuration("activity", i, 1)
    config.add_node_configuration("work", i, np.random.choice(work, 2))
    config.add_node_configuration("segment", i, np.random.choice(ngender, 1)[0])

model.set_initial_status(config)
iterations = model.iteration_bunch(10)

households = {0: [1, 2, 3, 4], 5: [6, 7]}
model.set_lockdown(households, ['PA', 'school'])
iterations = model.iteration_bunch(10)

model.unset_lockdown(['PA'])
iterations = model.iteration_bunch(10)

model.set_lockdown(households)
iterations = model.iteration_bunch(10)

model.unset_lockdown(['school'])
iterations = model.iteration_bunch(10)

model.add_ICU_beds(5)
iterations = model.iteration_bunch(10)