Абстрактный

Сегодня 11 марта 2020 года. Наконец до меня дошло, что как программист я могу смоделировать вспышку коронавируса, проверить свою модель на соответствие реальности и немного повеселиться в процессе.

Модель

Когда люди заражаются, их сначала не обнаруживают в течение периода «getDetectedDays», после чего их обнаруживают как больных (поскольку у них появляются видимые симптомы) и изолируют, чтобы они больше не заражали новых людей. Они просто либо умирают, либо выздоравливают в течение периода, указанного в программе getHealthyDays.
Если они выздоравливают, они снова выздоравливают и не могут заразиться в течение периода, равного количеству дней в режиме protectedDays, и считаются «защищенными». По окончании «защитного» периода они теперь «здоровы», но могут заразиться повторно.

Каждый вновь инфицированный человек заражает других людей «R0» со 100% уверенностью, но эта вероятность снижается, потому что некоторые люди на улице не всегда «заразны», например. кто-то уже инфицирован или кто-то в течение защищенного периода не может заразиться. Таким образом, существует фактор «probMeetHealthy», влияющий на «R0».
Предполагается, что выявленные больные люди изолированы (т. е. не находятся «на улице») и не влияют на эту вероятность.

Модель предполагает, что «R0» уменьшается линейно пропорционально вероятности встречи с заразным человеком, то есть: каждый вновь инфицированный человек заражает «R0» * «probMeetHealthy» дополнительных людей. Однако общее количество вновь инфицированных никогда не может превышать общее количество доступных заразных людей. Таким образом, если есть возможность заразить 100 человек, но только 50 способны заразиться, 50 человек заболеют.

Предполагая, что все люди, о которых известно, что они больны («totalDetectedSick»), изолированы, тогда:
«probMeetHealthy» = «здоров» / («здоров [но не защищен]» + «totalProtected» + «totalUndetectedSick»)

Предполагается, что люди никогда не умирают, пока еще находятся на раннем, незамеченном периоде болезни (в основном потому, что предполагается, что это период без симптомов), но после обнаружения они могут умереть со средней вероятностью «уровень смертности». Таким образом, всякий раз, когда обнаруживаются больные люди, новые смерти равны «newDetected» * «deathRate», в то время как остальные «newDetected» считаются изолированными, таким образом прекращается заражение новых людей и, в конечном итоге, выздоравливает.

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

Предположения, предположения

Что ж, я назвал эту модель выше «упрощенной». Существует множество предположений, упрощающих реальную действительность. Некоторые из основных:

  • Наборов для обнаружения достаточно, чтобы обнаружить каждого подозреваемого
  • Все люди в одном пуле — нет изолированных групп (например, стран)
  • Правительство не принимает крайних мер (например, комендантский час в городе/стране)
  • Влияние лета не учитывается
  • Открытие/разработка лекарства или вакцины

Моделирование

Параметры моделирования

Условия для моделирования, представленные в этой статье, основаны на том, что известно или оценено на данный момент (R0 = 2,2, средний уровень смертности = в среднем 3,5% и т. д.) — см. рис. B ниже — с очень сильным предположением (НЕ основано на что-либо известное до сих пор), что тот, кто был болен и снова выздоровел, не может больше заразиться в течение длительного времени ('protectedDays' = 1000)

Экспериментируя с периодом до того, как человек может заболеть во второй раз (параметр protectedDays), я обнаружил, что этот параметр гораздо более критичен, чем любой другой. Если меньше, чем ~4 месяца, чума не закончится, по крайней мере, десять лет. Изменение еще на несколько дней или более всегда приведет к прекращению чумы примерно через 1 год. Что-то вроде переломной ситуации.

Проверка симуляции на работоспособность

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

Определив «сегодня» по дню с ближайшим общим количеством известных случаев («totalDetectedSick»), зарегистрированных за сегодня (симуляция: 120470; реальный мир на 11 марта: 118 900), мы можем сравнить другие параметры с тем, что нам известно. например, согласно модели, это общее количество известных случаев достигается на 90-й день с момента запуска. Это означало бы, что чума началась 3 месяца назад. По реальной оценке, коронавирус начался еще в декабре 2019 года в Китае, так что да, на самом деле он длится около 3 месяцев (с 11 марта 2020 года) — симуляция в этом отношении была точной. Прогнозируется, что количество погибших («мертвых») составит 4724, в то время как в реальном мире количество смертей составляет 4269, поэтому отклонение около 10% все еще разумно для такой упрощенной модели.

Несколько более широких сравнений можно провести с испанкой:

Продолжительность: 2 года (испанка) против прогноза на 1 год (симуляция коронавируса)
Число погибших: 10–50 млн человек против прогноза 230 млн (симуляция коронавируса)

Или с текущими прогнозами:
Моделирование предсказывает, что около 60% населения мира будут инфицированы, в то время как на этой неделе Ангела Меркель оценивает, что от 60% до 70% населения Германии заразится коронавирусом (есть и аналогичные прогнозы).

Кажется разумным прогнозом, учитывая, что коронавирус, вероятно, имеет несколько иной R0 и уровень смертности, чем испанский грипп.

Результаты симуляции

Запуск модели прекращался через 300–350 дней, в зависимости от конкретных условий запуска. Результаты ясно показывают, что нас ждут тяжелые 5 месяцев, и полное воздействие чумы еще далеко впереди, и, по прогнозам, оно наступит (в зависимости от количества смертей) примерно через 3–4 месяца.

Примечание: «вероятность2» — это вероятность встретить заразного человека (1 000 000 000 равно 100%).

Еще одно интересное предсказание моделирования можно увидеть на рисунке C — предсказание, которое невозможно проверить: количество невыявленных больных в 6 раз превышает количество известных (~720 тыс. против ~120 тыс.).

Резюме

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

Для меня это было хорошим упражнением в программировании, которое напомнило мне о времени, когда я программировал игру-симулятор «жизни» — рис. F), и его следует воспринимать именно как упражнение по программированию.

Будет интересно ознакомиться с этой статьей через год, сравнить прогнозы и реальность.
См. полный код на github.com
Давайте планировать заранее, но надеяться на лучшее.
Всем крепкого здоровья!