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
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)  #create new model (TRUE/FALSE)
frequency<-"days"
# 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
#NNAR Model 
if(NNAR_Model==TRUE){
  data_series<-ts(training_data)
  model_NNAR<-nnetar(data_series, size = Number_Neural)
  saveRDS(model_NNAR, file = "model_NNAR.RDS")
  my_model <- readRDS("model_NNAR.RDS")
  accuracy(model_NNAR)  # accuracy on training data #Print Model Parameters
  model_NNAR
}
## Series: data_series 
## Model:  NNAR(1,3) 
## Call:   nnetar(y = data_series, size = Number_Neural)
## 
## Average of 20 networks, each of which is
## a 1-3-1 network with 10 weights
## options were - linear output units 
## 
## sigma^2 estimated as 145352
if(NNAR_Model==FALSE){
  data_series<-ts(training_data)
  #model_NNAR<-nnetar(data_series, size = Number_Numeral)
  model_NNAR <- readRDS("model_NNAR.RDS")
  accuracy(model_NNAR)  # accuracy on training data #Print Model Parameters
  model_NNAR
}

# Testing Data Evaluation
forecasting_NNAR <- forecast(model_NNAR, h=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.747 % 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    | 19303.95         | 6.21 %          |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 2  | 2020-11-07 | Saturday                | 20396.00    | 19225.84         | 5.737 %         |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 3  | 2020-11-08 | Sunday                  | 20498.00    | 19164.41         | 6.506 %         |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 4  | 2020-11-09 | Monday                  | 21798.00    | 19115.80         | 12.305 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 5  | 2020-11-10 | Tuesday                 | 20977.00    | 19077.16         | 9.057 %         |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 6  | 2020-11-11 | Wednesday               | 19851.00    | 19046.34         | 4.054 %         |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 7  | 2020-11-12 | Thursday                | 21608.00    | 19021.67         | 11.969 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 8  | 2020-11-13 | Friday                  | 21983.00    | 19001.89         | 13.561 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 9  | 2020-11-14 | Saturday                | 22702.00    | 18986.01         | 16.369 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 10 | 2020-11-15 | Sunday                  | 22572.00    | 18973.22         | 15.944 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 11 | 2020-11-16 | Monday                  | 22778.00    | 18962.93         | 16.749 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 12 | 2020-11-17 | Tuesday                 | 22410.00    | 18954.62         | 15.419 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 13 | 2020-11-18 | Wednesday               | 20985.00    | 18947.92         | 9.707 %         |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 14 | 2020-11-19 | Thursday                | 23610.00    | 18942.52         | 19.769 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 15 | 2020-11-20 | Friday                  | 24318.00    | 18938.15         | 22.123 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 16 | 2020-11-21 | Saturday                | 24822.00    | 18934.62         | 23.718 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 17 | 2020-11-22 | Sunday                  | 24581.00    | 18931.76         | 22.982 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 18 | 2020-11-23 | Monday                  | 25173.00    | 18929.45         | 24.803 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 19 | 2020-11-24 | Tuesday                 | 24326.00    | 18927.59         | 22.192 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 20 | 2020-11-25 | Wednesday               | 23675.00    | 18926.08         | 20.059 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 21 | 2020-11-26 | Thursday                | 25487.00    | 18924.86         | 25.747 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 22 | 2020-11-27 | Friday                  | 27543.00    | 18923.87         | 31.293 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 23 | 2020-11-28 | Saturday                | 27100.00    | 18923.07         | 30.173 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 24 | 2020-11-29 | Sunday                  | 26683.00    | 18922.42         | 29.084 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
## | 25 | 2020-11-30 | Monday                  | 26338.00    | 18921.90         | 28.157 %        |
## +----+------------+-------------------------+-------------+------------------+-----------------+
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         | 18921.48            |
## +----+------------+-----------------+---------------------+
## | 2  | 2020-12-02 | Wednesday       | 18921.13            |
## +----+------------+-----------------+---------------------+
## | 3  | 2020-12-03 | Thursday        | 18920.86            |
## +----+------------+-----------------+---------------------+
## | 4  | 2020-12-04 | Friday          | 18920.63            |
## +----+------------+-----------------+---------------------+
## | 5  | 2020-12-05 | Saturday        | 18920.45            |
## +----+------------+-----------------+---------------------+
## | 6  | 2020-12-06 | Sunday          | 18920.30            |
## +----+------------+-----------------+---------------------+
## | 7  | 2020-12-07 | Monday          | 18920.18            |
## +----+------------+-----------------+---------------------+
## | 8  | 2020-12-08 | Tuesday         | 18920.09            |
## +----+------------+-----------------+---------------------+
## | 9  | 2020-12-09 | Wednesday       | 18920.01            |
## +----+------------+-----------------+---------------------+
## | 10 | 2020-12-10 | Thursday        | 18919.95            |
## +----+------------+-----------------+---------------------+
## | 11 | 2020-12-11 | Friday          | 18919.89            |
## +----+------------+-----------------+---------------------+
## | 12 | 2020-12-12 | Saturday        | 18919.85            |
## +----+------------+-----------------+---------------------+
## | 13 | 2020-12-13 | Sunday          | 18919.82            |
## +----+------------+-----------------+---------------------+
## | 14 | 2020-12-14 | Monday          | 18919.79            |
## +----+------------+-----------------+---------------------+
## | 15 | 2020-12-15 | Tuesday         | 18919.77            |
## +----+------------+-----------------+---------------------+
## | 16 | 2020-12-16 | Wednesday       | 18919.75            |
## +----+------------+-----------------+---------------------+
## | 17 | 2020-12-17 | Thursday        | 18919.74            |
## +----+------------+-----------------+---------------------+
## | 18 | 2020-12-18 | Friday          | 18919.73            |
## +----+------------+-----------------+---------------------+
## | 19 | 2020-12-19 | Saturday        | 18919.72            |
## +----+------------+-----------------+---------------------+
## | 20 | 2020-12-20 | Sunday          | 18919.71            |
## +----+------------+-----------------+---------------------+
## | 21 | 2020-12-21 | Monday          | 18919.70            |
## +----+------------+-----------------+---------------------+
## | 22 | 2020-12-22 | Tuesday         | 18919.70            |
## +----+------------+-----------------+---------------------+
## | 23 | 2020-12-23 | Wednesday       | 18919.69            |
## +----+------------+-----------------+---------------------+
## | 24 | 2020-12-24 | Thursday        | 18919.69            |
## +----+------------+-----------------+---------------------+
## | 25 | 2020-12-25 | Friday          | 18919.69            |
## +----+------------+-----------------+---------------------+
## | 26 | 2020-12-26 | Saturday        | 18919.69            |
## +----+------------+-----------------+---------------------+
## | 27 | 2020-12-27 | Sunday          | 18919.68            |
## +----+------------+-----------------+---------------------+
## | 28 | 2020-12-28 | Monday          | 18919.68            |
## +----+------------+-----------------+---------------------+
## | 29 | 2020-12-29 | Tuesday         | 18919.68            |
## +----+------------+-----------------+---------------------+
## | 30 | 2020-12-30 | Wednesday       | 18919.68            |
## +----+------------+-----------------+---------------------+
## | 31 | 2020-12-31 | Thursday        | 18919.68            |
## +----+------------+-----------------+---------------------+
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"))