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

Daily Covid 19 Infections cases In Chelyabinsk For forecasting
Makarovskikh Tatyana Anatolyevna “Макаровских Татьяна Анатольевна”
Abotaleb mostafa“Аботалеб Мостафа”
Department of Electrical Engineering and Computer Science
South ural state university, Chelyabinsk, Russian federation
#Import library
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)
library(pander)
## 
## Attaching package: 'pander'
## The following object is masked from 'package:ascii':
## 
##     Pandoc
library(tseries)
require(tseries) # need to install tseries tj test Stationarity in time series 
library(forecast)   # install library forecast             
library(ascii) # for make tables
##Global vriable##
Full_original_data <- read_excel("data.xlsx") # path of your data ( time series data)
original_data<-Full_original_data$cases # select colum from your data 
y_lab <- "(Daily Covid 19 Infection cases in Chelyabinsk)"   # input name of data
Actual_date_interval <- c("2020/03/12","2021/07/31") # put actual range date of your data
Forecast_date_interval <- c("2021/08/01","2021/08/07") #put forecasting date range 
validation_data_days <-7 # Number of testing data(#testing last 10 days)10
Number_Neural<-15# Number of Neural For model NNAR Model
NNAR_Model<- FALSE     #create new NNAR model (TRUE/FALSE)
frequency<-"days" # type of you data( daily-weekly-month-years)
country.name <- "Chelyabinsk" # name of area or country or cases
# Data Preparation & calculate some of statistics measures
summary(original_data) # Summary your time series
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0      85     122     145     214     338
# calculate Cofficient of kurtosis
# calculate Cofficient of skewness
# calculate standard deviation 
data.frame(kurtosis=kurtosis(original_data),skewness=skewness(original_data),Standard.deviation =sd(original_data))
##   kurtosis skewness Standard.deviation
## 1 2.193685 0.488203           91.90665
#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
}
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
}
## Series: data_series 
## Model:  NNAR(2,15) 
## Call:   nnetar(y = data_series, size = Number_Neural)
## 
## Average of 20 networks, each of which is
## a 2-15-1 network with 61 weights
## options were - linear output units 
## 
## sigma^2 estimated as 81.77
# 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  7 days by using NNAR Model for ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
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  7  days in NNAR Model for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
paste(MAPE_Mean_All,"%")
## [1] "4.543 % MAPE 7 days (Daily Covid 19 Infection cases in Chelyabinsk) %"
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  7  days in NNAR Model for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
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 | 2021-07-25 | Sunday                  | 315.00      | 315.28           | 0.09 %          |
## +---+------------+-------------------------+-------------+------------------+-----------------+
## | 2 | 2021-07-26 | Monday                  | 321.00      | 316.07           | 1.535 %         |
## +---+------------+-------------------------+-------------+------------------+-----------------+
## | 3 | 2021-07-27 | Tuesday                 | 324.00      | 315.26           | 2.698 %         |
## +---+------------+-------------------------+-------------+------------------+-----------------+
## | 4 | 2021-07-28 | Wednesday               | 329.00      | 313.53           | 4.703 %         |
## +---+------------+-------------------------+-------------+------------------+-----------------+
## | 5 | 2021-07-29 | Thursday                | 331.00      | 311.38           | 5.927 %         |
## +---+------------+-------------------------+-------------+------------------+-----------------+
## | 6 | 2021-07-30 | Friday                  | 335.00      | 309.17           | 7.71 %          |
## +---+------------+-------------------------+-------------+------------------+-----------------+
## | 7 | 2021-07-31 | Saturday                | 338.00      | 307.11           | 9.14 %          |
## +---+------------+-------------------------+-------------+------------------+-----------------+
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 | 2021-08-01 | Sunday          | 305.30              |
## +---+------------+-----------------+---------------------+
## | 2 | 2021-08-02 | Monday          | 303.80              |
## +---+------------+-----------------+---------------------+
## | 3 | 2021-08-03 | Tuesday         | 302.59              |
## +---+------------+-----------------+---------------------+
## | 4 | 2021-08-04 | Wednesday       | 301.66              |
## +---+------------+-----------------+---------------------+
## | 5 | 2021-08-05 | Thursday        | 300.96              |
## +---+------------+-----------------+---------------------+
## | 6 | 2021-08-06 | Friday          | 300.46              |
## +---+------------+-----------------+---------------------+
## | 7 | 2021-08-07 | Saturday        | 300.12              |
## +---+------------+-----------------+---------------------+
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"))

#################
##  bats model  #
#################
# Data Modeling
data_series<-ts(training_data) # make your data to time series
autoplot(data_series ,xlab=paste ("Time in", frequency, sep=" "), ylab = y_lab, main=paste ("Actual Data :", y_lab, sep=" "))

model_bats<-bats(data_series)
accuracy(model_bats)  # accuracy on training data
##                     ME     RMSE      MAE MPE MAPE      MASE          ACF1
## Training set 0.4279646 9.700088 5.296793 NaN  Inf 0.9583393 -0.0006436153
# Print Model Parameters
model_bats
## BATS(1, {4,5}, 0.955, -)
## 
## Call: bats(y = data_series)
## 
## Parameters
##   Alpha: 1.19281
##   Beta: 0.1334899
##   Damping Parameter: 0.95535
##   AR coefficients: -0.75151 -0.07387 -0.058625 -0.540428
##   MA coefficients: 0.279061 -0.234796 -0.099764 0.346198 -0.24875
## 
## Seed States:
##             [,1]
##  [1,] -6.5739305
##  [2,]  0.3030306
##  [3,]  0.0000000
##  [4,]  0.0000000
##  [5,]  0.0000000
##  [6,]  0.0000000
##  [7,]  0.0000000
##  [8,]  0.0000000
##  [9,]  0.0000000
## [10,]  0.0000000
## [11,]  0.0000000
## 
## Sigma: 9.700088
## AIC: 5425.439
#ploting BATS Model
plot(model_bats,xlab = paste ("Time in", frequency ,y_lab , sep=" "))

# Testing Data Evaluation
forecasting_bats <- predict(model_bats, h=N_forecasting_days+validation_data_days)
validation_forecast<-head(forecasting_bats$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 BATS Model for  ==> ",y_lab, sep=" ")
## [1] "MAPE % For  7 days by using BATS Model for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
MAPE_Mean_All.bats_Model<-round(mean(MAPE_Per_Day),3)
MAPE_Mean_All.bats<-paste(round(mean(MAPE_Per_Day),3),"% MAPE ",validation_data_days,frequency,y_lab,sep=" ")
MAPE_bats<-paste(round(MAPE_Per_Day,3),"%")
MAPE_bats_Model<-paste(MAPE_Per_Day ,"%")
paste ("MAPE that's Error of Forecasting for ",validation_data_days," days in BATS Model for  ==> ",y_lab, sep=" ")
## [1] "MAPE that's Error of Forecasting for  7  days in BATS Model for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
paste(MAPE_Mean_All.bats,"%")
## [1] "2.028 % MAPE  7 days (Daily Covid 19 Infection cases in Chelyabinsk) %"
paste ("MAPE that's Error of Forecasting day by day for ",validation_data_days," days in BATS Model for  ==> ",y_lab, sep=" ")
## [1] "MAPE that's Error of Forecasting day by day for  7  days in BATS Model for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
print(ascii(data.frame(date_bats=validation_dates,validation_data_by_name,actual_data=testing_data,forecasting_bats=validation_forecast,MAPE_bats_Model)), type = "rest")
## 
## +---+------------+-------------------------+-------------+------------------+-----------------+
## |   | date_bats  | validation_data_by_name | actual_data | forecasting_bats | MAPE_bats_Model |
## +===+============+=========================+=============+==================+=================+
## | 1 | 2021-07-25 | Sunday                  | 315.00      | 314.12           | 0.28 %          |
## +---+------------+-------------------------+-------------+------------------+-----------------+
## | 2 | 2021-07-26 | Monday                  | 321.00      | 316.78           | 1.315 %         |
## +---+------------+-------------------------+-------------+------------------+-----------------+
## | 3 | 2021-07-27 | Tuesday                 | 324.00      | 318.48           | 1.704 %         |
## +---+------------+-------------------------+-------------+------------------+-----------------+
## | 4 | 2021-07-28 | Wednesday               | 329.00      | 320.86           | 2.475 %         |
## +---+------------+-------------------------+-------------+------------------+-----------------+
## | 5 | 2021-07-29 | Thursday                | 331.00      | 322.97           | 2.425 %         |
## +---+------------+-------------------------+-------------+------------------+-----------------+
## | 6 | 2021-07-30 | Friday                  | 335.00      | 325.12           | 2.95 %          |
## +---+------------+-------------------------+-------------+------------------+-----------------+
## | 7 | 2021-07-31 | Saturday                | 338.00      | 327.70           | 3.047 %         |
## +---+------------+-------------------------+-------------+------------------+-----------------+
print(ascii(data.frame(FD,forecating_date=forecasting_data_by_name,forecasting_by_bats=tail(forecasting_bats$mean,N_forecasting_days),lower=tail(forecasting_bats$lower,N_forecasting_days),Upper=tail(forecasting_bats$lower,N_forecasting_days))), type = "rest")
## 
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## |   | FD         | forecating_date | forecasting_by_bats | lower.80. | lower.95. | Upper.80. | Upper.95. |
## +===+============+=================+=====================+===========+===========+===========+===========+
## | 1 | 2021-08-01 | Sunday          | 329.36              | 299.23    | 283.28    | 299.23    | 283.28    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 2 | 2021-08-02 | Monday          | 331.59              | 299.18    | 282.02    | 299.18    | 282.02    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 3 | 2021-08-03 | Tuesday         | 333.20              | 298.49    | 280.12    | 298.49    | 280.12    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 4 | 2021-08-04 | Wednesday       | 334.84              | 297.76    | 278.13    | 297.76    | 278.13    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 5 | 2021-08-05 | Thursday        | 336.76              | 297.60    | 276.87    | 297.60    | 276.87    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 6 | 2021-08-06 | Friday          | 338.01              | 296.48    | 274.50    | 296.48    | 274.50    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 7 | 2021-08-07 | Saturday        | 339.90              | 296.20    | 273.07    | 296.20    | 273.07    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
plot(forecasting_bats)
x1_test <- ts(testing_data, start =(rows-validation_data_days+1) )
lines(x1_test, col='red',lwd=2)

graph2<-autoplot(forecasting_bats,xlab = paste ("Time in", frequency ,y_lab , sep=" "), ylab=y_lab)
graph2+scale_y_continuous(labels = scales::comma)+
  forecast::autolayer(forecasting_bats$mean, series="BATS 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"))

