SIR Model Covid-19 DKI Jakarta

~ Bulan Juni 2020 ~


Oleh Muhammad Aji Permana
Dosen Pengampu Prof. Dr M. Suhartono, M.Kom
Program Magister Informatika
Tanggal 11 Mei 2022

Pendahuluan

Model SIR merupakan model epidemi yang dilakukan dengan mengelompokkan populasi ke dalam tiga kelas yang saling asing, yaitu kelas individu rentan yang dapat terinfeksi (Susceptible - S), kelas individu terinfeksi (Infected - I), dan kelas individu yang sembuh dari sakit (Recovered - R). Selanjutnya, ketika individu-individu di ketiga kelas tersebut saling berinteraksi, maka banyaknya individu pada kelas terinfeksi dan kedua kelas lainnya pada waktu tertentu dapat diketahui. Model ini pertama kali diperkenalkan oleh Kermack dan McKendrik (1927), yang digunakan untuk memodelkan penyakit yang menular.

1. Import data excel

library(readxl)
## Warning: package 'readxl' was built under R version 4.1.3
data.corona <- read_excel("datacoba.xlsx")

head(data.corona)

2. Visualisasi kasus kumulatif

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.1.3
hari <- data.corona$hari
y <- data.corona$kumulatif
plot.corona <- ggplot(data = data.corona, aes(x=hari,y))+
  geom_point()+geom_smooth(method = "loess", formula = y~x,se=T)+ylab("Jumlah")+
  labs(title = "Total Infeksi COVID-19 DKI Jakarta Juni 2021")+theme(axis.text.x=element_text(
    angle = 45,hjust = 1
  ))
plot.corona

Dari visualisasi diatas terlihat bahwa kasus Covid-19 pada bulan Juni 2020, terlihat cenderung meningkat.

3. Pemodelan SIR

Infected <- as.numeric(data.corona$kumulatif)
Day <- as.numeric(data.corona$hari)
N <- 11250000
R <-as.numeric(data.corona$sembuh_komulatif)
library(deSolve)
## Warning: package 'deSolve' was built under R version 4.1.3
SIR <- function(time, state, parameters){
  par <- as.list(c(state, parameters))
  with(par,{
    dS <- -beta/N*I*S
    dI <- beta/N*I*S-gamma*I
    dR <- gamma*I
    list(c(dS,dI,dR))
  })
}

init <- c(S=N-Infected[1], I=Infected[1], R=0)
RSS <- function(parameters){
  names(parameters) <- c("beta","gamma")
  out <- ode(y=init, times=Day, func=SIR,parms=parameters)
  fit <- out[,3]
  sum(Infected-fit)^2
}

opt <- optim(c(0.5,0.5),RSS,method="L-BFGS-B",lower=c(0,0),upper = c(1,1))
opt$message
## [1] "ERROR: ABNORMAL_TERMINATION_IN_LNSRCH"

#Memanggil nilai beta dan gamma

opt_par <- setNames(opt$par,c("beta","gamma"))
opt_par
##      beta     gamma 
## 0.5660974 0.4389645

#Membuat data persebaran dengan waktu persebaran 90 hari

t <- 1:90
fit <- data.frame(ode(y=init, times=t,func=SIR, parms = opt_par))

#Visualisasi model SIR

col <- 1:3
matplot(fit$time, fit[,2:4],type="l",xlab = "Day", ylab="Jumlah Manusia",lwd = 2,lty=1,
        col=col,log="y")
## Warning in xy.coords(x, y, xlabel, ylabel, log = log, recycle = TRUE): 1 y value
## <= 0 omitted from logarithmic plot
points(Day,Infected)
legend("bottomright",c("Rentan","Terinfeksi","Sembuh"),lty=1,lwd=2,col=col)
title("Model SIR COVID-19 DKI Jakarta Juni 2021",outer=T,line=-2)

4. Mencari nilai R0

RO <- setNames(opt_par["beta"]/opt_par["gamma"],"RO")
print(RO)
##      RO 
## 1.28962

5. Kesimpulan

  • Berdasarkan pemodelan SIR, didapatkan kasus Covid-19 akan terus naik hingga hari ke 70 pasca kasus pertama.
  • Nilai R0 sebesar 1.2 menunjukkan jumlah kasus akan terus bertambah, dimana 1 orang akan menularkan pada 1,2 orang lainnya.