Development of the Advanced Algorithm for Forecasting Covid-19 Cases Based on Time Series and Neural Network Models

Daily Covid 19 Infections cases In Russian federation (forecasting Second-wave) by using NNAR Bootstrap model
Makarovskikh Tatyana Anatolyevna “Макаровских Татьяна Анатольевна”
Abotaleb mostafa“Аботалеб Мостафа”
Faculty of Electrical Engineering and Computer Science
Department of system programming
South ural state university, Chelyabinsk, Russian federation
#Import
library(fpp2)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
## -- Attaching packages ---------------------------------------------- fpp2 2.4 --
## v ggplot2   3.3.2     v fma       2.4  
## v forecast  8.13      v expsmooth 2.3
## 
library(forecast)
library(ggplot2)
library("readxl")
library(moments)
library(forecast)
require(forecast)  
require(tseries)
## Loading required package: tseries
require(markovchain)
## Loading required package: markovchain
## Package:  markovchain
## Version:  0.8.5-3
## Date:     2020-12-03
## BugReport: https://github.com/spedygiorgio/markovchain/issues
require(data.table)
## Loading required package: data.table
library(Hmisc)
## Loading required package: lattice
## Loading required package: survival
## Loading required package: Formula
## 
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:base':
## 
##     format.pval, units
library(ascii)
##Global vriable##
Full_original_data <- read.csv("data.csv") # path of your data ( time series data)
original_data<-Full_original_data$cases
y_lab <- "Forecast Second wave infection cases in Russia"   # input name of data
Actual_date_interval <- c("2020/03/01","2020/11/30")
Forecast_date_interval <- c("2020/12/01","2020/12/31")
validation_data_days <-25
frequency<-"days"
Number_Neural<-3 # Number of Neural For model NNAR Model
NNAR_Model<- TRUE     #create new model (TRUE/FALSE)
frequency<-"days"
number_bootstrapped<-3
# Data Preparation & calculate some of statistics measures
summary(original_data) # Summary your time series
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0     163    5841    6894    8952   27543
# calculate standard deviation 
data.frame(kurtosis=kurtosis(original_data))   # calculate Cofficient of kurtosis
##   kurtosis
## 1 3.859814
data.frame(skewness=skewness(original_data))  # calculate Cofficient of skewness
##   skewness
## 1 1.144149
data.frame(Standard.deviation =sd(original_data))
##   Standard.deviation
## 1           6655.426
#processing on data (input data)
rows <- NROW(original_data) # calculate number of rows in time series (number of days)
training_data<-original_data[1:(rows-validation_data_days)] # Training data
testing_data<-original_data[(rows-validation_data_days+1):rows] #testing data
AD<-fulldate<-seq(as.Date(Actual_date_interval[1]),as.Date(Actual_date_interval[2]), frequency)  #input range for actual date
FD<-seq(as.Date(Forecast_date_interval[1]),as.Date(Forecast_date_interval[2]), frequency)  #input range forecasting date
N_forecasting_days<-nrow(data.frame(FD))  #calculate number of days that you want to forecasting
validation_dates<-tail(AD,validation_data_days) # select validation_dates
validation_data_by_name<-weekdays(validation_dates) # put names of validation dates
forecasting_data_by_name<-weekdays(FD)  # put names of Forecasting dates
## Bootstrapping and bagging NNAR model
model_NNAR <- baggedModel(original_data,bootstrapped_series= bld.mbb.bootstrap(original_data,number_bootstrapped), fn = nnetar,size = Number_Neural)
forecasting_NNAR <- forecast(model_NNAR,N_forecasting_days+validation_data_days)
validation_forecast<-head(forecasting_NNAR$mean,validation_data_days)
MAPE_Per_Day<-round(  abs(((testing_data-validation_forecast)/testing_data)*100)  ,3)
paste ("MAPE % For ",validation_data_days,frequency,"by using NNAR Model for  ==> ",y_lab, sep=" ")
## [1] "MAPE % For  25 days by using NNAR Model for  ==>  Forecast Second wave infection cases in Russia"
MAPE_Mean_All<-paste(round(mean(MAPE_Per_Day),3),"% MAPE ",validation_data_days,frequency,y_lab,sep=" ")
MAPE_Mean_All_NNAR<-round(mean(MAPE_Per_Day),3)
MAPE_NNAR<-paste(round(MAPE_Per_Day,3),"%")
MAPE_NNAR_Model<-paste(MAPE_Per_Day ,"%")
paste (" MAPE that's Error of Forecasting for ",validation_data_days," days in NNAR Model for  ==> ",y_lab, sep=" ")
## [1] " MAPE that's Error of Forecasting for  25  days in NNAR Model for  ==>  Forecast Second wave infection cases in Russia"
paste(MAPE_Mean_All,"%")
## [1] "17.232 % MAPE  25 days Forecast Second wave infection cases in Russia %"
paste ("MAPE that's Error of Forecasting day by day for ",validation_data_days," days in NNAR Model for  ==> ",y_lab, sep=" ")
## [1] "MAPE that's Error of Forecasting day by day for  25  days in NNAR Model for  ==>  Forecast Second wave infection cases in Russia"
print(ascii(data.frame(date_NNAR=validation_dates,validation_data_by_name,actual_data=testing_data,forecasting_NNAR=validation_forecast,MAPE_NNAR_Model)), type = "rest")
## 
## +----+------------+-------------------------+-------------+------------------+-----------------+
## |    | date_NNAR  | validation_data_by_name | actual_data | forecasting_NNAR | MAPE_NNAR_Model |
## +====+============+=========================+=============+==================+=================+
## | 1  | 2020-11-06 | Friday                  | 20582.00    | 26696.55         | 29.708 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 2  | 2020-11-07 | Saturday                | 20396.00    | 26758.54         | 31.195 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 3  | 2020-11-08 | Sunday                  | 20498.00    | 26815.19         | 30.819 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 4  | 2020-11-09 | Monday                  | 21798.00    | 26866.55         | 23.252 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 5  | 2020-11-10 | Tuesday                 | 20977.00    | 26912.80         | 28.297 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 6  | 2020-11-11 | Wednesday               | 19851.00    | 26954.23         | 35.783 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 7  | 2020-11-12 | Thursday                | 21608.00    | 26991.14         | 24.913 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 8  | 2020-11-13 | Friday                  | 21983.00    | 27023.89         | 22.931 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 9  | 2020-11-14 | Saturday                | 22702.00    | 27052.85         | 19.165 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 10 | 2020-11-15 | Sunday                  | 22572.00    | 27078.36         | 19.964 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 11 | 2020-11-16 | Monday                  | 22778.00    | 27100.79         | 18.978 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 12 | 2020-11-17 | Tuesday                 | 22410.00    | 27120.45         | 21.019 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 13 | 2020-11-18 | Wednesday               | 20985.00    | 27137.65         | 29.319 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 14 | 2020-11-19 | Thursday                | 23610.00    | 27152.67         | 15.005 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 15 | 2020-11-20 | Friday                  | 24318.00    | 27165.77         | 11.711 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 16 | 2020-11-21 | Saturday                | 24822.00    | 27177.18         | 9.488 %         |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 17 | 2020-11-22 | Sunday                  | 24581.00    | 27187.10         | 10.602 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 18 | 2020-11-23 | Monday                  | 25173.00    | 27195.72         | 8.035 %         |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 19 | 2020-11-24 | Tuesday                 | 24326.00    | 27203.21         | 11.828 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 20 | 2020-11-25 | Wednesday               | 23675.00    | 27209.70         | 14.93 %         |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 21 | 2020-11-26 | Thursday                | 25487.00    | 27215.33         | 6.781 %         |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 22 | 2020-11-27 | Friday                  | 27543.00    | 27220.21         | 1.172 %         |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 23 | 2020-11-28 | Saturday                | 27100.00    | 27224.44         | 0.459 %         |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 24 | 2020-11-29 | Sunday                  | 26683.00    | 27228.10         | 2.043 %         |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 25 | 2020-11-30 | Monday                  | 26338.00    | 27231.27         | 3.392 %         |
## +----+------------+-------------------------+-------------+------------------+-----------------+
print(ascii(data.frame(FD,forecating_date=forecasting_data_by_name,forecasting_by_NNAR=tail(forecasting_NNAR$mean,N_forecasting_days))), type = "rest")
## 
## +----+------------+-----------------+---------------------+
## |    | FD         | forecating_date | forecasting_by_NNAR |
## +====+============+=================+=====================+
## | 1  | 2020-12-01 | Tuesday         | 27234.02            |
## +----+------------+-----------------+---------------------+
## | 2  | 2020-12-02 | Wednesday       | 27236.39            |
## +----+------------+-----------------+---------------------+
## | 3  | 2020-12-03 | Thursday        | 27238.44            |
## +----+------------+-----------------+---------------------+
## | 4  | 2020-12-04 | Friday          | 27240.22            |
## +----+------------+-----------------+---------------------+
## | 5  | 2020-12-05 | Saturday        | 27241.76            |
## +----+------------+-----------------+---------------------+
## | 6  | 2020-12-06 | Sunday          | 27243.09            |
## +----+------------+-----------------+---------------------+
## | 7  | 2020-12-07 | Monday          | 27244.24            |
## +----+------------+-----------------+---------------------+
## | 8  | 2020-12-08 | Tuesday         | 27245.23            |
## +----+------------+-----------------+---------------------+
## | 9  | 2020-12-09 | Wednesday       | 27246.09            |
## +----+------------+-----------------+---------------------+
## | 10 | 2020-12-10 | Thursday        | 27246.84            |
## +----+------------+-----------------+---------------------+
## | 11 | 2020-12-11 | Friday          | 27247.48            |
## +----+------------+-----------------+---------------------+
## | 12 | 2020-12-12 | Saturday        | 27248.04            |
## +----+------------+-----------------+---------------------+
## | 13 | 2020-12-13 | Sunday          | 27248.52            |
## +----+------------+-----------------+---------------------+
## | 14 | 2020-12-14 | Monday          | 27248.93            |
## +----+------------+-----------------+---------------------+
## | 15 | 2020-12-15 | Tuesday         | 27249.29            |
## +----+------------+-----------------+---------------------+
## | 16 | 2020-12-16 | Wednesday       | 27249.61            |
## +----+------------+-----------------+---------------------+
## | 17 | 2020-12-17 | Thursday        | 27249.88            |
## +----+------------+-----------------+---------------------+
## | 18 | 2020-12-18 | Friday          | 27250.11            |
## +----+------------+-----------------+---------------------+
## | 19 | 2020-12-19 | Saturday        | 27250.31            |
## +----+------------+-----------------+---------------------+
## | 20 | 2020-12-20 | Sunday          | 27250.49            |
## +----+------------+-----------------+---------------------+
## | 21 | 2020-12-21 | Monday          | 27250.64            |
## +----+------------+-----------------+---------------------+
## | 22 | 2020-12-22 | Tuesday         | 27250.77            |
## +----+------------+-----------------+---------------------+
## | 23 | 2020-12-23 | Wednesday       | 27250.88            |
## +----+------------+-----------------+---------------------+
## | 24 | 2020-12-24 | Thursday        | 27250.98            |
## +----+------------+-----------------+---------------------+
## | 25 | 2020-12-25 | Friday          | 27251.06            |
## +----+------------+-----------------+---------------------+
## | 26 | 2020-12-26 | Saturday        | 27251.14            |
## +----+------------+-----------------+---------------------+
## | 27 | 2020-12-27 | Sunday          | 27251.20            |
## +----+------------+-----------------+---------------------+
## | 28 | 2020-12-28 | Monday          | 27251.26            |
## +----+------------+-----------------+---------------------+
## | 29 | 2020-12-29 | Tuesday         | 27251.30            |
## +----+------------+-----------------+---------------------+
## | 30 | 2020-12-30 | Wednesday       | 27251.34            |
## +----+------------+-----------------+---------------------+
## | 31 | 2020-12-31 | Thursday        | 27251.38            |
## +----+------------+-----------------+---------------------+
plot(forecasting_NNAR,xlab = paste ("Time in", frequency ,y_lab , sep=" "), ylab=y_lab)
x1_test <- ts(testing_data, start =(rows-validation_data_days+1) )
lines(x1_test, col='red',lwd=2)

graph1<-autoplot(forecasting_NNAR,xlab = paste ("Time in", frequency ,y_lab , sep=" "), ylab=y_lab)
graph1+scale_y_continuous(labels = scales::comma)+
  forecast::autolayer(forecasting_NNAR$mean, series="NNAR Model",size = 0.7) +
  guides(colour=guide_legend(title="Forecasts"),fill = "black")+
  theme(legend.position="bottom")+
  theme(legend.background = element_rect(fill="white",
                                         size=0.7, linetype="solid", 
                                         colour ="gray"))