###############
## TBATS Model#
###############
# Data Modeling
data_series<-ts(training_data)
model_TBATS<-forecast:::fitSpecificTBATS(data_series,use.box.cox=FALSE, use.beta=TRUE,  seasonal.periods=c(6),use.damping=FALSE,k.vector=c(2))
accuracy(model_TBATS)  # accuracy on training data
##                     ME     RMSE     MAE MPE MAPE     MASE        ACF1
## Training set 0.2301264 10.10564 5.55011 NaN  Inf 1.004172 0.003646674
# Print Model Parameters
model_TBATS
## TBATS(1, {0,0}, 1, {<6,2>})
## 
## Call: NULL
## 
## Parameters
##   Alpha: 0.7796876
##   Beta: 0.0344705
##   Damping Parameter: 1
##   Gamma-1 Values: -0.001547862
##   Gamma-2 Values: 0.001337259
## 
## Seed States:
##            [,1]
## [1,] -6.7533183
## [2,]  0.3487651
## [3,]  1.0349772
## [4,] -0.4017906
## [5,]  0.1867790
## [6,]  0.6643893
## 
## Sigma: 10.10564
## AIC: 5440.398
plot(model_TBATS,xlab = paste ("Time in", frequency ,y_lab , sep=" "), ylab=y_lab)

# Testing Data Evaluation
forecasting_tbats <- predict(model_TBATS, h=N_forecasting_days+validation_data_days)
validation_forecast<-head(forecasting_tbats$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 TBATS Model for  ==> ",y_lab, sep=" ")
## [1] "MAPE % For  7 days by using TBATS Model for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
MAPE_Mean_All.TBATS_Model<-round(mean(MAPE_Per_Day),3)
MAPE_Mean_All.TBATS<-paste(round(mean(MAPE_Per_Day),3),"% MAPE ",validation_data_days,frequency,y_lab,sep=" ")
MAPE_TBATS<-paste(round(MAPE_Per_Day,3),"%")
MAPE_TBATS_Model<-paste(MAPE_Per_Day ,"%")
paste (" MAPE that's Error of Forecasting for ",validation_data_days," days in TBATS Model for  ==> ",y_lab, sep=" ")
## [1] " MAPE that's Error of Forecasting for  7  days in TBATS Model for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
paste(MAPE_Mean_All.TBATS,"%")
## [1] "0.584 % MAPE  7 days (Daily Covid 19 Infection cases in Chelyabinsk) %"
paste ("MAPE that's Error of Forecasting day by day for ",validation_data_days," days in TBATS Model for  ==> ",y_lab, sep=" ")
## [1] "MAPE that's Error of Forecasting day by day for  7  days in TBATS Model for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
print(ascii(data.frame(date_TBATS=validation_dates,validation_data_by_name,actual_data=testing_data,forecasting_TBATS=validation_forecast,MAPE_TBATS_Model)), type = "rest")
## 
## +---+------------+-------------------------+-------------+-------------------+------------------+
## |   | date_TBATS | validation_data_by_name | actual_data | forecasting_TBATS | MAPE_TBATS_Model |
## +===+============+=========================+=============+===================+==================+
## | 1 | 2021-07-25 | Sunday                  | 315.00      | 313.62            | 0.438 %          |
## +---+------------+-------------------------+-------------+-------------------+------------------+
## | 2 | 2021-07-26 | Monday                  | 321.00      | 317.30            | 1.152 %          |
## +---+------------+-------------------------+-------------+-------------------+------------------+
## | 3 | 2021-07-27 | Tuesday                 | 324.00      | 323.18            | 0.253 %          |
## +---+------------+-------------------------+-------------+-------------------+------------------+
## | 4 | 2021-07-28 | Wednesday               | 329.00      | 327.00            | 0.607 %          |
## +---+------------+-------------------------+-------------+-------------------+------------------+
## | 5 | 2021-07-29 | Thursday                | 331.00      | 332.27            | 0.384 %          |
## +---+------------+-------------------------+-------------+-------------------+------------------+
## | 6 | 2021-07-30 | Friday                  | 335.00      | 337.71            | 0.81 %           |
## +---+------------+-------------------------+-------------+-------------------+------------------+
## | 7 | 2021-07-31 | Saturday                | 338.00      | 339.51            | 0.447 %          |
## +---+------------+-------------------------+-------------+-------------------+------------------+
print(ascii(data.frame(FD,forecating_date=forecasting_data_by_name,forecasting_by_TBATS=tail(forecasting_tbats$mean,N_forecasting_days),Lower=tail(forecasting_tbats$lower,N_forecasting_days),Upper=tail(forecasting_tbats$upper,N_forecasting_days))), type = "rest")
## 
## +---+------------+-----------------+----------------------+-----------+-----------+-----------+-----------+
## |   | FD         | forecating_date | forecasting_by_TBATS | Lower.80. | Lower.95. | Upper.80. | Upper.95. |
## +===+============+=================+======================+===========+===========+===========+===========+
## | 1 | 2021-08-01 | Sunday          | 343.19               | 313.69    | 298.08    | 372.69    | 388.30    |
## +---+------------+-----------------+----------------------+-----------+-----------+-----------+-----------+
## | 2 | 2021-08-02 | Monday          | 349.07               | 317.95    | 301.47    | 380.20    | 396.67    |
## +---+------------+-----------------+----------------------+-----------+-----------+-----------+-----------+
## | 3 | 2021-08-03 | Tuesday         | 352.89               | 320.22    | 302.93    | 385.57    | 402.86    |
## +---+------------+-----------------+----------------------+-----------+-----------+-----------+-----------+
## | 4 | 2021-08-04 | Wednesday       | 358.16               | 324.01    | 305.94    | 392.31    | 410.39    |
## +---+------------+-----------------+----------------------+-----------+-----------+-----------+-----------+
## | 5 | 2021-08-05 | Thursday        | 363.60               | 328.06    | 309.24    | 399.15    | 417.97    |
## +---+------------+-----------------+----------------------+-----------+-----------+-----------+-----------+
## | 6 | 2021-08-06 | Friday          | 365.40               | 328.52    | 309.00    | 402.28    | 421.80    |
## +---+------------+-----------------+----------------------+-----------+-----------+-----------+-----------+
## | 7 | 2021-08-07 | Saturday        | 369.08               | 330.91    | 310.71    | 407.25    | 427.45    |
## +---+------------+-----------------+----------------------+-----------+-----------+-----------+-----------+
plot(forecasting_tbats)
x1_test <- ts(testing_data, start =(rows-validation_data_days+1) )
lines(x1_test, col='red',lwd=2)

graph3<-autoplot(forecasting_tbats,xlab = paste ("Time in", frequency ,y_lab , sep=" "), ylab=y_lab)
graph3+scale_y_continuous(labels = scales::comma)+
  forecast::autolayer(forecasting_tbats$mean, series="TBATS 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"))

