library('ggplot2')
library('tidyverse')
library('deSolve')
theme_set(theme_bw())
SIRS model dynamics
Loading the required libraries
Simulate ODEs
<- function(t, state, pars) {
sir_ode_deterministic with(as.list(c(state, pars)), {
<- - beta * I * S + lambda * R
dS <- beta * I * S - gamma * I
dI <- gamma * I - lambda * R
dR return(list(c(dS = dS, dI = dI, dR = dR)))
})
}
<- 0.5
infected_initial <-
initial_condition c(S = 1 - infected_initial,
I = infected_initial,
R = 0)
<- 1
step_length <- 100
max_time <- seq(0, max_time, by = step_length)
timepoints <- 2^(-1:1)
grid_values <- 2^(-2:2)
grid_values <- 2^(-3:3)
grid_values
<- tibble()
result for(beta in grid_values) {
for(gamma in grid_values) {
for(lambda in grid_values) {
<- list(beta = beta,
parameters gamma = gamma,
lambda = lambda)
<- ode(y = initial_condition,
solution times = timepoints,
func = sir_ode_deterministic,
parms = parameters) %>%
%>% as_tibble
unclass $beta <- beta
solution$gamma <- gamma
solution$lambda <- lambda
solution<- rbind(result, solution)
result
}
}
}
<- pivot_longer(result, cols = c('S', 'I', 'R'))
result
<- result %>%
last filter(time == max_time) %>%
mutate(name = factor(name, levels = c('S', 'I', 'R')))
%>%
last ggplot(aes(beta, value, colour = name)) +
geom_point() + geom_line() +
facet_grid(rows = vars(gamma),
cols = vars(lambda),
labeller = label_both) +
labs(xlab = 'beta', ylab = 'Fraction', colour = 'Compartment') +
scale_x_continuous(trans='log10')
%>%
last ggplot(aes(x = beta, y = value, fill = name)) +
geom_area() +
facet_grid(rows = vars(gamma),
cols = vars(lambda),
labeller = label_both) +
labs(xlab = 'beta', ylab = 'Fraction', fill = 'Compartment') +
scale_x_continuous(trans='log10')
<- last %>%
ss group_by(beta, gamma, lambda) %>%
summarise(ss = sum(value))
`summarise()` has grouped output by 'beta', 'gamma'. You can override using the
`.groups` argument.
Analytical approach
Solution in terms of parameters in red.
Equilibrium conditions
Algebraic transformation
Plugging in
Plots
<- pivot_wider(last, names_from = name, values_from = value)
last_w $S_calc <- pmin(1, last_w$gamma / last_w$beta)
last_w$I_calc <-
last_wpmax(0, pmin(1, with(last_w, (lambda * (beta - gamma))) /
* (gamma + lambda))))
(beta $R_calc <-
last_wpmax(0, pmin(1, with(last_w, (gamma * (beta - gamma)) /
* (gamma + lambda)))))
(beta
$I_calc <- 1 - last_w$S_calc - last_w$R_calc
last_w
<- last_w %>%
last pivot_longer(cols = c('S_calc', 'I_calc', 'R_calc'))
%>%
last ggplot(aes(x = beta, y = value, fill = name)) +
geom_area() +
facet_grid(rows = vars(gamma),
cols = vars(lambda),
labeller = label_both) +
labs(ylab = 'Fraction', xlab = 'beta', colour = 'Compartment') +
scale_x_continuous(trans='log10')