Епідемічні моделі SIR та SEIR — популяційна біологія, R₀ та колективний імунітет
Модель SIR — запропонована Кермаком і Маккендріком у 1927 році — зводить епідемію до трьох диференціальних рівнянь і двох параметрів. Попри свою простоту, вона правильно прогнозує форму спалаху, час піку, остаточний розмір епідемії та критичний поріг вакцинації, відомий як колективний імунітет.
1. Компартменти SIR та припущення
Популяцію розміром N поділяють на три компартменти. Кожен індивід у будь-який момент належить рівно до одного з них:
Сприйнятливі — ще не інфіковані, можуть підхопити хворобу
Інфекційні — наразі інфіковані й здатні поширювати хворобу
Вибулі — одужалі (з імунітетом) або померлі; більше не передають інфекцію
Класична модель ґрунтується на трьох ідеалізаціях:
- Однорідне змішування: кожен сприйнятливий індивід однаково ймовірно контактує з будь-яким інфекційним індивідом — припущення діючих мас.
- Замкнена популяція: N = S + I + R є сталою (без народжень, смертей чи міграції).
- Одужання дає постійний імунітет: після вибуття індивіди ніколи не повертаються до S.
2. Система ЗДР — виведення
Позначимо через β швидкість передачі (контакти за одиницю часу × ймовірність передачі за контакт), а через γ — швидкість одужання (1/γ = середня тривалість інфекції). Потік такий:
I → R зі швидкістю γ · I
dS/dt = −β · S · I / N
dI/dt = β · S · I / N − γ · I
dR/dt = γ · I
Перевірка збереження: dS/dt + dI/dt + dR/dt = 0 ⟹ S + I + R = N = const ✓
Член захворюваності β · S · I / N є
частотозалежним: N у
знаменнику означає, що подушова частота контактів фіксована незалежно
від розміру популяції — це доречна форма для хвороб, що передаються
безпосередньо, де контакти обмежені часом, а не щільністю населення.
Для густинозалежної передачі (наприклад, трансмісивні хвороби, де
більше носіїв означає більше контактів) знаменник опускають:
β · S · I.
3. Базове репродуктивне число R₀
R₀ (читається «R-нуль») — це середня кількість вторинних інфекцій, спричинених одним інфекційним індивідом, введеним до повністю сприйнятливої популяції. Це найкорисніша окрема епідеміологічна величина:
Виведення: на початку S ≈ N, тож
dI/dt ≈ (β − γ) · I → зростання тоді й лише тоді, коли β > γ → тобто R₀ > 1
R₀ < 1 → епідемія згасає (I одразу спадає)
R₀ = 1 → ендемічна рівновага
R₀ > 1 → епідемія зростає, доки S не вичерпається достатньо
Кір
R₀ ≈ 12–18
Одна з найзаразніших відомих хвороб.
Потрібне
охоплення вакцинацією > 94%.
COVID-19 (початковий)
R₀ ≈ 2.5–3
Варіант Альфа: ≈4, Дельта: ≈6, Омікрон: ≈8–15.
Сезонний грип
R₀ ≈ 1.2–1.4
Відносно скромне; високе через загальну
сприйнятливість.
Ебола (2014, Зах. Африка)
R₀ ≈ 1.5–2.5
Низьке порівняно з респіраторними хворобами; поширюється
прямим контактом.
R₀ не слід плутати з ефективним репродуктивним числом Rₜ, яке враховує частковий імунітет та втручання: Rₜ = R₀ · S/N. Епідемія спадає, коли Rₜ опускається нижче 1.
4. Поріг колективного імунітету
На піку епідемії dI/dt = 0, що дає критичну
частку сприйнятливих:
⟹ S* / N = γ / β = 1 / R₀
Частка, що має бути імунною, щоб запобігти зростанню:
h = 1 − 1/R₀
Приклади:
Кір (R₀ = 15): h = 1 − 1/15 ≈ 93%
COVID-19 (R₀ = 3): h = 1 − 1/3 ≈ 67%
Грип (R₀ = 1.3): h = 1 − 1/1.3 ≈ 23%
Якщо імунна частка перевищує h — чи то завдяки вакцинації, чи попередньому інфікуванню — одиничне занесення не може спричинити епідемію. Це популяційний (колективний) імунітет.
z = 1 − exp(−R₀ · z),
яке розв'язують чисельно (або методом Ньютона).
5. Модель SEIR — компартмент експонованих
Багато хвороб мають латентний період: індивіди вже інфіковані, але ще не заразні (COVID-19: ~5 днів; кір ~10 днів). SEIR додає компартмент Експоновані, щоб це врахувати:
Сприйнятливі
Експоновані (латентні — інфіковані, але ще не заразні)
Інфекційні
Вибулі
dE/dt = β · S · I / N − σ · E
dI/dt = σ · E − γ · I
dR/dt = γ · I
σ = 1/(середній латентний період), напр. σ = 1/5 день⁻¹ для початкового варіанту COVID-19
SEIR R₀ = β/γ (та сама формула — латентний період зсуває час, але не поріг)
Латентний період затримує пік епідемії — саме тому відстеження контактів працює: експонованих індивідів можна виявити та ізолювати до того, як вони стануть заразними.
6. Реалізація на JavaScript із RK4
Ми використовуємо класичний розв'язувач ЗДР методом Рунге-Кутти
четвертого порядку (RK4). Вектор стану —
[S, E, I, R].
// ── Параметри моделі SEIR ─────────────────────────────────────────
const params = {
N : 1_000_000, // загальна популяція
beta : 0.3, // швидкість передачі (день⁻¹)
sigma: 1 / 5, // швидкість інкубації (1/латентний період)
gamma: 1 / 10, // швидкість одужання (1/інфекційний період)
};
// ── Права частина SEIR ──────────────────────────────────────────
function seir([S, E, I, R], { N, beta, sigma, gamma }) {
const force = beta * I / N; // сила інфекції (на одного сприйнятливого)
return [
-force * S, // dS/dt
force * S - sigma * E, // dE/dt
sigma * E - gamma * I, // dI/dt
gamma * I // dR/dt
];
}
// ── Один крок RK4 ──────────────────────────────────────────────
function rk4Step(f, y, dt, p) {
const add = (a, b, s) => a.map((v, i) => v + b[i] * s);
const k1 = f(y, dt, p);
const k2 = f(add(y, k1, dt/2), dt, p);
const k3 = f(add(y, k2, dt/2), dt, p);
const k4 = f(add(y, k3, dt), dt, p);
return y.map((v, i) =>
v + (k1[i] + 2*k2[i] + 2*k3[i] + k4[i]) * dt / 6
);
}
// Виправляємо rk4Step, щоб передати правильну сигнатуру
function rk4StepFixed(y, dt, p) {
const add = (a, b, s) => a.map((v, i) => v + b[i] * s);
const k1 = seir(y, p);
const k2 = seir(add(y, k1, dt/2), p);
const k3 = seir(add(y, k2, dt/2), p);
const k4 = seir(add(y, k3, dt), p);
return y.map((v, i) =>
v + (k1[i] + 2*k2[i] + 2*k3[i] + k4[i]) * dt / 6
);
}
// ── Запуск симуляції на 365 днів ───────────────────────────────────
function runSEIR(p, days = 365, dt = 0.25) {
const results = [];
let y = [p.N - 1, 0, 1, 0]; // S, E, I=1 початковий, R
for (let t = 0; t <= days; t += dt) {
results.push({ t, S: y[0], E: y[1], I: y[2], R: y[3] });
y = rk4StepFixed(y, dt, p);
}
return results;
}
// Обчислюємо R₀ та поріг колективного імунітету
const R0 = params.beta / params.gamma; // 0.3 / 0.1 = 3
const herd = 1 - 1 / R0; // ≈ 0.667 = 66.7%
const result = runSEIR(params);
const peak = result.reduce((mx, r) => r.I > mx.I ? r : mx, result[0]);
console.log(`R₀ = ${R0.toFixed(2)} | колективний імунітет = ${(herd*100).toFixed(1)}%`);
console.log(`Пік I = ${(peak.I/params.N*100).toFixed(2)}% від N на день ${peak.t.toFixed(0)}`);
Побудова графіка за допомогою Canvas 2D
function plotSEIR(canvas, results, N) {
const ctx = canvas.getContext('2d');
const { width: W, height: H } = canvas;
ctx.clearRect(0, 0, W, H);
const pad = { l: 50, r: 20, t: 20, b: 40 };
const cw = W - pad.l - pad.r;
const ch = H - pad.t - pad.b;
const px = t => pad.l + (t / results.at(-1).t) * cw;
const py = v => pad.t + ch - (v / N) * ch;
const lines = [
{ key: 'S', color: '#60a5fa', label: 'Сприйнятливі' },
{ key: 'E', color: '#f59e0b', label: 'Експоновані' },
{ key: 'I', color: '#f97316', label: 'Інфекційні' },
{ key: 'R', color: '#22c55e', label: 'Вибулі' },
];
for (const { key, color } of lines) {
ctx.beginPath();
ctx.strokeStyle = color;
ctx.lineWidth = 2;
results.forEach((r, idx) => {
idx === 0 ? ctx.moveTo(px(r.t), py(r[key]))
: ctx.lineTo(px(r.t), py(r[key]));
});
ctx.stroke();
}
}
7. Розширення: вітальна динаміка, стохастичність, просторове поширення
SIR із вітальною динамікою
Додавання коефіцієнта народжуваності μ (рівного коефіцієнту смертності для сталого N) дає ендемічну рівновагу — збудник зберігається невизначено довго й коливається. Ендемічна рівновага становить S* = N/R₀, I* = μN(1 − 1/R₀)/γ.
Модель SIRS — згасання імунітету
Якщо імунітет згасає зі швидкістю ξ, одужалі індивіди повертаються до S. Це актуально для коронавірусів і грипу: R → S зі швидкістю ξ·R. Система може циклити, породжуючи сезонні хвилі, що спостерігаються при грипі.
Стохастичні моделі
Детерміновані моделі дають усереднені траєкторії; реальні спалахи містять випадковість. Два підходи:
- Алгоритм Гіллеспі: точна стохастична симуляція. Витягуємо час до наступної події з експоненційного розподілу; обираємо подію (інфікування, одужання) пропорційно до її швидкості. Точно, але повільно для великих N.
- Агентний (IBM): симулюємо кожного індивіда, задаємо явну контактну мережу. Враховує структуру домогосподарств, просторову неоднорідність та події суперпоширення.
Просторове поширення та метапопуляційні моделі
Реальні епідемії поширюються мережею взаємопов'язаних субпопуляцій (міста, регіони). Метапопуляційна модель застосовує динаміку SIR у межах кожної ділянки й додає міжділянкове змішування через матрицю мобільності — використовується для моделювання пандемій, що поширюються авіасполученням (модель GLEaM, MIT/Гарвард).