#######################
## Holt's linear trend#
#######################
# Data Modeling
data_series<-ts(training_data)
model_holt<-holt(data_series,h=N_forecasting_days+validation_data_days,lambda = "auto")
accuracy(model_holt)  # accuracy on training data
##                     ME     RMSE      MAE  MPE MAPE     MASE        ACF1
## Training set 0.2230251 10.18832 5.402464 -Inf  Inf 0.977458 0.003585629
# Print Model Parameters
summary(model_holt$model)
## Holt's method 
## 
## Call:
##  holt(y = data_series, h = N_forecasting_days + validation_data_days,  
## 
##  Call:
##      lambda = "auto") 
## 
##   Box-Cox transformation: lambda= 1 
## 
##   Smoothing parameters:
##     alpha = 0.7766 
##     beta  = 0.0342 
## 
##   Initial states:
##     l = -1.5417 
##     b = 0.5614 
## 
##   sigma:  10.2287
## 
##      AIC     AICc      BIC 
## 5438.490 5438.611 5459.563 
## 
## Training set error measures:
##                     ME     RMSE      MAE  MPE MAPE     MASE        ACF1
## Training set 0.2230251 10.18832 5.402464 -Inf  Inf 0.977458 0.003585629
# Testing Data Evaluation
forecasting_holt <- predict(model_holt, h=N_forecasting_days+validation_data_days,lambda = "auto")
validation_forecast<-head(forecasting_holt$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 holt's Linear trend Model for  ==> ",y_lab, sep=" ")
## [1] "MAPE % For  7 days by using holt's Linear trend Model for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
MAPE_Mean_All.Holt_Model<-round(mean(MAPE_Per_Day),3)
MAPE_Mean_All.Holt<-paste(round(mean(MAPE_Per_Day),3),"% MAPE ",validation_data_days,frequency,y_lab,sep=" ")
MAPE_holt<-paste(round(MAPE_Per_Day,3),"%")
MAPE_holt_Model<-paste(MAPE_Per_Day ,"%")
paste (" MAPE that's Error of Forecasting for ",validation_data_days," days in holt's Linear trend Model for  ==> ",y_lab, sep=" ")
## [1] " MAPE that's Error of Forecasting for  7  days in holt's Linear trend Model for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
paste(MAPE_Mean_All.Holt,"%")
## [1] "0.501 % MAPE  7 days (Daily Covid 19 Infection cases in Chelyabinsk) %"
paste ("MAPE that's Error of Forecasting day by day for ",validation_data_days," days in holt's Linear trend  Model for  ==> ",y_lab, sep=" ")
## [1] "MAPE that's Error of Forecasting day by day for  7  days in holt's Linear trend  Model for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
print(ascii(data.frame(date_holt=validation_dates,validation_data_by_name,actual_data=testing_data,forecasting_holt=validation_forecast,MAPE_holt_Model)), type = "rest")
## 
## +---+------------+-------------------------+-------------+------------------+-----------------+
## |   | date_holt  | validation_data_by_name | actual_data | forecasting_holt | MAPE_holt_Model |
## +===+============+=========================+=============+==================+=================+
## | 1 | 2021-07-25 | Sunday                  | 315.00      | 315.90           | 0.287 %         |
## +---+------------+-------------------------+-------------+------------------+-----------------+
## | 2 | 2021-07-26 | Monday                  | 321.00      | 320.28           | 0.225 %         |
## +---+------------+-------------------------+-------------+------------------+-----------------+
## | 3 | 2021-07-27 | Tuesday                 | 324.00      | 324.65           | 0.201 %         |
## +---+------------+-------------------------+-------------+------------------+-----------------+
## | 4 | 2021-07-28 | Wednesday               | 329.00      | 329.03           | 0.008 %         |
## +---+------------+-------------------------+-------------+------------------+-----------------+
## | 5 | 2021-07-29 | Thursday                | 331.00      | 333.40           | 0.726 %         |
## +---+------------+-------------------------+-------------+------------------+-----------------+
## | 6 | 2021-07-30 | Friday                  | 335.00      | 337.78           | 0.829 %         |
## +---+------------+-------------------------+-------------+------------------+-----------------+
## | 7 | 2021-07-31 | Saturday                | 338.00      | 342.15           | 1.228 %         |
## +---+------------+-------------------------+-------------+------------------+-----------------+
print(ascii(data.frame(FD,forecating_date=forecasting_data_by_name,forecasting_by_holt=tail(forecasting_holt$mean,N_forecasting_days),Lower=tail(forecasting_holt$lower,N_forecasting_days),Upper=tail(forecasting_holt$upper,N_forecasting_days))), type = "rest")
## 
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## |   | FD         | forecating_date | forecasting_by_holt | Lower.80. | Lower.95. | Upper.80. | Upper.95. |
## +===+============+=================+=====================+===========+===========+===========+===========+
## | 1 | 2021-08-01 | Sunday          | 346.53              | 312.16    | 293.96    | 380.89    | 399.09    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 2 | 2021-08-02 | Monday          | 350.90              | 313.88    | 294.28    | 387.92    | 407.52    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 3 | 2021-08-03 | Tuesday         | 355.27              | 315.62    | 294.62    | 394.93    | 415.93    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 4 | 2021-08-04 | Wednesday       | 359.65              | 317.37    | 294.98    | 401.93    | 424.32    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 5 | 2021-08-05 | Thursday        | 364.02              | 319.12    | 295.35    | 408.93    | 432.70    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 6 | 2021-08-06 | Friday          | 368.40              | 320.88    | 295.72    | 415.92    | 441.08    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 7 | 2021-08-07 | Saturday        | 372.77              | 322.63    | 296.08    | 422.92    | 449.46    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
plot(forecasting_holt)
x1_test <- ts(testing_data, start =(rows-validation_data_days+1) )
lines(x1_test, col='red',lwd=2)

graph4<-autoplot(forecasting_holt,xlab = paste ("Time in", frequency ,y_lab , sep=" "),  ylab=y_lab)
graph4+scale_y_continuous(labels = scales::comma)+
  forecast::autolayer(forecasting_holt$mean, series="Holt's Linear Trend 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"))

##################
#Auto arima model#
##################
paste ("tests For Check Stationarity in series  ==> ",y_lab, sep=" ")
## [1] "tests For Check Stationarity in series  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
kpss.test(data_series) # applay kpss test
## Warning in kpss.test(data_series): p-value smaller than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  data_series
## KPSS Level = 2.5989, Truncation lag parameter = 5, p-value = 0.01
pp.test(data_series)   # applay pp test
## 
##  Phillips-Perron Unit Root Test
## 
## data:  data_series
## Dickey-Fuller Z(alpha) = -3.0132, Truncation lag parameter = 5, p-value
## = 0.9336
## alternative hypothesis: stationary
adf.test(data_series)  # applay adf test
## 
##  Augmented Dickey-Fuller Test
## 
## data:  data_series
## Dickey-Fuller = -1.3447, Lag order = 7, p-value = 0.8557
## alternative hypothesis: stationary
ndiffs(data_series)    # Doing first diffrencing on data
## [1] 1
#Taking the first difference
diff1_x1<-diff(data_series)
autoplot(diff1_x1, xlab = paste ("Time in", frequency ,y_lab , sep=" "), ylab=y_lab,main = "1nd differenced series")

##Testing the stationary of the first differenced series
paste ("tests For Check Stationarity in series after taking first differences in  ==> ",y_lab, sep=" ")
## [1] "tests For Check Stationarity in series after taking first differences in  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
kpss.test(diff1_x1)   # applay kpss test after taking first differences
## Warning in kpss.test(diff1_x1): p-value greater than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  diff1_x1
## KPSS Level = 0.21315, Truncation lag parameter = 5, p-value = 0.1
pp.test(diff1_x1)     # applay pp test after taking first differences
## Warning in pp.test(diff1_x1): p-value smaller than printed p-value
## 
##  Phillips-Perron Unit Root Test
## 
## data:  diff1_x1
## Dickey-Fuller Z(alpha) = -587.94, Truncation lag parameter = 5, p-value
## = 0.01
## alternative hypothesis: stationary
adf.test(diff1_x1)    # applay adf test after taking first differences
## Warning in adf.test(diff1_x1): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff1_x1
## Dickey-Fuller = -6.3002, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
#Taking the second difference
diff2_x1=diff(diff1_x1)
autoplot(diff2_x1, xlab = paste ("Time in", frequency ,y_lab , sep=" "), ylab=y_lab ,main = "2nd differenced series")

##Testing the stationary of the first differenced series
paste ("tests For Check Stationarity in series after taking Second differences in",y_lab, sep=" ")
## [1] "tests For Check Stationarity in series after taking Second differences in (Daily Covid 19 Infection cases in Chelyabinsk)"
kpss.test(diff2_x1)   # applay kpss test after taking Second differences
## Warning in kpss.test(diff2_x1): p-value greater than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  diff2_x1
## KPSS Level = 0.0063281, Truncation lag parameter = 5, p-value = 0.1
pp.test(diff2_x1)     # applay pp test after taking Second differences
## Warning in pp.test(diff2_x1): p-value smaller than printed p-value
## 
##  Phillips-Perron Unit Root Test
## 
## data:  diff2_x1
## Dickey-Fuller Z(alpha) = -675.61, Truncation lag parameter = 5, p-value
## = 0.01
## alternative hypothesis: stationary
adf.test(diff2_x1)    # applay adf test after taking Second differences
## Warning in adf.test(diff2_x1): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff2_x1
## Dickey-Fuller = -15.468, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
####Fitting an ARIMA Model
#1. Using auto arima function
model1 <- auto.arima(data_series,stepwise=FALSE, approximation=FALSE, trace=T, test = c("kpss", "adf", "pp"))  #applaying auto arima
## 
##  ARIMA(0,1,0)                    : 3760.2
##  ARIMA(0,1,0) with drift         : 3760.427
##  ARIMA(0,1,1)                    : 3748.96
##  ARIMA(0,1,1) with drift         : 3748.412
##  ARIMA(0,1,2)                    : 3748.922
##  ARIMA(0,1,2) with drift         : 3748.711
##  ARIMA(0,1,3)                    : 3748.395
##  ARIMA(0,1,3) with drift         : 3747.91
##  ARIMA(0,1,4)                    : 3749.388
##  ARIMA(0,1,4) with drift         : 3748.808
##  ARIMA(0,1,5)                    : 3737.529
##  ARIMA(0,1,5) with drift         : 3737.239
##  ARIMA(1,1,0)                    : 3747.519
##  ARIMA(1,1,0) with drift         : 3747.024
##  ARIMA(1,1,1)                    : 3748.832
##  ARIMA(1,1,1) with drift         : 3748.455
##  ARIMA(1,1,2)                    : 3750.324
##  ARIMA(1,1,2) with drift         : 3750.112
##  ARIMA(1,1,3)                    : 3750.267
##  ARIMA(1,1,3) with drift         : 3749.763
##  ARIMA(1,1,4)                    : 3744.125
##  ARIMA(1,1,4) with drift         : 3743.516
##  ARIMA(2,1,0)                    : 3748.577
##  ARIMA(2,1,0) with drift         : 3748.288
##  ARIMA(2,1,1)                    : 3750.61
##  ARIMA(2,1,1) with drift         : 3750.328
##  ARIMA(2,1,2)                    : 3719.943
##  ARIMA(2,1,2) with drift         : 3719.84
##  ARIMA(2,1,3)                    : 3738.997
##  ARIMA(2,1,3) with drift         : 3738.402
##  ARIMA(3,1,0)                    : 3750.61
##  ARIMA(3,1,0) with drift         : 3750.32
##  ARIMA(3,1,1)                    : 3752.4
##  ARIMA(3,1,1) with drift         : 3751.96
##  ARIMA(3,1,2)                    : Inf
##  ARIMA(3,1,2) with drift         : Inf
##  ARIMA(4,1,0)                    : 3744.318
##  ARIMA(4,1,0) with drift         : 3743.36
##  ARIMA(4,1,1)                    : 3738.131
##  ARIMA(4,1,1) with drift         : 3737.347
##  ARIMA(5,1,0)                    : 3735.152
##  ARIMA(5,1,0) with drift         : 3734.942
## 
## 
## 
##  Best model: ARIMA(2,1,2) with drift
model1 # show the result of autoarima 
## Series: data_series 
## ARIMA(2,1,2) with drift 
## 
## Coefficients:
##           ar1      ar2     ma1     ma2   drift
##       -1.6380  -0.9635  1.5557  0.8952  0.6240
## s.e.   0.0196   0.0186  0.0313  0.0342  0.4259
## 
## sigma^2 estimated as 99.58:  log likelihood=-1853.83
## AIC=3719.67   AICc=3719.84   BIC=3744.94
#Make changes in the source of auto arima to run the best model
arima.string <- function (object, padding = FALSE) 
{
  order <- object$arma[c(1, 6, 2, 3, 7, 4, 5)]
  m <- order[7]
  result <- paste("ARIMA(", order[1], ",", order[2], ",", 
                  order[3], ")", sep = "")
  if (m > 1 && sum(order[4:6]) > 0) {
    result <- paste(result, "(", order[4], ",", order[5], 
                    ",", order[6], ")[", m, "]", sep = "")
  }
  if (padding && m > 1 && sum(order[4:6]) == 0) {
    result <- paste(result, "         ", sep = "")
    if (m <= 9) {
      result <- paste(result, " ", sep = "")
    }
    else if (m <= 99) {
      result <- paste(result, "  ", sep = "")
    }
    else {
      result <- paste(result, "   ", sep = "")
    }
  }
  if (!is.null(object$xreg)) {
    if (NCOL(object$xreg) == 1 && is.element("drift", names(object$coef))) {
      result <- paste(result, "with drift        ")
    }
    else {
      result <- paste("Regression with", result, "errors")
    }
  }
  else {
    if (is.element("constant", names(object$coef)) || is.element("intercept", 
                                                                 names(object$coef))) {
      result <- paste(result, "with non-zero mean")
    }
    else if (order[2] == 0 && order[5] == 0) {
      result <- paste(result, "with zero mean    ")
    }
    else {
      result <- paste(result, "                  ")
    }
  }
  if (!padding) {
    result <- gsub("[ ]*$", "", result)
  }
  return(result)
}


