Stochastic SIR model (discrete state, continuous time) in R
library(reshape2)
sir <- function(beta, gamma, N, S0, I0, R0, tf) {
    time <- 0
    S <- S0
    I <- I0
    R <- R0
    ta <- numeric(0)
    Sa <- numeric(0)
    Ia <- numeric(0)
    Ra <- numeric(0)
    while (time < tf) {
        ta <- c(ta, time)
        Sa <- c(Sa, S)
        Ia <- c(Ia, I)
        Ra <- c(Ra, R)
        pf1 <- beta * S * I
        pf2 <- gamma * I
        pf <- pf1 + pf2
        dt <- rexp(1, rate = pf)
        time <- time + dt
        if (time > tf) {
            break
        }
        ru <- runif(1)
        if (ru < (pf1/pf)) {
            S <- S - 1
            I <- I + 1
        } else {
            I <- I - 1
            R <- R + 1
        }
        if (I == 0) {
            break
        }
    }
    results <- data.frame(time = ta, S = Sa, I = Ia, R = Ra)
    return(results)
}
set.seed(42)
sir_out <- sir(0.1/1000,0.05,1000,999,1,0,200)
if(dim(sir_out)[1]==1){
    sir_out <- sir(0.1/1000,0.05,1000,999,1,0,200)
}
head(sir_out)
| 0.000000 | 999 | 1 | 0 | 
| 1.891201 | 998 | 2 | 0 | 
| 3.470562 | 997 | 3 | 0 | 
| 4.169704 | 997 | 2 | 1 | 
| 8.149657 | 996 | 3 | 1 | 
| 11.145904 | 995 | 4 | 1 | 
sir_out_long <- melt(sir_out,"time")
Visualisation
library(ggplot2)
ggplot(sir_out_long,aes(x=time,y=value,colour=variable,group=variable))+
  # Add line
  geom_line(lwd=2)+
  #Add labels
  xlab("Time")+ylab("Number")
