Модель SIR

Чтобы понять, как болезнь проходит через население, не нужно следить за каждым человеком — достаточно разбить людей на несколько групп и описать, как они перетекают друг в друга.

Модель SIR — простейшая компартментная модель эпидемии, которая делит население на три группы: восприимчивые (S), заражённые (I) и выздоровевшие с иммунитетом (R), и описывает переходы S → I → R.

Название SIR — это первые буквы английских слов Susceptible, Infected, Recovered. Каждый человек в любой момент находится ровно в одной из трёх групп, а сумма S + I + R остаётся равной общей численности населения N. Зачем нам такая модель? Она позволяет, зная всего два числа — заразность болезни и скорость выздоровления, — предсказать форму волны: когда будет пик, сколько людей переболеет и как быстро всё закончится. Это основа, на которой строятся более сложные модели и расчёты для систем здравоохранения.

Три группы и потоки между ними

Представим население как три сообщающихся резервуара. Люди не появляются и не исчезают — они только перетекают слева направо:

  заражение           выздоровление
S ----------> I ----------> R
(могут          (болеют,        (переболели,
 заболеть)       заражают)       не заражаются)

Группа S (Susceptible, восприимчивые) — те, кто ещё не болел и может заразиться. Группа I (Infected, заражённые) — те, кто болеет прямо сейчас и способен передать болезнь другим. Группа R (Recovered, выздоровевшие) — те, кто переболел и получил иммунитет, поэтому повторно не заражается и сам никого не заражает. Поток всегда направлен в одну сторону: из S в I и из I в R.

Два коэффициента: beta и gamma

Скорость переходов задают два числа. beta — коэффициент заразности: насколько активно болезнь передаётся при контактах. gamma — скорость выздоровления: какая доля больных выздоравливает за один шаг времени. Если gamma = 0.1, то в среднем человек болеет 1/gamma = 10 дней.

За один день из группы S в группу I перетекает beta * S * I / N человек. Разберём этот член по частям. Доля восприимчивых среди всех — это S / N. Каждый из I заражённых контактирует с людьми, и часть этих контактов приходится на восприимчивых. Произведение S * I отражает число возможных встреч «восприимчивый — заражённый»: чем больше и тех, и других, тем больше столкновений. Коэффициент beta превращает это в число новых заражений. Член gamma * I — это выздоровления: фиксированная доля больных переходит в R.

Считаем эпидемию по шагам

Запишем модель как цикл по дням. На каждом шаге мы вычисляем новые заражения и выздоровления, а затем обновляем три группы.

def sir(S, I, R, beta, gamma, days):
    N = S + I + R
    out = []
    for d in range(days):
        new_inf = beta * S * I / N
        new_rec = gamma * I
        S -= new_inf
        I += new_inf - new_rec
        R += new_rec
        out.append((d, S, I, R))
    return out

res = sir(990, 10, 0, 0.3, 0.1, 60)
print(f"{'день':>4} {'S':>7} {'I':>7} {'R':>7}")
for d, S, I, R in res[::10]:
    print(f"{d:>4} {S:>7.1f} {I:>7.1f} {R:>7.1f}")
peak = max(res, key=lambda t: t[2])
print(f"Пик заражённых: день {peak[0]}, I={peak[2]:.1f}")

Вывод:

день       S       I       R
   0   987.0    12.0     1.0
  10   902.2    67.0    30.8
  20   594.4   239.0   166.6
  30   237.2   303.7   459.1
  40   108.1   181.0   710.9
  50    71.9    84.4   843.7
Пик заражённых: день 27, I=315.9

Мы начали с 990 восприимчивых и 10 заражённых. Сначала больных мало, и эпидемия разгоняется медленно. Затем число заражённых стремительно растёт, достигает пика около 316 человек на 27-й день, после чего идёт на спад: восприимчивых почти не осталось, заражать стало некого. К концу периода почти все оказались в группе R.

Как работает под капотом

Каждый день программа делает три действия. Сначала считает потоки new_inf и new_rec по текущим значениям S и I — важно, что оба потока вычисляются до обновления групп, иначе один поток исказил бы другой. Затем уменьшает S на число заболевших. Затем меняет I: прибавляет новых заражённых и вычитает выздоровевших — отсюда характерный «горб», ведь пока приток больше оттока, I растёт, а когда восприимчивых становится мало, приток падает и I начинает убывать. Наконец, R растёт на число выздоровевших.

Обратите внимание: сумма S + I + R сохраняется на каждом шаге. Сколько вычли из одной группы, столько прибавили к соседней. Это свойство — хороший способ проверить, что в модели нет ошибки: если общее число людей «уплывает», значит, где-то перепутаны знаки.

В основе всего лежит ключевое упрощение — однородное перемешивание: мы считаем, что любой человек одинаково вероятно встречается с любым другим, как молекулы в хорошо размешанном растворе. Поэтому достаточно знать только количество людей в каждой группе, а не кто с кем конкретно контактирует. Реальность сложнее: люди живут в семьях, городах, ездят по разным маршрутам. Но даже это грубое приближение хорошо ловит общую форму волны.

Частые ошибки

  • Обновлять S, I, R по очереди и использовать уже изменённое значение в следующем потоке. Все потоки за шаг нужно считать по «старым» значениям, а применять — потом.
  • Забыть разделить на N в члене заражения. Без деления масштаб новых заражений зависит от размера популяции, и модель ломается.
  • Путать beta и gamma. beta отвечает за рост числа больных, gamma — за их выздоровление; перестановка переворачивает динамику.
  • Ожидать, что переболеют ровно все. Эпидемия затухает раньше, потому что под конец заражённым уже почти некого встретить среди восприимчивых.
  • Считать дробных людей проблемой. В непрерывной модели S, I, R — это вещественные числа (доли населения), и дробные значения — норма.

Итоги

  • Модель SIR делит население на три группы — S (восприимчивые), I (заражённые), R (выздоровевшие) — и описывает поток S → I → R.
  • Член beta * S * I / N задаёт новые заражения через встречи восприимчивых и заражённых, член gamma * I — выздоровления.
  • beta управляет заразностью, gamma — скоростью выздоровления; среднее время болезни равно 1/gamma.
  • Сумма S + I + R сохраняется — это удобная проверка корректности.
  • Главное упрощение — однородное перемешивание: все контактируют со всеми с равной вероятностью.
Проверьте себя
1. Что описывает член beta * S * I / N в модели SIR?
AЧисло выздоровевших за день
BЧисло новых заражений за день через встречи восприимчивых и заражённых
CОбщую численность населения
DСкорость потери иммунитета
2. Что означает группа R в модели SIR?
AТех, кто рискует заболеть
BЗаражённых, способных передавать болезнь
CВыздоровевших с иммунитетом, которые не заражаются
DЛюдей в инкубационном периоде
3. Если gamma = 0.1, сколько в среднем длится болезнь?
A1 день
B10 дней
C100 дней
D0.1 дня
4. Какое упрощение лежит в основе базовой модели SIR?
AИммунитет быстро теряется
BНаселение однородно перемешано — все контактируют со всеми с равной вероятностью
CБолезнь не передаётся между людьми
DЧисленность населения постоянно растёт