bestmodel <- arima.string(model1, padding = TRUE)
bestmodel <- substring(bestmodel,7,11)
bestmodel <- gsub(" ", "", bestmodel)
bestmodel <- gsub(")", "", bestmodel)
bestmodel <- strsplit(bestmodel, ",")[[1]]
bestmodel <- c(strtoi(bestmodel[1]),strtoi(bestmodel[2]),strtoi(bestmodel[3]))
bestmodel
## [1] 2 1 2
strtoi(bestmodel[3])
## [1] 2
#2. Using ACF and PACF Function
#par(mfrow=c(1,2))  # Code for making two plot in one graph 
acf(diff2_x1,xlab = paste ("Time in", frequency ,y_lab , sep=" ") , ylab=y_lab, main=paste("ACF-2nd differenced series ",y_lab, sep=" ",lag.max=20))    # plot ACF "auto correlation function after taking second diffrences

pacf(diff2_x1,xlab = paste ("Time in", frequency ,y_lab , sep=" "), ylab=y_lab,main=paste("PACF-2nd differenced series ",y_lab, sep=" ",lag.max=20))   # plot PACF " Partial auto correlation function after taking second diffrences

x1_model1= arima(data_series, order=c(bestmodel)) # Run Best model of auto arima  for forecasting
x1_model1  # Show result of best model of auto arima 
## 
## Call:
## arima(x = data_series, order = c(bestmodel))
## 
## Coefficients:
##           ar1      ar2     ma1     ma2
##       -1.6379  -0.9636  1.5562  0.8959
## s.e.   0.0197   0.0185  0.0311  0.0340
## 
## sigma^2 estimated as 99:  log likelihood = -1854.91,  aic = 3719.82
paste ("accuracy of autoarima Model For  ==> ",y_lab, sep=" ")
## [1] "accuracy of autoarima Model For  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
accuracy(x1_model1)  # aacuracy of best model from auto arima
##                     ME     RMSE      MAE MPE MAPE     MASE        ACF1
## Training set 0.6507405 9.940167 5.570409 NaN  Inf 1.007844 -0.02903287
x1_model1$x          # show result of best model from auto arima 
## NULL
checkresiduals(x1_model1,xlab = paste ("Time in", frequency ,y_lab , sep=" "), ylab=y_lab)  # checkresiduals from best model from using auto arima 

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(2,1,2)
## Q* = 21.049, df = 6, p-value = 0.001798
## 
## Model df: 4.   Total lags used: 10
paste("Box-Ljung test , Ljung-Box test For Modelling for   ==> ",y_lab, sep=" ")
## [1] "Box-Ljung test , Ljung-Box test For Modelling for   ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
Box.test(x1_model1$residuals^2, lag=20, type="Ljung-Box")   # Do test for resdulas by using Box-Ljung test , Ljung-Box test For Modelling
## 
##  Box-Ljung test
## 
## data:  x1_model1$residuals^2
## X-squared = 333.26, df = 20, p-value < 2.2e-16
jarque.bera.test(x1_model1$residuals)  # Do test jarque.bera.test 
## 
##  Jarque Bera Test
## 
## data:  x1_model1$residuals
## X-squared = 3824.7, df = 2, p-value < 2.2e-16
#Actual Vs Fitted
plot(data_series, col='red',lwd=2, main="Actual vs Fitted Plot", xlab='Time in (days)', ylab=y_lab) # plot actual and Fitted model 
lines(fitted(x1_model1), col='black')

#Test data
x1_test <- ts(testing_data, start =(rows-validation_data_days+1) ) # make testing data in time series 
forecasting_auto_arima <- forecast(x1_model1, h=N_forecasting_days+validation_data_days)
validation_forecast<-head(forecasting_auto_arima$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 bats Model for  ==> ",y_lab, sep=" ")
## [1] "MAPE % For  7 days by using bats Model for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
MAPE_Mean_All.ARIMA_Model<-round(mean(MAPE_Per_Day),3)
MAPE_Mean_All.ARIMA<-paste(round(mean(MAPE_Per_Day),3),"% MAPE ",validation_data_days,frequency,y_lab,sep=" ")
MAPE_auto_arima<-paste(round(MAPE_Per_Day,3),"%")
MAPE_auto.arima_Model<-paste(MAPE_Per_Day ,"%")
paste (" MAPE that's Error of Forecasting for ",validation_data_days," days in bats Model for  ==> ",y_lab, sep=" ")
## [1] " MAPE that's Error of Forecasting for  7  days in bats Model for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
paste(MAPE_Mean_All.ARIMA,"%")
## [1] "4.744 % MAPE  7 days (Daily Covid 19 Infection cases in Chelyabinsk) %"
paste ("MAPE that's Error of Forecasting day by day for ",validation_data_days," days in bats Model for  ==> ",y_lab, sep=" ")
## [1] "MAPE that's Error of Forecasting day by day for  7  days in bats Model for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
print(ascii(data.frame(date_auto.arima=validation_dates,validation_data_by_name,actual_data=testing_data,forecasting_auto.arima=validation_forecast,MAPE_auto.arima_Model)), type = "rest")
## 
## +---+-----------------+-------------------------+-------------+------------------------+-----------------------+
## |   | date_auto.arima | validation_data_by_name | actual_data | forecasting_auto.arima | MAPE_auto.arima_Model |
## +===+=================+=========================+=============+========================+=======================+
## | 1 | 2021-07-25      | Sunday                  | 315.00      | 311.63                 | 1.069 %               |
## +---+-----------------+-------------------------+-------------+------------------------+-----------------------+
## | 2 | 2021-07-26      | Monday                  | 321.00      | 312.13                 | 2.764 %               |
## +---+-----------------+-------------------------+-------------+------------------------+-----------------------+
## | 3 | 2021-07-27      | Tuesday                 | 324.00      | 311.67                 | 3.805 %               |
## +---+-----------------+-------------------------+-------------+------------------------+-----------------------+
## | 4 | 2021-07-28      | Wednesday               | 329.00      | 311.94                 | 5.185 %               |
## +---+-----------------+-------------------------+-------------+------------------------+-----------------------+
## | 5 | 2021-07-29      | Thursday                | 331.00      | 311.94                 | 5.759 %               |
## +---+-----------------+-------------------------+-------------+------------------------+-----------------------+
## | 6 | 2021-07-30      | Friday                  | 335.00      | 311.68                 | 6.961 %               |
## +---+-----------------+-------------------------+-------------+------------------------+-----------------------+
## | 7 | 2021-07-31      | Saturday                | 338.00      | 312.10                 | 7.662 %               |
## +---+-----------------+-------------------------+-------------+------------------------+-----------------------+
print(ascii(data.frame(FD,forecating_date=forecasting_data_by_name,forecasting_by_auto.arima=tail(forecasting_auto_arima$mean,N_forecasting_days),Lower=tail(forecasting_auto_arima$lower,N_forecasting_days),Upper=tail(forecasting_auto_arima$upper,N_forecasting_days))), type = "rest")
## 
## +---+------------+-----------------+---------------------------+-----------+-----------+-----------+-----------+
## |   | FD         | forecating_date | forecasting_by_auto.arima | Lower.80. | Lower.95. | Upper.80. | Upper.95. |
## +===+============+=================+===========================+===========+===========+===========+===========+
## | 1 | 2021-08-01 | Sunday          | 311.66                    | 276.93    | 258.55    | 346.38    | 364.77    |
## +---+------------+-----------------+---------------------------+-----------+-----------+-----------+-----------+
## | 2 | 2021-08-02 | Monday          | 311.98                    | 275.22    | 255.75    | 348.75    | 368.21    |
## +---+------------+-----------------+---------------------------+-----------+-----------+-----------+-----------+
## | 3 | 2021-08-03 | Tuesday         | 311.88                    | 273.18    | 252.69    | 350.59    | 371.08    |
## +---+------------+-----------------+---------------------------+-----------+-----------+-----------+-----------+
## | 4 | 2021-08-04 | Wednesday       | 311.73                    | 271.04    | 249.50    | 352.43    | 373.97    |
## +---+------------+-----------------+---------------------------+-----------+-----------+-----------+-----------+
## | 5 | 2021-08-05 | Thursday        | 312.07                    | 269.71    | 247.28    | 354.44    | 376.86    |
## +---+------------+-----------------+---------------------------+-----------+-----------+-----------+-----------+
## | 6 | 2021-08-06 | Friday          | 311.66                    | 267.46    | 244.06    | 355.86    | 379.26    |
## +---+------------+-----------------+---------------------------+-----------+-----------+-----------+-----------+
## | 7 | 2021-08-07 | Saturday        | 312.01                    | 266.20    | 241.96    | 357.81    | 382.06    |
## +---+------------+-----------------+---------------------------+-----------+-----------+-----------+-----------+
plot(forecasting_auto_arima)
x1_test <- ts(testing_data, start =(rows-validation_data_days+1) )
lines(x1_test, col='red',lwd=2)

graph5<-autoplot(forecasting_auto_arima,xlab = paste ("Time in", frequency ,y_lab , sep=" "), ylab=y_lab)
graph5+scale_y_continuous(labels = scales::comma)+
  forecast::autolayer(forecasting_auto_arima$mean, series="auto.arima 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"))

