# Leonardo Misari # Sebastian Parihuana
library(deSolve)
## Warning: package 'deSolve' was built under R version 4.5.2
library(ggplot2)
sir_model <- function ( time , initial_pop , params ) {
S = initial_pop [ 1 ]
I = initial_pop [ 2 ]
R = initial_pop [ 3 ]
with ( as.list ( params ) , {
N = S + I + R
dS = - S * beta * I / N
dI = S * beta * I / N - gamma * I
dR = gamma * I
return ( list ( c ( dS , dI , dR ) ) )
} )
}
# Parámetros de entrada
beta <- 0.7
gamma <- 0.1
my_params <- c ( beta = beta , gamma = gamma )
initial_pop <- c ( S = 999999 , I = 1 , R = 0 )
time <- seq ( from = 0 , to = 150 , by = 1 )
# Ejecutar modelo
my_sir <- ode ( initial_pop , time , sir_model , my_params )
# Convertir resultados a marco de datos
my_sir <- as.data.frame ( my_sir )
ggplot()+
geom_line(data=my_sir,
aes(x=time, y = S, color = 'S'), size = 2)+
geom_line(data=my_sir,
aes(x=time, y = I, color = 'I'), size = 2)+
geom_line(data=my_sir,
aes(x=time, y = R, color = 'R'), size = 2)+
xlab('Day of Outbreak')+
ylab('Number of People')+
ggtitle(paste0('SIR Model'))+
theme_classic()+
theme(legend.title=element_blank(), axis.title = element_text(size = 20),
title = element_text(size = 24), legend.text = element_text(size = 18))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
# Effective Reproduction Ratio
my_sir$R_t <- beta*my_sir$S / (gamma * (my_sir$S + my_sir$I + my_sir$R))
# Plot R_t
ggplot()+
geom_line(data=my_sir,
aes(x=time, y = R_t, color = 'R_t'), size = 2)+
geom_hline(yintercept = 1)+
xlab('Day of Outbreak')+
ylab('Effective Reproduciton Ratio')+
ggtitle(paste0('SIR Model'))+
theme_classic()+
theme(legend.title=element_blank(), axis.title = element_text(size = 20),
title = element_text(size = 24), legend.text = element_text(size = 18))
# Vaccination
# Track total cases in outbreak
total_cases_list <- c()
vax_rate_list <- seq(0,1,by=0.01)
pop <- 999999
for(vax_rate in vax_rate_list)
{
initial_pop <- c(S = pop*(1-vax_rate), I = 1, R = pop*vax_rate)
# Run model
my_sir <- ode(initial_pop, time, sir_model, my_params)
# Convert results to data frame
my_sir <- as.data.frame(my_sir)
#Add total cases to list
total_cases_list <- c(total_cases_list,
(my_sir$R[length(my_sir$R)] - pop*vax_rate))
}
#Plot Vaccination Rate Vs Outbreak Size
vax_plot_df <- as.data.frame(matrix(c(vax_rate_list, total_cases_list),
ncol = 2, byrow = FALSE))
colnames(vax_plot_df) <- c('Vax_rate', 'Outbreak_size')
# Plot R_t
ggplot()+
geom_line(data=vax_plot_df,
aes(x=Vax_rate, y = Outbreak_size, color = 'Outbreak Size'), size = 2)+
xlab('Vaccine Rate Pre-Outbreak')+
ylab('Number of Cases')+
ggtitle(paste0('SIR Model'))+
theme_classic()+
theme(legend.title=element_blank(), axis.title = element_text(size = 20),
title = element_text(size = 24), legend.text = element_text(size = 18))