Edit: a previous version of this post had the US population set as 3e11 , which is 300 billion, instead of 3e8 , which is 300 million. Fixing this shifts the curves to the left but does not change the interpretation of the results. Thank you Peter Farrell for the heads up.

In my previous post, I covered the SIR model and why “social distancing” is so effective at slowing infection spread and reducing healthcare system burden. In this post I’m going to cover another intervention, banning travel.

To do this, I’m going to extend the SIR model. One of the reasons that the coronavirus spreads so easily is that people can be contagious for several days before symptoms begin. So, instead of assuming three states (Susceptible, Infectious, and Recovered), I’m going to assume the infection can follow five states: Susceptible (S), Asymptomatic (A), Hospitalized (H), Isolated (I), and Recovered (R). The Susceptible become infected but Asymptomatic. The Asymptomatic eventually become ill; some become ill enough to be Hospitalized and the rest become Isolated. The Hospitalized eventually heal enough to be Isolated. Eventually the Isolated become Recovered. I assume that only the Asymptomatic can spread the virus because both the Hospitalized and Isolated are following effective quarantine measures.

I will get to international travel later. For now, this model will allow us to break down the Infected group to more accurately model spread dynamics. This model looks like

\[\begin{align*} \frac{dS}{dt} &= -\beta A S \\ \frac{dA}{dt} &= \beta A S - \kappa A \\ \frac{dH}{dt} &= \kappa \eta A - \tau H \\ \frac{dI}{dt} &= \tau H + \kappa (1 - \eta) A - \phi I \\ \frac{dR}{dt} &= \phi I \end{align*}\]

We can interpret \(1 / \kappa\) as the average number of days that a person is Asymptomatic, \(1 / \tau\) as the average number of days Hospitalized, \(\eta\) as the percent of people who require Hospitalization, and \(1 / \phi\) as the average length of time in Isolation.

Here are the parameter values I’m using:

Parameter Value Reproductive rate (R0) 2 Average number of days asymptomatic 5 Average number of days hospitalized 5 Percent requiring hospitalization 20% Average number of days isolated 14 Number asymptomatic 20,000 Total population 300 million

I’ll gladly take suggestions for more accurate parameter values and I’m working on an interactive version of these plots. Nevertheless, writing this model in R and solving, we get:

library(deSolve) library(data.table) library(ggplot2) sahir_ode <- function(times, init, parms) { with(as.list(c(parms, init)), { dS <- -beta * A * S dA <- beta * A * S - kappa * A dH <- kappa * eta * A - tau * H dI <- tau * H + kappa * (1 - eta) * A - phi * I dR <- phi * I list(c(dS, dA, dH, dI, dR)) }) } asymptomatic_time <- 5 hospitalized_time <- 5 hospitalized_percent <- 0.2 isolated_time <- 14 R0 <- 2 beta <- R0 / asymptomatic_time kappa <- 1 / asymptomatic_time eta <- hospitalized_percent tau <- 1 / hospitalized_time phi <- 1 / isolated_time us_asymptomatic <- 20000 us_population <- 3e8 fraction_asymptomatic_us <- us_asymptomatic / us_population parms <- c(beta = beta, kappa = kappa, eta = eta, tau = tau, phi = phi) init <- c(S = 1 - fraction_asymptomatic_us, A = fraction_asymptomatic_us, H = 0, I = 0, R = 0) times <- seq(0, 150, length.out = 2000) sahir_out <- lsoda(init, times, sahir_ode, parms) sahir_dt <- as.data.table(sahir_out) group_names <- c('Susceptible', 'Asymptomatic', 'Hospitalized', 'Isolated', 'Recovered') names(sahir_dt) <- c('time', group_names) sahir_dt <- melt( sahir_dt, id.vars = c('time'), measure.vars = group_names ) ggplot(sahir_dt, aes(x = time, y = value, color = variable)) + geom_line(lwd = 1.5) + theme_minimal() + theme(text = element_text(size = 15)) + labs(x = 'Days', y = 'Fraction in Group', color = 'Group')

I should note that even though the peak percent hospitalized here looks small, it is 2.8%. There are less than a million hospital beds in the US, which is about 0.3% of the population. So even 2.8% requiring hospitalization would result in hospitals becoming vastly overrun.