#########################################################################################
# Returns local linear forecasts and prediction intervals using cubic smoothing splines.#
# Testing Data Evaluation                                                               #
#########################################################################################
forecasting_splinef <- splinef(original_data,h=N_forecasting_days+validation_data_days)
summary(forecasting_splinef)
## 
## Forecast method: Cubic Smoothing Spline
## 
## Model Information:
## $beta
## [1] 13.03238
## 
## $call
## splinef(y = original_data, h = N_forecasting_days + validation_data_days)
## 
## 
## Error measures:
##                      ME     RMSE      MAE  MPE MAPE    MASE      ACF1
## Training set 0.03719775 11.15907 5.537464 -Inf  Inf 1.00645 0.2139956
## 
## Forecasts:
##     Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
## 508       342.2448 327.8995 356.5901 320.3055 364.1840
## 509       345.8382 328.2202 363.4563 318.8937 372.7827
## 510       349.4317 327.5488 371.3146 315.9647 382.8987
## 511       353.0251 326.1017 379.9486 311.8493 394.2010
## 512       356.6186 323.9845 389.2526 306.7091 406.5281
## 513       360.2120 321.3190 399.1050 300.7303 419.6937
## 514       363.8055 318.1655 409.4455 294.0051 433.6058
## 515       367.3989 314.5669 420.2309 286.5994 448.1984
## 516       370.9924 310.5555 431.4292 278.5621 463.4226
## 517       374.5858 306.1552 443.0164 269.9303 479.2414
## 518       378.1793 301.4053 454.9532 260.7636 495.5949
## 519       381.7727 296.3160 467.2295 251.0779 512.4675
## 520       385.3662 290.8962 479.8361 240.8868 529.8455
## 521       388.9596 285.1600 492.7593 230.2117 547.7075
validation_forecast<-head(forecasting_splinef$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 cubic smoothing splines Model for  ==> ",y_lab, sep=" ")
## [1] "MAPE % For  7 days by using cubic smoothing splines Model for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
MAPE_Mean_All.splinef_Model<-round(mean(MAPE_Per_Day),3)
MAPE_Mean_All.splinef<-paste(round(mean(MAPE_Per_Day),3),"% MAPE ",validation_data_days,frequency,y_lab,sep=" ")
MAPE_splinef<-paste(round(MAPE_Per_Day,3),"%")
MAPE_splinef_Model<-paste(MAPE_Per_Day ,"%")
paste (" MAPE that's Error of Forecasting for ",validation_data_days," days in cubic smoothing splines Model for  ==> ",y_lab, sep=" ")
## [1] " MAPE that's Error of Forecasting for  7  days in cubic smoothing splines Model for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
paste(MAPE_Mean_All.splinef,"%")
## [1] "7.777 % MAPE  7 days (Daily Covid 19 Infection cases in Chelyabinsk) %"
paste ("MAPE that's Error of Forecasting day by day for ",validation_data_days," days in cubic smoothing splines Model for  ==> ",y_lab, sep=" ")
## [1] "MAPE that's Error of Forecasting day by day for  7  days in cubic smoothing splines Model for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
print(ascii(data.frame(date_splinef=validation_dates,validation_data_by_name,actual_data=testing_data,forecasting_splinef=validation_forecast,MAPE_splinef_Model)), type = "rest")
## 
## +---+--------------+-------------------------+-------------+----------+--------------------+
## |   | date_splinef | validation_data_by_name | actual_data | Series.1 | MAPE_splinef_Model |
## +===+==============+=========================+=============+==========+====================+
## | 1 | 2021-07-25   | Sunday                  | 315.00      | 342.24   | 8.649 %            |
## +---+--------------+-------------------------+-------------+----------+--------------------+
## | 2 | 2021-07-26   | Monday                  | 321.00      | 345.84   | 7.738 %            |
## +---+--------------+-------------------------+-------------+----------+--------------------+
## | 3 | 2021-07-27   | Tuesday                 | 324.00      | 349.43   | 7.849 %            |
## +---+--------------+-------------------------+-------------+----------+--------------------+
## | 4 | 2021-07-28   | Wednesday               | 329.00      | 353.03   | 7.302 %            |
## +---+--------------+-------------------------+-------------+----------+--------------------+
## | 5 | 2021-07-29   | Thursday                | 331.00      | 356.62   | 7.74 %             |
## +---+--------------+-------------------------+-------------+----------+--------------------+
## | 6 | 2021-07-30   | Friday                  | 335.00      | 360.21   | 7.526 %            |
## +---+--------------+-------------------------+-------------+----------+--------------------+
## | 7 | 2021-07-31   | Saturday                | 338.00      | 363.81   | 7.635 %            |
## +---+--------------+-------------------------+-------------+----------+--------------------+
print(ascii(data.frame(FD,forecating_date=forecasting_data_by_name,forecasting_by_splinef=tail(forecasting_splinef$mean,N_forecasting_days),Lower=tail(forecasting_holt$lower,N_forecasting_days),Upper=tail(forecasting_holt$upper,N_forecasting_days))), type = "rest")
## 
## +---+------------+-----------------+----------+-----------+-----------+-----------+-----------+
## |   | FD         | forecating_date | Series.1 | Lower.80. | Lower.95. | Upper.80. | Upper.95. |
## +===+============+=================+==========+===========+===========+===========+===========+
## | 1 | 2021-08-01 | Sunday          | 367.40   | 312.16    | 293.96    | 380.89    | 399.09    |
## +---+------------+-----------------+----------+-----------+-----------+-----------+-----------+
## | 2 | 2021-08-02 | Monday          | 370.99   | 313.88    | 294.28    | 387.92    | 407.52    |
## +---+------------+-----------------+----------+-----------+-----------+-----------+-----------+
## | 3 | 2021-08-03 | Tuesday         | 374.59   | 315.62    | 294.62    | 394.93    | 415.93    |
## +---+------------+-----------------+----------+-----------+-----------+-----------+-----------+
## | 4 | 2021-08-04 | Wednesday       | 378.18   | 317.37    | 294.98    | 401.93    | 424.32    |
## +---+------------+-----------------+----------+-----------+-----------+-----------+-----------+
## | 5 | 2021-08-05 | Thursday        | 381.77   | 319.12    | 295.35    | 408.93    | 432.70    |
## +---+------------+-----------------+----------+-----------+-----------+-----------+-----------+
## | 6 | 2021-08-06 | Friday          | 385.37   | 320.88    | 295.72    | 415.92    | 441.08    |
## +---+------------+-----------------+----------+-----------+-----------+-----------+-----------+
## | 7 | 2021-08-07 | Saturday        | 388.96   | 322.63    | 296.08    | 422.92    | 449.46    |
## +---+------------+-----------------+----------+-----------+-----------+-----------+-----------+
plot(forecasting_splinef)
x1_test <- ts(testing_data, start =(rows-validation_data_days+1) )
lines(x1_test, col='red',lwd=2)

graph6<-autoplot(forecasting_splinef,xlab = paste ("Time in", frequency ,y_lab , sep=" "),  ylab=y_lab)
graph6+scale_y_continuous(labels = scales::comma)+
  forecast::autolayer(forecasting_splinef$mean, series="cubic smoothing splines 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"))

######################
#Ensembling (Average)#
######################
re_NNAR<-forecasting_NNAR$mean
re_BATS<-forecasting_bats$mean
re_TBATS<-forecasting_tbats$mean
re_holt<-forecasting_holt$mean
re_autoarima<-forecasting_auto_arima$mean
splinef_model<-data.frame(forecasting_splinef)
splinef<-splinef_model$Point.Forecast
result_df<-data.frame(re_NNAR,re_BATS,re_TBATS,re_holt,re_autoarima,splinef)
average_models<-rowMeans(result_df)
# Testing Data Evaluation
Ensembling_average1<-head(average_models,validation_data_days)
MAPE_Per_Day<-round(abs(((testing_data-Ensembling_average1)/testing_data)*100)  ,3)
paste ("MAPE % For ",validation_data_days,frequency,"by using Ensembling (Average) for  ==> ",y_lab, sep=" ")
## [1] "MAPE % For  7 days by using Ensembling (Average) for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
MAPE_Mean_EnsemblingAverage<-round(mean(MAPE_Per_Day),3)
MAPE_Mean_Ensembling<-paste(round(mean(MAPE_Per_Day),3),"% MAPE ",validation_data_days,frequency,y_lab,sep=" ")
MAPE_Ensembling<-paste(round(MAPE_Per_Day,3),"%")
MAPE_Ensembling_Model<-paste(MAPE_Per_Day ,"%")
paste (" MAPE that's Error of Forecasting for ",validation_data_days," days in Ensembling Model for  ==> ",y_lab, sep=" ")
## [1] " MAPE that's Error of Forecasting for  7  days in Ensembling Model for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
paste(MAPE_Mean_EnsemblingAverage,"%")
## [1] "0.912 %"
paste ("MAPE that's Error of Forecasting day by day for ",validation_data_days," days in Ensembling (Average) for  ==> ",y_lab, sep=" ")
## [1] "MAPE that's Error of Forecasting day by day for  7  days in Ensembling (Average) for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
print(ascii(data.frame(date_Ensembling=validation_dates,validation_data_by_name,actual_data=testing_data,Ensembling=Ensembling_average1,MAPE_Ensembling)), type = "rest")
## 
## +---+-----------------+-------------------------+-------------+------------+-----------------+
## |   | date_Ensembling | validation_data_by_name | actual_data | Ensembling | MAPE_Ensembling |
## +===+=================+=========================+=============+============+=================+
## | 1 | 2021-07-25      | Sunday                  | 315.00      | 318.80     | 1.206 %         |
## +---+-----------------+-------------------------+-------------+------------+-----------------+
## | 2 | 2021-07-26      | Monday                  | 321.00      | 321.40     | 0.124 %         |
## +---+-----------------+-------------------------+-------------+------------+-----------------+
## | 3 | 2021-07-27      | Tuesday                 | 324.00      | 323.78     | 0.068 %         |
## +---+-----------------+-------------------------+-------------+------------+-----------------+
## | 4 | 2021-07-28      | Wednesday               | 329.00      | 325.90     | 0.943 %         |
## +---+-----------------+-------------------------+-------------+------------+-----------------+
## | 5 | 2021-07-29      | Thursday                | 331.00      | 328.10     | 0.877 %         |
## +---+-----------------+-------------------------+-------------+------------+-----------------+
## | 6 | 2021-07-30      | Friday                  | 335.00      | 330.28     | 1.409 %         |
## +---+-----------------+-------------------------+-------------+------------+-----------------+
## | 7 | 2021-07-31      | Saturday                | 338.00      | 332.06     | 1.756 %         |
## +---+-----------------+-------------------------+-------------+------------+-----------------+
print(ascii(data.frame(FD,forecating_date=forecasting_data_by_name,Ensembling_Average=tail(average_models,N_forecasting_days))), type = "rest")
## 
## +---+------------+-----------------+--------------------+
## |   | FD         | forecating_date | Ensembling_Average |
## +===+============+=================+====================+
## | 1 | 2021-08-01 | Sunday          | 333.91             |
## +---+------------+-----------------+--------------------+
## | 2 | 2021-08-02 | Monday          | 336.39             |
## +---+------------+-----------------+--------------------+
## | 3 | 2021-08-03 | Tuesday         | 338.40             |
## +---+------------+-----------------+--------------------+
## | 4 | 2021-08-04 | Wednesday       | 340.70             |
## +---+------------+-----------------+--------------------+
## | 5 | 2021-08-05 | Thursday        | 343.20             |
## +---+------------+-----------------+--------------------+
## | 6 | 2021-08-06 | Friday          | 344.88             |
## +---+------------+-----------------+--------------------+
## | 7 | 2021-08-07 | Saturday        | 347.14             |
## +---+------------+-----------------+--------------------+
#############################
#Ensembling (weight average)#
#############################
weight.model<-0.90#  priotizer the weights ( weight average)
re_NNAR<-forecasting_NNAR$mean
re_BATS<-forecasting_bats$mean
re_TBATS<-forecasting_tbats$mean
re_holt<-forecasting_holt$mean
re_autoarima<-forecasting_auto_arima$mean
re_splinef<-c(forecasting_splinef$mean)
re_bestmodel<-min(MAPE_Mean_All_NNAR,MAPE_Mean_All.bats_Model,MAPE_Mean_All.TBATS_Model,MAPE_Mean_All.Holt_Model,MAPE_Mean_All.ARIMA_Model,MAPE_Mean_All.splinef_Model)
y1<-if(re_bestmodel >= MAPE_Mean_All.bats_Model) {re_BATS*weight.model
} else {
  (re_BATS*(1-weight.model))/5
}

y2<-if(re_bestmodel >= MAPE_Mean_All.TBATS_Model) {re_TBATS*weight.model
} else {
  (re_TBATS*(1-weight.model))/5
}

y3<-if(re_bestmodel >= MAPE_Mean_All.Holt_Model) {re_holt*weight.model
} else {
  (re_holt*(1-weight.model))/5
}
y4<-if(re_bestmodel >= MAPE_Mean_All.ARIMA_Model) {re_autoarima*weight.model
} else {
  (re_autoarima*(1-weight.model))/5
}
y5<-if(re_bestmodel >= MAPE_Mean_All_NNAR) {re_NNAR*weight.model
} else {
  (re_NNAR*(1-weight.model))/5
}
y6<-if(re_bestmodel >= MAPE_Mean_All.splinef_Model) {re_splinef*weight.model
} else {
  (splinef*(1-weight.model))/5
}
Ensembling.weight<-(y1+y2+y3+y4+y5+y6)
# Testing Data Evaluation
validation_forecast2<-head(Ensembling.weight,validation_data_days)
MAPE_Per_Day<-round(abs(((testing_data-validation_forecast2)/testing_data)*100)  ,3)
paste ("MAPE % For ",validation_data_days,frequency,"by using Ensembling (weight average) for  ==> ",y_lab, sep=" ")
## [1] "MAPE % For  7 days by using Ensembling (weight average) for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
MAPE_Mean_EnsemblingAverage1<-round(mean(MAPE_Per_Day),3)
MAPE_Mean_Ensembling<-paste(round(mean(MAPE_Per_Day),3),"% MAPE ",validation_data_days,frequency,y_lab,sep=" ")
MAPE_Ensembling<-paste(round(MAPE_Per_Day,3),"%")
MAPE_Ensembling_Model<-paste(MAPE_Per_Day ,"%")
paste (" MAPE that's Error of Forecasting for ",validation_data_days," days in Ensembling weight average for  ==> ",y_lab, sep=" ")
## [1] " MAPE that's Error of Forecasting for  7  days in Ensembling weight average for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
paste(MAPE_Mean_EnsemblingAverage1,"%")
## [1] "0.403 %"
paste ("MAPE that's Error of Forecasting day by day for ",validation_data_days," days in Ensembling weight average for  ==> ",y_lab, sep=" ")
## [1] "MAPE that's Error of Forecasting day by day for  7  days in Ensembling weight average for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
print(ascii(data.frame(date_Ensembling=validation_dates,validation_data_by_name,actual_data=testing_data,Ensembling=validation_forecast2,MAPE_Ensembling)), type = "rest")
## 
## +---+-----------------+-------------------------+-------------+------------+-----------------+
## |   | date_Ensembling | validation_data_by_name | actual_data | Ensembling | MAPE_Ensembling |
## +===+=================+=========================+=============+============+=================+
## | 1 | 2021-07-25      | Sunday                  | 315.00      | 316.25     | 0.397 %         |
## +---+-----------------+-------------------------+-------------+------------+-----------------+
## | 2 | 2021-07-26      | Monday                  | 321.00      | 320.41     | 0.183 %         |
## +---+-----------------+-------------------------+-------------+------------+-----------------+
## | 3 | 2021-07-27      | Tuesday                 | 324.00      | 324.55     | 0.169 %         |
## +---+-----------------+-------------------------+-------------+------------+-----------------+
## | 4 | 2021-07-28      | Wednesday               | 329.00      | 328.65     | 0.106 %         |
## +---+-----------------+-------------------------+-------------+------------+-----------------+
## | 5 | 2021-07-29      | Thursday                | 331.00      | 332.77     | 0.533 %         |
## +---+-----------------+-------------------------+-------------+------------+-----------------+
## | 6 | 2021-07-30      | Friday                  | 335.00      | 336.88     | 0.56 %          |
## +---+-----------------+-------------------------+-------------+------------+-----------------+
## | 7 | 2021-07-31      | Saturday                | 338.00      | 340.94     | 0.87 %          |
## +---+-----------------+-------------------------+-------------+------------+-----------------+
print(ascii(data.frame(FD,forecating_date=forecasting_data_by_name,forecasting_by_Ensembling=tail(Ensembling.weight,N_forecasting_days))), type = "rest")
## 
## +---+------------+-----------------+---------------------------+
## |   | FD         | forecating_date | forecasting_by_Ensembling |
## +===+============+=================+===========================+
## | 1 | 2021-08-01 | Sunday          | 345.01                    |
## +---+------------+-----------------+---------------------------+
## | 2 | 2021-08-02 | Monday          | 349.16                    |
## +---+------------+-----------------+---------------------------+
## | 3 | 2021-08-03 | Tuesday         | 353.25                    |
## +---+------------+-----------------+---------------------------+
## | 4 | 2021-08-04 | Wednesday       | 357.38                    |
## +---+------------+-----------------+---------------------------+
## | 5 | 2021-08-05 | Thursday        | 361.52                    |
## +---+------------+-----------------+---------------------------+
## | 6 | 2021-08-06 | Friday          | 365.58                    |
## +---+------------+-----------------+---------------------------+
## | 7 | 2021-08-07 | Saturday        | 369.70                    |
## +---+------------+-----------------+---------------------------+
graph8<-autoplot(Ensembling.weight,xlab = paste ("Time in", frequency ,y_lab,"by using Ensembling weight average" , sep=" "), ylab=y_lab)
graph8+scale_y_continuous(labels = scales::comma)+
  forecast::autolayer(Ensembling.weight, series="Ensembling weight average",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"))

# Table for MAPE For counry
best_recommended_model <- min(MAPE_Mean_All_NNAR,MAPE_Mean_All.bats_Model,MAPE_Mean_All.TBATS_Model,MAPE_Mean_All.Holt_Model,MAPE_Mean_All.ARIMA_Model,MAPE_Mean_All.splinef_Model,MAPE_Mean_EnsemblingAverage,MAPE_Mean_EnsemblingAverage1)
paste("System Choose Least Error ==> ( MAPE %) of Forecasting  by using NNAR model, BATS Model, TBATS Model, Holt's Linear Model , autoarima Model, cubic smoothing splines Model, Ensembling (Average), and Ensembling weight average  ,  for  ==> ", y_lab , sep=" ")
## [1] "System Choose Least Error ==> ( MAPE %) of Forecasting  by using NNAR model, BATS Model, TBATS Model, Holt's Linear Model , autoarima Model, cubic smoothing splines Model, Ensembling (Average), and Ensembling weight average  ,  for  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
best_recommended_model
## [1] 0.403
x1<-if(best_recommended_model >= MAPE_Mean_All.bats_Model) {paste("BATS Model")}
x2<-if(best_recommended_model >= MAPE_Mean_All.TBATS_Model) {paste("TBATS Model")}
x3<-if(best_recommended_model >= MAPE_Mean_All.Holt_Model) {paste("Holt Model")}
x4<-if(best_recommended_model >= MAPE_Mean_All.ARIMA_Model) {paste("ARIMA Model")}
x5<-if(best_recommended_model >= MAPE_Mean_All_NNAR) {paste("NNAR Model")}
x6<-if(best_recommended_model >= MAPE_Mean_All.splinef_Model) {paste("cubic smoothing splines")}
x7<-if(best_recommended_model >= MAPE_Mean_EnsemblingAverage) {paste("Ensembling (Average)")}
x8<-if(best_recommended_model >= MAPE_Mean_EnsemblingAverage1) {paste("Ensembling weight average")}
panderOptions('table.split.table', Inf)
paste("Forecasting by using NNAR Model  ==> ", y_lab , sep=" ")
## [1] "Forecasting by using NNAR Model  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
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 | 2021-08-01 | Sunday          | 305.30              |
## +---+------------+-----------------+---------------------+
## | 2 | 2021-08-02 | Monday          | 303.80              |
## +---+------------+-----------------+---------------------+
## | 3 | 2021-08-03 | Tuesday         | 302.59              |
## +---+------------+-----------------+---------------------+
## | 4 | 2021-08-04 | Wednesday       | 301.66              |
## +---+------------+-----------------+---------------------+
## | 5 | 2021-08-05 | Thursday        | 300.96              |
## +---+------------+-----------------+---------------------+
## | 6 | 2021-08-06 | Friday          | 300.46              |
## +---+------------+-----------------+---------------------+
## | 7 | 2021-08-07 | Saturday        | 300.12              |
## +---+------------+-----------------+---------------------+
paste("Forecasting by using BATS Model  ==> ", y_lab , sep=" ")
## [1] "Forecasting by using BATS Model  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
print(ascii(data.frame(FD,forecating_date=forecasting_data_by_name,forecasting_by_bats=tail(forecasting_bats$mean,N_forecasting_days),lower=tail(forecasting_bats$lower,N_forecasting_days),Upper=tail(forecasting_bats$lower,N_forecasting_days))), type = "rest")
## 
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## |   | FD         | forecating_date | forecasting_by_bats | lower.80. | lower.95. | Upper.80. | Upper.95. |
## +===+============+=================+=====================+===========+===========+===========+===========+
## | 1 | 2021-08-01 | Sunday          | 329.36              | 299.23    | 283.28    | 299.23    | 283.28    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 2 | 2021-08-02 | Monday          | 331.59              | 299.18    | 282.02    | 299.18    | 282.02    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 3 | 2021-08-03 | Tuesday         | 333.20              | 298.49    | 280.12    | 298.49    | 280.12    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 4 | 2021-08-04 | Wednesday       | 334.84              | 297.76    | 278.13    | 297.76    | 278.13    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 5 | 2021-08-05 | Thursday        | 336.76              | 297.60    | 276.87    | 297.60    | 276.87    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 6 | 2021-08-06 | Friday          | 338.01              | 296.48    | 274.50    | 296.48    | 274.50    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 7 | 2021-08-07 | Saturday        | 339.90              | 296.20    | 273.07    | 296.20    | 273.07    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
paste("Forecasting by using TBATS Model  ==> ", y_lab , sep=" ")
## [1] "Forecasting by using TBATS Model  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
print(ascii(data.frame(FD,forecating_date=forecasting_data_by_name,forecasting_by_TBATS=tail(forecasting_tbats$mean,N_forecasting_days),Lower=tail(forecasting_tbats$lower,N_forecasting_days),Upper=tail(forecasting_tbats$upper,N_forecasting_days))), type = "rest")
## 
## +---+------------+-----------------+----------------------+-----------+-----------+-----------+-----------+
## |   | FD         | forecating_date | forecasting_by_TBATS | Lower.80. | Lower.95. | Upper.80. | Upper.95. |
## +===+============+=================+======================+===========+===========+===========+===========+
## | 1 | 2021-08-01 | Sunday          | 343.19               | 313.69    | 298.08    | 372.69    | 388.30    |
## +---+------------+-----------------+----------------------+-----------+-----------+-----------+-----------+
## | 2 | 2021-08-02 | Monday          | 349.07               | 317.95    | 301.47    | 380.20    | 396.67    |
## +---+------------+-----------------+----------------------+-----------+-----------+-----------+-----------+
## | 3 | 2021-08-03 | Tuesday         | 352.89               | 320.22    | 302.93    | 385.57    | 402.86    |
## +---+------------+-----------------+----------------------+-----------+-----------+-----------+-----------+
## | 4 | 2021-08-04 | Wednesday       | 358.16               | 324.01    | 305.94    | 392.31    | 410.39    |
## +---+------------+-----------------+----------------------+-----------+-----------+-----------+-----------+
## | 5 | 2021-08-05 | Thursday        | 363.60               | 328.06    | 309.24    | 399.15    | 417.97    |
## +---+------------+-----------------+----------------------+-----------+-----------+-----------+-----------+
## | 6 | 2021-08-06 | Friday          | 365.40               | 328.52    | 309.00    | 402.28    | 421.80    |
## +---+------------+-----------------+----------------------+-----------+-----------+-----------+-----------+
## | 7 | 2021-08-07 | Saturday        | 369.08               | 330.91    | 310.71    | 407.25    | 427.45    |
## +---+------------+-----------------+----------------------+-----------+-----------+-----------+-----------+
paste("Forecasting by using Holt's Linear Trend Model  ==> ", y_lab , sep=" ")
## [1] "Forecasting by using Holt's Linear Trend Model  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
print(ascii(data.frame(FD,forecating_date=forecasting_data_by_name,forecasting_by_holt=tail(forecasting_holt$mean,N_forecasting_days),Lower=tail(forecasting_holt$lower,N_forecasting_days),Upper=tail(forecasting_holt$upper,N_forecasting_days))), type = "rest")
## 
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## |   | FD         | forecating_date | forecasting_by_holt | Lower.80. | Lower.95. | Upper.80. | Upper.95. |
## +===+============+=================+=====================+===========+===========+===========+===========+
## | 1 | 2021-08-01 | Sunday          | 346.53              | 312.16    | 293.96    | 380.89    | 399.09    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 2 | 2021-08-02 | Monday          | 350.90              | 313.88    | 294.28    | 387.92    | 407.52    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 3 | 2021-08-03 | Tuesday         | 355.27              | 315.62    | 294.62    | 394.93    | 415.93    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 4 | 2021-08-04 | Wednesday       | 359.65              | 317.37    | 294.98    | 401.93    | 424.32    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 5 | 2021-08-05 | Thursday        | 364.02              | 319.12    | 295.35    | 408.93    | 432.70    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 6 | 2021-08-06 | Friday          | 368.40              | 320.88    | 295.72    | 415.92    | 441.08    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
## | 7 | 2021-08-07 | Saturday        | 372.77              | 322.63    | 296.08    | 422.92    | 449.46    |
## +---+------------+-----------------+---------------------+-----------+-----------+-----------+-----------+
paste("Forecasting by using ARIMA Model  ==> ", y_lab , sep=" ")
## [1] "Forecasting by using ARIMA Model  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
print(ascii(data.frame(FD,forecating_date=forecasting_data_by_name,forecasting_by_auto.arima=tail(forecasting_auto_arima$mean,N_forecasting_days),Lower=tail(forecasting_auto_arima$lower,N_forecasting_days),Upper=tail(forecasting_auto_arima$upper,N_forecasting_days))), type = "rest")
## 
## +---+------------+-----------------+---------------------------+-----------+-----------+-----------+-----------+
## |   | FD         | forecating_date | forecasting_by_auto.arima | Lower.80. | Lower.95. | Upper.80. | Upper.95. |
## +===+============+=================+===========================+===========+===========+===========+===========+
## | 1 | 2021-08-01 | Sunday          | 311.66                    | 276.93    | 258.55    | 346.38    | 364.77    |
## +---+------------+-----------------+---------------------------+-----------+-----------+-----------+-----------+
## | 2 | 2021-08-02 | Monday          | 311.98                    | 275.22    | 255.75    | 348.75    | 368.21    |
## +---+------------+-----------------+---------------------------+-----------+-----------+-----------+-----------+
## | 3 | 2021-08-03 | Tuesday         | 311.88                    | 273.18    | 252.69    | 350.59    | 371.08    |
## +---+------------+-----------------+---------------------------+-----------+-----------+-----------+-----------+
## | 4 | 2021-08-04 | Wednesday       | 311.73                    | 271.04    | 249.50    | 352.43    | 373.97    |
## +---+------------+-----------------+---------------------------+-----------+-----------+-----------+-----------+
## | 5 | 2021-08-05 | Thursday        | 312.07                    | 269.71    | 247.28    | 354.44    | 376.86    |
## +---+------------+-----------------+---------------------------+-----------+-----------+-----------+-----------+
## | 6 | 2021-08-06 | Friday          | 311.66                    | 267.46    | 244.06    | 355.86    | 379.26    |
## +---+------------+-----------------+---------------------------+-----------+-----------+-----------+-----------+
## | 7 | 2021-08-07 | Saturday        | 312.01                    | 266.20    | 241.96    | 357.81    | 382.06    |
## +---+------------+-----------------+---------------------------+-----------+-----------+-----------+-----------+
paste("Forecasting by using cubic smoothing splines Model  ==> ", y_lab , sep=" ")
## [1] "Forecasting by using cubic smoothing splines Model  ==>  (Daily Covid 19 Infection cases in Chelyabinsk)"
print(ascii(data.frame(FD,forecating_date=forecasting_data_by_name,forecasting_splinef=tail(forecasting_splinef$mean,N_forecasting_days),Lower=tail(forecasting_splinef$lower,N_forecasting_days),Upper=tail(forecasting_splinef$upper,N_forecasting_days))), type = "rest")
## 
## +---+------------+-----------------+----------+----------------+----------------+----------------+----------------+
## |   | FD         | forecating_date | Series.1 | Lower.Series.1 | Lower.Series.2 | Upper.Series.1 | Upper.Series.2 |
## +===+============+=================+==========+================+================+================+================+
## | 1 | 2021-08-01 | Sunday          | 367.40   | 314.57         | 286.60         | 420.23         | 448.20         |
## +---+------------+-----------------+----------+----------------+----------------+----------------+----------------+
## | 2 | 2021-08-02 | Monday          | 370.99   | 310.56         | 278.56         | 431.43         | 463.42         |
## +---+------------+-----------------+----------+----------------+----------------+----------------+----------------+
## | 3 | 2021-08-03 | Tuesday         | 374.59   | 306.16         | 269.93         | 443.02         | 479.24         |
## +---+------------+-----------------+----------+----------------+----------------+----------------+----------------+
## | 4 | 2021-08-04 | Wednesday       | 378.18   | 301.41         | 260.76         | 454.95         | 495.59         |
## +---+------------+-----------------+----------+----------------+----------------+----------------+----------------+
## | 5 | 2021-08-05 | Thursday        | 381.77   | 296.32         | 251.08         | 467.23         | 512.47         |
## +---+------------+-----------------+----------+----------------+----------------+----------------+----------------+
## | 6 | 2021-08-06 | Friday          | 385.37   | 290.90         | 240.89         | 479.84         | 529.85         |
## +---+------------+-----------------+----------+----------------+----------------+----------------+----------------+
## | 7 | 2021-08-07 | Saturday        | 388.96   | 285.16         | 230.21         | 492.76         | 547.71         |
## +---+------------+-----------------+----------+----------------+----------------+----------------+----------------+
print(ascii(data.frame(FD,forecating_date=forecasting_data_by_name,forecasting_by_splinef=tail(forecasting_splinef$mean,N_forecasting_days),Lower=tail(forecasting_holt$lower,N_forecasting_days),Upper=tail(forecasting_holt$upper,N_forecasting_days))), type = "rest")
## 
## +---+------------+-----------------+----------+-----------+-----------+-----------+-----------+
## |   | FD         | forecating_date | Series.1 | Lower.80. | Lower.95. | Upper.80. | Upper.95. |
## +===+============+=================+==========+===========+===========+===========+===========+
## | 1 | 2021-08-01 | Sunday          | 367.40   | 312.16    | 293.96    | 380.89    | 399.09    |
## +---+------------+-----------------+----------+-----------+-----------+-----------+-----------+
## | 2 | 2021-08-02 | Monday          | 370.99   | 313.88    | 294.28    | 387.92    | 407.52    |
## +---+------------+-----------------+----------+-----------+-----------+-----------+-----------+
## | 3 | 2021-08-03 | Tuesday         | 374.59   | 315.62    | 294.62    | 394.93    | 415.93    |
## +---+------------+-----------------+----------+-----------+-----------+-----------+-----------+
## | 4 | 2021-08-04 | Wednesday       | 378.18   | 317.37    | 294.98    | 401.93    | 424.32    |
## +---+------------+-----------------+----------+-----------+-----------+-----------+-----------+
## | 5 | 2021-08-05 | Thursday        | 381.77   | 319.12    | 295.35    | 408.93    | 432.70    |
## +---+------------+-----------------+----------+-----------+-----------+-----------+-----------+
## | 6 | 2021-08-06 | Friday          | 385.37   | 320.88    | 295.72    | 415.92    | 441.08    |
## +---+------------+-----------------+----------+-----------+-----------+-----------+-----------+
## | 7 | 2021-08-07 | Saturday        | 388.96   | 322.63    | 296.08    | 422.92    | 449.46    |
## +---+------------+-----------------+----------+-----------+-----------+-----------+-----------+
result<-c(x1,x2,x3,x4,x5,x6,x7,x8)
table.error<-data.frame(country.name,NNAR.model=MAPE_Mean_All_NNAR, BATS.Model=MAPE_Mean_All.bats_Model,TBATS.Model=MAPE_Mean_All.TBATS_Model,Holt.Model=MAPE_Mean_All.Holt_Model,ARIMA.Model=MAPE_Mean_All.ARIMA_Model,cubic_smoothing.splines=MAPE_Mean_All.splinef_Model,Ensembling_Average=MAPE_Mean_EnsemblingAverage,Ensembling_weight=MAPE_Mean_EnsemblingAverage1,Best.Model=result)
knitr::kable(table.error,caption = paste("Accuracy MAPE % daily Covid-19 infection cases for testing data last" , validation_data_days ,frequency, y_lab , sep=" "))
Accuracy MAPE % daily Covid-19 infection cases for testing data last 7 days (Daily Covid 19 Infection cases in Chelyabinsk)
country.name NNAR.model BATS.Model TBATS.Model Holt.Model ARIMA.Model cubic_smoothing.splines Ensembling_Average Ensembling_weight Best.Model
Chelyabinsk 4.543 2.028 0.584 0.501 4.744 7.777 0.912 0.403 Ensembling weight average
MAPE.Value<-c(MAPE_Mean_All_NNAR,MAPE_Mean_All.bats_Model,MAPE_Mean_All.TBATS_Model,MAPE_Mean_All.Holt_Model,MAPE_Mean_All.ARIMA_Model,MAPE_Mean_All.splinef_Model,MAPE_Mean_EnsemblingAverage,MAPE_Mean_EnsemblingAverage1)
Model<-c("NNAR model","BATS Model","TBATS Model","Holt Model","ARIMA Model","cubic smoothing splines","Ensembling (Average)","Ensembling weight")
channel_data<-data.frame(Model,MAPE.Value)

#comparison and visualization plot accuracy models.
ggplot(channel_data, aes(x = Model, y = MAPE.Value)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = MAPE.Value)) +  # x AND y INHERITED. WE JUST NEED TO SPECIFY "label"
  coord_flip() +
  scale_y_continuous(expand = c(0, 0))

message("System finished Modelling and Forecasting  by using NNAR, BATS, TBATS, Holt's Linear Trend, ARIMA, cubic smoothing splines, Ensembling (Average), and Ensembling weight  ==>",y_lab, sep=" ")
## System finished Modelling and Forecasting  by using NNAR, BATS, TBATS, Holt's Linear Trend, ARIMA, cubic smoothing splines, Ensembling (Average), and Ensembling weight  ==>(Daily Covid 19 Infection cases in Chelyabinsk)
message(" Thank you for using our System For Modelling and Forecasting ==> ",y_lab, sep=" ")
##  Thank you for using our System For Modelling and Forecasting ==> (Daily Covid 19 Infection cases in Chelyabinsk)