Forecasting Rainfall In Egypt by using BATS, TBATS, NNAR, ARIMA and Holt’s Linear trend model

That algorithm contains the best 5 models for forecasting Rainfall In Egypt
Makarovskikh Tatyana Anatolyevna “Макаровских Татьяна Анатольевна”
Abotaleb mostafa “Аботалеб Мостафа”
Department of Electrical Engineering and Computer Science
South ural state university, Chelyabinsk, Russian federation
Pradeep Mishra
Department of Mathematics & Statistics
Jawaharlal Nehru Krishi Vishwavidyalaya, India
# Imports
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)
library(here)
## here() starts at F:/Phd/Rain Water in Egypt
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
#Global variable
Full_original_data <-read.csv("F:/Phd/Rain Water in Egypt/data/rain water.csv")
y_lab<- "Average Rainfall - (MM) In Egypt"   # input name of data
Actual_date_interval <- c("1901/12/31","2016/12/31")
Forecast_date_interval <- c("2017/01/31","2017/12/31")
validation_data_days <-279
frequency<-"month"
# Data Preparation & calculate some of statistics measures
original_data<-(Full_original_data$Rainfall....MM.)
summary(original_data)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##  0.09002  1.15922  2.10026  2.77203  3.48025 23.72680
sd(original_data)  # calculate standard deviation
## [1] 2.466202
skewness(original_data)  # calculate Cofficient of skewness
## [1] 2.463856
kurtosis(original_data)   # calculate Cofficient of kurtosis
## [1] 12.74796
rows <- NROW(original_data)
training_data<-original_data[1:(rows-validation_data_days)]
testing_data<-original_data[(rows-validation_data_days+1):rows]
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)) 
validation_dates<-tail(AD,validation_data_days)
validation_data_by_name<-weekdays(validation_dates)
forecasting_data_by_name<-weekdays(FD)
data_series<-ts(training_data)
#NNAR Model 
model_NNAR<-nnetar(data_series, size = 2)
saveRDS(model_NNAR, file = "model_NNAR.RDS")
my_model <- readRDS("model_NNAR.RDS")
accuracy(model_NNAR)  # accuracy on training data
##                         ME     RMSE      MAE       MPE     MAPE      MASE
## Training set -0.0008149085 1.990764 1.339084 -73.45535 94.55947 0.6105124
##                    ACF1
## Training set 0.02006429
# Print Model Parameters
model_NNAR
## Series: data_series 
## Model:  NNAR(25,2) 
## Call:   nnetar(y = data_series, size = 2)
## 
## Average of 20 networks, each of which is
## a 25-2-1 network with 55 weights
## options were - linear output units 
## 
## sigma^2 estimated as 3.963
# Testing Data Evaluation
forecasting_NNAR <- predict(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  279 month by using NNAR Model for  ==>  Average Rainfall - (MM) In Egypt"
MAPE_Mean_All<-paste(round(mean(MAPE_Per_Day),3),"% MAPE ",validation_data_days,frequency,y_lab,sep=" ")
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  279  days in NNAR Model for  ==>  Average Rainfall - (MM) In Egypt"
paste(MAPE_Mean_All,"%")
## [1] "146.097 % MAPE  279 month Average Rainfall - (MM) In Egypt %"
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  279  days in NNAR Model for  ==>  Average Rainfall - (MM) In Egypt"
plot(forecasting_NNAR)
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=" "),  col.main="black", col.lab="black", col.sub="black", cex.main=1, cex.lab=1, cex.sub=1,font.main=4, font.lab=4, ylab=y_lab)
graph1

saveRDS(model_NNAR, file = "model_NNAR.RDS")
## Error of forecasting
Error_NNAR<-abs(testing_data-validation_forecast)  # Absolute error of forecast (AEOF)
REOF_A_NNAR<-abs(((testing_data-validation_forecast)/testing_data)*100)  #Relative error of forecast (divided by actual)(REOF_A)
REOF_F_NNAR<-abs(((testing_data-validation_forecast)/validation_forecast)*100)  #Relative error of forecast (divided by forecast)(REOF_F)
correlation_NNAR<-cor(testing_data,validation_forecast, method = c("pearson"))     # correlation coefficient between predicted and actual values 
RMSE_NNAR<-sqrt(sum((Error_NNAR^2))/validation_data_days)   #  Root mean square forecast error
MSE_NNAR<-(sum((Error_NNAR^2))/validation_data_days)   #  Root mean square forecast error
MAD_NNAR<-abs((sum(testing_data-validation_forecast))/validation_data_days)   # average forecast accuracy
AEOF_NNAR<-c(Error_NNAR)
REOF_ANNAR<-c(paste(round(REOF_A_NNAR,3),"%"))
REOF_FNNAR<-c(paste(round(REOF_F_NNAR,3),"%"))
data.frame(correlation_NNAR,MSE_NNAR,RMSE_NNAR,MAPE_Mean_All,MAD_NNAR) # analysis of Error  by using NNAR Model shows result of correlation ,MSE ,MPER
##   correlation_NNAR MSE_NNAR RMSE_NNAR
## 1        0.3288594  4.07024  2.017484
##                                                MAPE_Mean_All  MAD_NNAR
## 1 146.097 % MAPE  279 month Average Rainfall - (MM) In Egypt 0.5869489
##bats model
# Data Modeling
data_series<-ts(training_data)
autoplot(ts(original_data) ,xlab=paste ("Time in  ", frequency, sep=" "), ylab = y_lab, main=paste ("Actual Data :", y_lab, sep=" "))

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
## Training set 0.6969259 2.585768 1.596551 -41.22989 81.82567 0.7278963
##                     ACF1
## Training set 0.008805843
# Print Model Parameters
model_bats
## BATS(0.001, {3,1}, -, -)
## 
## Call: bats(y = data_series)
## 
## Parameters
##   Lambda: 0.001118
##   Alpha: 0.0216578
##   AR coefficients: 0.819997 -0.166157 -0.066572
##   MA coefficients: -0.667452
## 
## Seed States:
##           [,1]
## [1,] 0.9941995
## [2,] 0.0000000
## [3,] 0.0000000
## [4,] 0.0000000
## [5,] 0.0000000
## attr(,"lambda")
## [1] 0.001117534
## 
## Sigma: 0.8014665
## AIC: 8949.284
plot(model_bats,xlab = paste ("Time in",frequency ,y_lab , sep=" "),  col.main="black", col.lab="black", col.sub="black", cex.main=1, cex.lab=1, cex.sub=1,font.main=4, font.lab=4)

# 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  279 month by using bats Model for  ==>  Average Rainfall - (MM) In Egypt"
MAPE_Mean_All<-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  279  days in bats Model for  ==>  Average Rainfall - (MM) In Egypt"
paste(MAPE_Mean_All,"%")
## [1] "104.867 % MAPE  279 month Average Rainfall - (MM) In Egypt %"
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  279  days in bats Model for  ==>  Average Rainfall - (MM) In Egypt"
par(bg = "#F5F5F5")
plot(forecasting_bats)
x1_test <- ts(testing_data, start =(rows-validation_data_days+1) )
lines(x1_test, col='red',lwd=2)

graph1<-autoplot(forecasting_bats,xlab = paste ("Time in  ", frequency ,y_lab , sep=" "),  col.main="black", col.lab="blue", col.sub="black", cex.main=1, cex.lab=1, cex.sub=1,font.main=4, font.lab=4, ylab=y_lab)
graph1

## Error of forecasting
Error_bats<-abs(testing_data-validation_forecast)  # Absolute error of forecast (AEOF)
MSE_Bats<-((sum(Error_bats^2)/validation_data_days))
MSE_Bats
## [1] 4.219481
REOF_A_bats<-abs(((testing_data-validation_forecast)/testing_data)*100)  #Relative error of forecast (divided by actual)(REOF_A)
REOF_F_bats<-abs(((testing_data-validation_forecast)/validation_forecast)*100)  #Relative error of forecast (divided by forecast)(REOF_F)
correlation_bats<-cor(testing_data,validation_forecast, method = c("pearson"))     # correlation coefficient between predicted and actual values 
RMSE_bats<-sqrt(sum((Error_bats^2))/validation_data_days)   #  Root mean square forecast error
MAD_bats<-abs((sum(testing_data-validation_forecast))/validation_data_days)   # average forecast accuracy
AEOF_bats<-c(Error_bats)
REOF_Abats<-c(paste(round(REOF_A_bats,3),"%"))
REOF_Fbats<-c(paste(round(REOF_F_bats,3),"%"))
data.frame(correlation_bats,RMSE_bats,MAPE_Mean_All,MAD_bats) # analysis of Error  by using Bats Model shows result of correlation ,MSE ,MPER
##   correlation_bats RMSE_bats
## 1       0.06133969  2.054138
##                                                MAPE_Mean_All  MAD_bats
## 1 104.867 % MAPE  279 month Average Rainfall - (MM) In Egypt 0.3497803
## 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.07732442 2.560841 1.786943 -78.1541 109.2773 0.8146995 0.1089734
# Print Model Parameters
model_TBATS
## TBATS(1, {0,0}, 1, {<6,2>})
## 
## Call: NULL
## 
## Parameters
##   Alpha: 0.08391584
##   Beta: 0.004256946
##   Damping Parameter: 1
##   Gamma-1 Values: 0.0007324185
##   Gamma-2 Values: 0.002158919
## 
## Seed States:
##             [,1]
## [1,]  5.13130984
## [2,] -0.35706247
## [3,]  0.83815101
## [4,]  0.05626826
## [5,] -0.15465285
## [6,]  0.20866529
## 
## Sigma: 2.560841
## AIC: 9920.676
plot(model_TBATS,xlab = paste ("Time in  ", frequency ,y_lab , sep=" "),  col.main="black", col.lab="black", col.sub="black", cex.main=1, cex.lab=1, cex.sub=1,font.main=4, font.lab=4, 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  279 month by using TBATS Model for  ==>  Average Rainfall - (MM) In Egypt"
MAPE_Mean_All<-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  279  days in TBATS Model for  ==>  Average Rainfall - (MM) In Egypt"
paste(MAPE_Mean_All,"%")
## [1] "266.145 % MAPE  279 month Average Rainfall - (MM) In Egypt %"
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  279  days in TBATS Model for  ==>  Average Rainfall - (MM) In Egypt"
plot(forecasting_tbats)
x1_test <- ts(testing_data, start =(rows-validation_data_days+1) )
lines(x1_test, col='red',lwd=2)

graph2<-autoplot(forecasting_tbats,xlab = paste ("Time in  ", frequency ,y_lab , sep=" "),  col.main="black", col.lab="blue", col.sub="black", cex.main=1, cex.lab=1, cex.sub=1,font.main=4, font.lab=4, ylab=y_lab)
graph2

## Error of forecasting TBATS Model
Error_tbats<-abs(testing_data-validation_forecast)  # Absolute error of forecast (AEOF)
sqrt(sum(Error_tbats^2)/validation_data_days)
## [1] 2.993632
REOF_A_tbats1<-abs(((testing_data-validation_forecast)/testing_data)*100)  #Relative error of forecast (divided by actual)(REOF_A)
REOF_F_tbats<-abs(((testing_data-validation_forecast)/validation_forecast)*100)  #Relative error of forecast (divided by forecast)(REOF_F)
correlation_tbats<-cor(testing_data,validation_forecast, method = c("pearson"))     # correlation coefficient between predicted and actual values 
RMSE_tbats<-sqrt(sum((Error_tbats^2))/validation_data_days)   #  Root mean square forecast error
MAD_tbats<-abs((sum(testing_data-validation_forecast))/validation_data_days)   # average forecast accuracy
AEOF_tbats<-c(Error_tbats)
REOF_A_tbats<-c(paste(round(REOF_A_tbats1,3),"%"))
REOF_F_tbats<-c(paste(round(REOF_F_tbats,3),"%"))
data.frame(correlation_tbats,RMSE_tbats,MAPE_Mean_All,MAD_tbats) # analysis of Error  by using Holt's linear model shows result of correlation ,MSE ,MPER
##   correlation_tbats RMSE_tbats
## 1         0.1784506   2.993632
##                                                MAPE_Mean_All MAD_tbats
## 1 266.145 % MAPE  279 month Average Rainfall - (MM) In Egypt  2.150012
## 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.841245 2.670937 1.645376 -36.80145 81.65181 0.7501562 0.1232587
# 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= -0.1044 
## 
##   Smoothing parameters:
##     alpha = 0.0153 
##     beta  = 1e-04 
## 
##   Initial states:
##     l = 0.9983 
##     b = -5e-04 
## 
##   sigma:  0.7772
## 
##      AIC     AICc      BIC 
## 7252.354 7252.408 7277.428 
## 
## Training set error measures:
##                    ME     RMSE      MAE       MPE     MAPE      MASE      ACF1
## Training set 0.841245 2.670937 1.645376 -36.80145 81.65181 0.7501562 0.1232587
# 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 Model for  ==> ",y_lab, sep=" ")
## [1] "MAPE % For  279 month by using holt Model for  ==>  Average Rainfall - (MM) In Egypt"
MAPE_Mean_All<-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 Model for  ==> ",y_lab, sep=" ")
## [1] " MAPE that's Error of Forecasting for  279  days in holt Model for  ==>  Average Rainfall - (MM) In Egypt"
paste(MAPE_Mean_All,"%")
## [1] "108.079 % MAPE  279 month Average Rainfall - (MM) In Egypt %"
paste ("MAPE that's Error of Forecasting day by day for ",validation_data_days," days in holt Model for  ==> ",y_lab, sep=" ")
## [1] "MAPE that's Error of Forecasting day by day for  279  days in holt Model for  ==>  Average Rainfall - (MM) In Egypt"
plot(forecasting_holt,ylim=c(0,20))
x1_test <- ts(testing_data, start =(rows-validation_data_days+1) )
lines(x1_test, col='red',lwd=2)

graph3<-autoplot(forecasting_holt,xlab = paste ("Time in  ", frequency ,y_lab , sep=" "),  col.main="black", col.lab="blue", col.sub="black", cex.main=1, cex.lab=1, cex.sub=1,font.main=4, font.lab=4, ylab=y_lab, ylim=c(0,20))
graph3

## Error of forecasting by using Holt's linear model
Error_Holt<-abs(testing_data-validation_forecast)  # Absolute error of forecast (AEOF)
sqrt(sum(Error_Holt^2)/validation_data_days)
## [1] 2.048031
REOF_A_Holt1<-abs(((testing_data-validation_forecast)/testing_data)*100)  #Relative error of forecast (divided by actual)(REOF_A)
REOF_F_Holt<-abs(((testing_data-validation_forecast)/validation_forecast)*100)  #Relative error of forecast (divided by forecast)(REOF_F)
correlation_Holt<-cor(testing_data,validation_forecast, method = c("pearson"))     # correlation coefficient between predicted and actual values 
RMSE_Holt<-sqrt(sum((Error_Holt^2))/validation_data_days)   #  Root mean square forecast error
MAD_Holt<-abs((sum(testing_data-validation_forecast))/validation_data_days)   # average forecast accuracy
AEOF_Holt<-c(Error_Holt)
REOF_A_Holt<-c(paste(round(REOF_A_Holt1,3),"%"))
REOF_F_Holt<-c(paste(round(REOF_F_Holt,3),"%"))
REOF_A_Holt11<-mean(abs(((testing_data-validation_forecast)/testing_data)*100))
data.frame(correlation_Holt,RMSE_Holt,MAPE_Mean_All,MAD_Holt) # analysis of Error  by using Holt's linear model shows result of correlation ,MSE ,MPER
##   correlation_Holt RMSE_Holt
## 1      0.001042441  2.048031
##                                                MAPE_Mean_All  MAD_Holt
## 1 108.079 % MAPE  279 month Average Rainfall - (MM) In Egypt 0.2968722
##################
#ARIMA Model
require(tseries) # need to install tseries tj test Stationarity in time series 
paste ("tests For Check Stationarity in series  ==> ",y_lab, sep=" ")
## [1] "tests For Check Stationarity in series  ==>  Average Rainfall - (MM) In Egypt"
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 = 1.0065, Truncation lag parameter = 7, p-value = 0.01
pp.test(data_series)   # applay pp test
## Warning in pp.test(data_series): p-value smaller than printed p-value
## 
##  Phillips-Perron Unit Root Test
## 
## data:  data_series
## Dickey-Fuller Z(alpha) = -871.96, Truncation lag parameter = 7, p-value
## = 0.01
## alternative hypothesis: stationary
adf.test(data_series)  # applay adf test
## Warning in adf.test(data_series): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  data_series
## Dickey-Fuller = -9.5506, Lag order = 10, p-value = 0.01
## 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=" "),  col.main="black", col.lab="black", col.sub="black",  ylab=y_lab,main = "1nd differenced series")
## Warning: Ignoring unknown parameters: col.main, col.lab, col.sub

##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  ==>  Average Rainfall - (MM) In Egypt"
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.013801, Truncation lag parameter = 7, 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) = -1302.3, Truncation lag parameter = 7, 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 = -24.701, Lag order = 10, 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=" "),  col.main="black", col.lab="black", col.sub="black", ylab=y_lab ,main = "2nd differenced series")
## Warning: Ignoring unknown parameters: col.main, col.lab, col.sub

##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 Average Rainfall - (MM) In Egypt"
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.014869, Truncation lag parameter = 7, 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) = -1593.8, Truncation lag parameter = 7, 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 = -23.165, Lag order = 10, 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)                    : 5836.636
##  ARIMA(0,1,0) with drift         : 5838.633
##  ARIMA(0,1,1)                    : 5237.635
##  ARIMA(0,1,1) with drift         : 5239.34
##  ARIMA(0,1,2)                    : 5223.895
##  ARIMA(0,1,2) with drift         : Inf
##  ARIMA(0,1,3)                    : Inf
##  ARIMA(0,1,3) with drift         : Inf
##  ARIMA(0,1,4)                    : 5215.82
##  ARIMA(0,1,4) with drift         : Inf
##  ARIMA(0,1,5)                    : 5202.892
##  ARIMA(0,1,5) with drift         : 5204.662
##  ARIMA(1,1,0)                    : 5575.081
##  ARIMA(1,1,0) with drift         : 5577.079
##  ARIMA(1,1,1)                    : Inf
##  ARIMA(1,1,1) with drift         : Inf
##  ARIMA(1,1,2)                    : Inf
##  ARIMA(1,1,2) with drift         : Inf
##  ARIMA(1,1,3)                    : Inf
##  ARIMA(1,1,3) with drift         : Inf
##  ARIMA(1,1,4)                    : 5197.98
##  ARIMA(1,1,4) with drift         : 5199.776
##  ARIMA(2,1,0)                    : 5525.909
##  ARIMA(2,1,0) with drift         : 5527.911
##  ARIMA(2,1,1)                    : Inf
##  ARIMA(2,1,1) with drift         : Inf
##  ARIMA(2,1,2)                    : 5212.798
##  ARIMA(2,1,2) with drift         : 5214.588
##  ARIMA(2,1,3)                    : Inf
##  ARIMA(2,1,3) with drift         : Inf
##  ARIMA(3,1,0)                    : 5488.79
##  ARIMA(3,1,0) with drift         : 5490.796
##  ARIMA(3,1,1)                    : 5212.569
##  ARIMA(3,1,1) with drift         : 5214.244
##  ARIMA(3,1,2)                    : 5191.777
##  ARIMA(3,1,2) with drift         : 5193.616
##  ARIMA(4,1,0)                    : 5437.232
##  ARIMA(4,1,0) with drift         : 5439.243
##  ARIMA(4,1,1)                    : 5203.876
##  ARIMA(4,1,1) with drift         : 5205.602
##  ARIMA(5,1,0)                    : 5420.249
##  ARIMA(5,1,0) with drift         : 5422.264
## 
## 
## 
##  Best model: ARIMA(3,1,2)
model1 # show the result of autoarima 
## Series: data_series 
## ARIMA(3,1,2) 
## 
## Coefficients:
##          ar1      ar2      ar3      ma1     ma2
##       0.8226  -0.0269  -0.1564  -1.7079  0.7128
## s.e.  0.0615   0.0395   0.0308   0.0560  0.0555
## 
## sigma^2 estimated as 6.178:  log likelihood=-2589.85
## AIC=5191.7   AICc=5191.78   BIC=5221.78
#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] 3 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=" "),  col.main="black", col.lab="black", col.sub="black", cex.main=1, cex.lab=1, cex.sub=1,font.main=4, font.lab=4, 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

library(forecast)   # install library forecast             
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      ar3      ma1     ma2
##       0.8226  -0.0269  -0.1564  -1.7079  0.7128
## s.e.  0.0615   0.0395   0.0308   0.0560  0.0555
## 
## sigma^2 estimated as 6.151:  log likelihood = -2589.85,  aic = 5191.7
paste ("accuracy of autoarima Model For  ==> ",y_lab, sep=" ")
## [1] "accuracy of autoarima Model For  ==>  Average Rainfall - (MM) In Egypt"
accuracy(x1_model1)  # aacuracy of best model from auto arima
##                       ME     RMSE      MAE       MPE     MAPE      MASE
## Training set -0.05932172 2.478917 1.720522 -94.03555 119.6028 0.7844166
##                     ACF1
## Training set 0.001905031
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(3,1,2)
## Q* = 4.4631, df = 5, p-value = 0.4848
## 
## Model df: 5.   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   ==>  Average Rainfall - (MM) In Egypt"
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 = 38.613, df = 20, p-value = 0.007446
library(tseries)
jarque.bera.test(x1_model1$residuals)  # Do test jarque.bera.test 
## 
##  Jarque Bera Test
## 
## data:  x1_model1$residuals
## X-squared = 5742.9, 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 and start from rows-6
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  279 month by using bats Model for  ==>  Average Rainfall - (MM) In Egypt"
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  279  days in bats Model for  ==>  Average Rainfall - (MM) In Egypt"
paste(MAPE_Mean_All.ARIMA,"%")
## [1] "170.734 % MAPE  279 month Average Rainfall - (MM) In Egypt %"
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  279  days in bats Model for  ==>  Average Rainfall - (MM) In Egypt"
data.frame(date_auto.arima=validation_dates,validation_data_by_name,actual_data=testing_data,forecasting_auto.arima=validation_forecast,MAPE_auto.arima_Model)
##     date_auto.arima validation_data_by_name actual_data forecasting_auto.arima
## 1        1993-10-31                  Sunday     4.74420               2.052765
## 2        1993-12-01               Wednesday     0.50180               2.551296
## 3        1993-12-31                  Friday     4.47208               3.023406
## 4        1994-01-31                  Monday     8.10726               3.200987
## 5        1994-03-03                Thursday     1.12499               3.256404
## 6        1994-03-31                Thursday     3.53859               3.223390
## 7        1994-05-01                  Sunday     0.50400               3.166974
## 8        1994-05-31                 Tuesday     0.95792               3.112790
## 9        1994-07-01                  Friday     1.29018               3.074900
## 10       1994-07-31                  Sunday     3.86952               3.054011
## 11       1994-08-31               Wednesday     1.46727               3.046321
## 12       1994-10-01                Saturday     0.96778               3.046482
## 13       1994-10-31                  Monday     5.00519               3.050087
## 14       1994-12-01                Thursday    10.49740               3.054251
## 15       1994-12-31                Saturday     4.13700               3.057554
## 16       1995-01-31                 Tuesday     1.00520               3.059595
## 17       1995-03-03                  Friday     4.64740               3.060534
## 18       1995-03-31                  Friday     1.20847               3.060736
## 19       1995-05-01                  Monday     1.63924               3.060556
## 20       1995-05-31               Wednesday     0.95959               3.060257
## 21       1995-07-01                Saturday     1.30764               3.059984
## 22       1995-07-31                  Monday     2.75944               3.059795
## 23       1995-08-31                Thursday     1.55201               3.059694
## 24       1995-10-01                  Sunday     1.68352               3.059659
## 25       1995-10-31                 Tuesday     0.94816               3.059662
## 26       1995-12-01                  Friday     2.06694               3.059682
## 27       1995-12-31                  Sunday     0.85773               3.059703
## 28       1996-01-31               Wednesday     3.92626               3.059720
## 29       1996-03-02                Saturday     1.06618               3.059730
## 30       1996-03-31                  Sunday     3.27342               3.059734
## 31       1996-05-01               Wednesday     2.25442               3.059735
## 32       1996-05-31                  Friday     0.58514               3.059734
## 33       1996-07-01                  Monday     1.29002               3.059732
## 34       1996-07-31               Wednesday     2.41815               3.059731
## 35       1996-08-31                Saturday     1.37331               3.059730
## 36       1996-10-01                 Tuesday     0.79516               3.059730
## 37       1996-10-31                Thursday     1.20975               3.059729
## 38       1996-12-01                  Sunday     2.60112               3.059729
## 39       1996-12-31                 Tuesday     1.12006               3.059730
## 40       1997-01-31                  Friday     3.86200               3.059730
## 41       1997-03-03                  Monday     2.84933               3.059730
## 42       1997-03-31                  Monday     4.21092               3.059730
## 43       1997-05-01                Thursday     0.77283               3.059730
## 44       1997-05-31                Saturday     1.93075               3.059730
## 45       1997-07-01                 Tuesday     1.82400               3.059730
## 46       1997-07-31                Thursday     2.53188               3.059730
## 47       1997-08-31                  Sunday     1.37305               3.059730
## 48       1997-10-01               Wednesday     1.31306               3.059730
## 49       1997-10-31                  Friday     6.88818               3.059730
## 50       1997-12-01                  Monday     1.07951               3.059730
## 51       1997-12-31               Wednesday     2.48236               3.059730
## 52       1998-01-31                Saturday     2.35077               3.059730
## 53       1998-03-03                 Tuesday     3.23532               3.059730
## 54       1998-03-31                 Tuesday     2.65382               3.059730
## 55       1998-05-01                  Friday     3.64956               3.059730
## 56       1998-05-31                  Sunday    11.39700               3.059730
## 57       1998-07-01               Wednesday     1.28964               3.059730
## 58       1998-07-31                  Friday     2.89250               3.059730
## 59       1998-08-31                  Monday     3.33016               3.059730
## 60       1998-10-01                Thursday     2.18281               3.059730
## 61       1998-10-31                Saturday     0.27669               3.059730
## 62       1998-12-01                 Tuesday     1.36996               3.059730
## 63       1998-12-31                Thursday     3.96099               3.059730
## 64       1999-01-31                  Sunday     1.45933               3.059730
## 65       1999-03-03               Wednesday     6.14986               3.059730
## 66       1999-03-31               Wednesday     0.34525               3.059730
## 67       1999-05-01                Saturday     0.87614               3.059730
## 68       1999-05-31                  Monday     3.92148               3.059730
## 69       1999-07-01                Thursday     1.28941               3.059730
## 70       1999-07-31                Saturday     2.75452               3.059730
## 71       1999-08-31                 Tuesday     1.56583               3.059730
## 72       1999-10-01                  Friday     1.30709               3.059730
## 73       1999-10-31                  Sunday     0.40461               3.059730
## 74       1999-12-01               Wednesday     0.79104               3.059730
## 75       1999-12-31                  Friday     1.06074               3.059730
## 76       2000-01-31                  Monday     8.79867               3.059730
## 77       2000-03-02                Thursday     1.96720               3.059730
## 78       2000-03-31                  Friday     0.94208               3.059730
## 79       2000-05-01                  Monday     0.46715               3.059730
## 80       2000-05-31               Wednesday     1.39287               3.059730
## 81       2000-07-01                Saturday     1.28941               3.059730
## 82       2000-07-31                  Monday     2.51911               3.059730
## 83       2000-08-31                Thursday     1.41707               3.059730
## 84       2000-10-01                  Sunday     2.09922               3.059730
## 85       2000-10-31                 Tuesday     3.18534               3.059730
## 86       2000-12-01                  Friday     4.34451               3.059730
## 87       2000-12-31                  Sunday     6.13581               3.059730
## 88       2001-01-31               Wednesday     2.30453               3.059730
## 89       2001-03-03                Saturday     1.98704               3.059730
## 90       2001-03-31                Saturday     1.51554               3.059730
## 91       2001-05-01                 Tuesday     1.02323               3.059730
## 92       2001-05-31                Thursday     0.56850               3.059730
## 93       2001-07-01                  Sunday     1.28941               3.059730
## 94       2001-07-31                 Tuesday     2.51285               3.059730
## 95       2001-08-31                  Friday     1.41755               3.059730
## 96       2001-10-01                  Monday     0.77372               3.059730
## 97       2001-10-31               Wednesday     0.86521               3.059730
## 98       2001-12-01                Saturday     1.40814               3.059730
## 99       2001-12-31                  Monday     3.16058               3.059730
## 100      2002-01-31                Thursday     6.39406               3.059730
## 101      2002-03-03                  Sunday     5.24313               3.059730
## 102      2002-03-31                  Sunday     1.00755               3.059730
## 103      2002-05-01               Wednesday     1.13408               3.059730
## 104      2002-05-31                  Friday     0.50675               3.059730
## 105      2002-07-01                  Monday     1.29804               3.059730
## 106      2002-07-31               Wednesday     2.43717               3.059730
## 107      2002-08-31                Saturday     1.54944               3.059730
## 108      2002-10-01                 Tuesday     0.81303               3.059730
## 109      2002-10-31                Thursday     6.49295               3.059730
## 110      2002-12-01                  Sunday     0.79751               3.059730
## 111      2002-12-31                 Tuesday     3.44896               3.059730
## 112      2003-01-31                  Friday     1.60621               3.059730
## 113      2003-03-03                  Monday     3.74258               3.059730
## 114      2003-03-31                  Monday     3.40988               3.059730
## 115      2003-05-01                Thursday     0.44270               3.059730
## 116      2003-05-31                Saturday     0.56668               3.059730
## 117      2003-07-01                 Tuesday     1.41158               3.059730
## 118      2003-07-31                Thursday     3.09183               3.059730
## 119      2003-08-31                  Sunday     2.91996               3.059730
## 120      2003-10-01               Wednesday     0.78733               3.059730
## 121      2003-10-31                  Friday     0.23788               3.059730
## 122      2003-12-01                  Monday     0.98593               3.059730
## 123      2003-12-31               Wednesday     4.39334               3.059730
## 124      2004-01-31                Saturday     7.90062               3.059730
## 125      2004-03-02                 Tuesday     3.54160               3.059730
## 126      2004-03-31               Wednesday     2.82262               3.059730
## 127      2004-05-01                Saturday     0.37460               3.059730
## 128      2004-05-31                  Monday     0.59284               3.059730
## 129      2004-07-01                Thursday     1.28963               3.059730
## 130      2004-07-31                Saturday     2.51388               3.059730
## 131      2004-08-31                 Tuesday     1.61934               3.059730
## 132      2004-10-01                  Friday     0.90617               3.059730
## 133      2004-10-31                  Sunday     0.32351               3.059730
## 134      2004-12-01               Wednesday     1.60803               3.059730
## 135      2004-12-31                  Friday     2.82753               3.059730
## 136      2005-01-31                  Monday     3.79083               3.059730
## 137      2005-03-03                Thursday     4.93790               3.059730
## 138      2005-03-31                Thursday     5.90618               3.059730
## 139      2005-05-01                  Sunday     5.32605               3.059730
## 140      2005-05-31                 Tuesday     0.37812               3.059730
## 141      2005-07-01                  Friday     1.28955               3.059730
## 142      2005-07-31                  Sunday     3.32937               3.059730
## 143      2005-08-31               Wednesday     1.55622               3.059730
## 144      2005-10-01                Saturday     1.85197               3.059730
## 145      2005-10-31                  Monday     0.54443               3.059730
## 146      2005-12-01                Thursday     1.06465               3.059730
## 147      2005-12-31                Saturday     2.56311               3.059730
## 148      2006-01-31                 Tuesday     3.09579               3.059730
## 149      2006-03-03                  Friday     2.55506               3.059730
## 150      2006-03-31                  Friday     2.62328               3.059730
## 151      2006-05-01                  Monday     3.43886               3.059730
## 152      2006-05-31               Wednesday     0.47531               3.059730
## 153      2006-07-01                Saturday     1.32460               3.059730
## 154      2006-07-31                  Monday     2.44671               3.059730
## 155      2006-08-31                Thursday     1.76639               3.059730
## 156      2006-10-01                  Sunday     0.92156               3.059730
## 157      2006-10-31                 Tuesday     0.74955               3.059730
## 158      2006-12-01                  Friday     0.85919               3.059730
## 159      2006-12-31                  Sunday     2.70497               3.059730
## 160      2007-01-31               Wednesday     3.51390               3.059730
## 161      2007-03-03                Saturday     4.75467               3.059730
## 162      2007-03-31                Saturday     0.86146               3.059730
## 163      2007-05-01                 Tuesday     1.80090               3.059730
## 164      2007-05-31                Thursday     1.45439               3.059730
## 165      2007-07-01                  Sunday     1.50526               3.059730
## 166      2007-07-31                 Tuesday     3.32094               3.059730
## 167      2007-08-31                  Friday     1.92822               3.059730
## 168      2007-10-01                  Monday     1.12446               3.059730
## 169      2007-10-31               Wednesday     1.18441               3.059730
## 170      2007-12-01                Saturday     1.28654               3.059730
## 171      2007-12-31                  Monday     1.60943               3.059730
## 172      2008-01-31                Thursday     7.55999               3.059730
## 173      2008-03-02                  Sunday     3.12595               3.059730
## 174      2008-03-31                  Monday     0.26817               3.059730
## 175      2008-05-01                Thursday     3.13994               3.059730
## 176      2008-05-31                Saturday     0.56320               3.059730
## 177      2008-07-01                 Tuesday     1.28941               3.059730
## 178      2008-07-31                Thursday     2.44671               3.059730
## 179      2008-08-31                  Sunday     1.41721               3.059730
## 180      2008-10-01               Wednesday     2.98817               3.059730
## 181      2008-10-31                  Friday     3.01147               3.059730
## 182      2008-12-01                  Monday     0.30073               3.059730
## 183      2008-12-31               Wednesday     1.89878               3.059730
## 184      2009-01-31                Saturday     4.13442               3.059730
## 185      2009-03-03                 Tuesday     5.61797               3.059730
## 186      2009-03-31                 Tuesday     0.23356               3.059730
## 187      2009-05-01                  Friday     0.14308               3.059730
## 188      2009-05-31                  Sunday     0.54860               3.059730
## 189      2009-07-01               Wednesday     1.28941               3.059730
## 190      2009-07-31                  Friday     2.44671               3.059730
## 191      2009-08-31                  Monday     1.51752               3.059730
## 192      2009-10-01                Thursday     0.79499               3.059730
## 193      2009-10-31                Saturday     0.38449               3.059730
## 194      2009-12-01                 Tuesday     0.60021               3.059730
## 195      2009-12-31                Thursday     5.60057               3.059730
## 196      2010-01-31                  Sunday     2.24212               3.059730
## 197      2010-03-03               Wednesday     2.84198               3.059730
## 198      2010-03-31               Wednesday     0.24605               3.059730
## 199      2010-05-01                Saturday     0.27875               3.059730
## 200      2010-05-31                  Monday     8.83731               3.059730
## 201      2010-07-01                Thursday     1.29149               3.059730
## 202      2010-07-31                Saturday     3.84991               3.059730
## 203      2010-08-31                 Tuesday     8.03098               3.059730
## 204      2010-10-01                  Friday     1.38485               3.059730
## 205      2010-10-31                  Sunday     0.52419               3.059730
## 206      2010-12-01               Wednesday     0.26019               3.059730
## 207      2010-12-31                  Friday     2.52660               3.059730
## 208      2011-01-31                  Monday     1.79052               3.059730
## 209      2011-03-03                Thursday     2.35943               3.059730
## 210      2011-03-31                Thursday     2.76970               3.059730
## 211      2011-05-01                  Sunday     2.99102               3.059730
## 212      2011-05-31                 Tuesday     0.64547               3.059730
## 213      2011-07-01                  Friday     1.64623               3.059730
## 214      2011-07-31                  Sunday     2.50175               3.059730
## 215      2011-08-31               Wednesday     1.44966               3.059730
## 216      2011-10-01                Saturday     1.22527               3.059730
## 217      2011-10-31                  Monday     0.40954               3.059730
## 218      2011-12-01                Thursday     4.53735               3.059730
## 219      2011-12-31                Saturday     1.27885               3.059730
## 220      2012-01-31                 Tuesday     4.50333               3.059730
## 221      2012-03-02                  Friday     2.71883               3.059730
## 222      2012-03-31                Saturday     1.84284               3.059730
## 223      2012-05-01                 Tuesday     0.79004               3.059730
## 224      2012-05-31                Thursday     0.45443               3.059730
## 225      2012-07-01                  Sunday     1.54115               3.059730
## 226      2012-07-31                 Tuesday     2.48006               3.059730
## 227      2012-08-31                  Friday     1.45472               3.059730
## 228      2012-10-01                  Monday     1.08196               3.059730
## 229      2012-10-31               Wednesday     1.25241               3.059730
## 230      2012-12-01                Saturday     2.16875               3.059730
## 231      2012-12-31                  Monday     5.50551               3.059730
## 232      2013-01-31                Thursday     9.83019               3.059730
## 233      2013-03-03                  Sunday     2.08693               3.059730
## 234      2013-03-31                  Sunday     0.75090               3.059730
## 235      2013-05-01               Wednesday     0.97940               3.059730
## 236      2013-05-31                  Friday     0.84011               3.059730
## 237      2013-07-01                  Monday     1.55332               3.059730
## 238      2013-07-31               Wednesday     2.47999               3.059730
## 239      2013-08-31                Saturday     9.08493               3.059730
## 240      2013-10-01                 Tuesday     1.02467               3.059730
## 241      2013-10-31                Thursday     0.31919               3.059730
## 242      2013-12-01                  Sunday     0.58748               3.059730
## 243      2013-12-31                 Tuesday     6.73026               3.059730
## 244      2014-01-31                  Friday     4.49754               3.059730
## 245      2014-03-03                  Monday    11.76580               3.059730
## 246      2014-03-31                  Monday     4.66164               3.059730
## 247      2014-05-01                Thursday     0.81749               3.059730
## 248      2014-05-31                Saturday     3.69818               3.059730
## 249      2014-07-01                 Tuesday     1.55723               3.059730
## 250      2014-07-31                Thursday     3.29754               3.059730
## 251      2014-08-31                  Sunday     1.49722               3.059730
## 252      2014-10-01               Wednesday     0.94467               3.059730
## 253      2014-10-31                  Friday     0.87077               3.059730
## 254      2014-12-01                  Monday     3.63473               3.059730
## 255      2014-12-31               Wednesday     0.71567               3.059730
## 256      2015-01-31                Saturday     3.95595               3.059730
## 257      2015-03-03                 Tuesday     2.71103               3.059730
## 258      2015-03-31                 Tuesday     2.63489               3.059730
## 259      2015-05-01                  Friday     1.57308               3.059730
## 260      2015-05-31                  Sunday     2.02107               3.059730
## 261      2015-07-01               Wednesday     1.94850               3.059730
## 262      2015-07-31                  Friday     2.48587               3.059730
## 263      2015-08-31                  Monday     1.90997               3.059730
## 264      2015-10-01                Thursday     1.23057               3.059730
## 265      2015-10-31                Saturday     6.97369               3.059730
## 266      2015-12-01                 Tuesday     2.78345               3.059730
## 267      2015-12-31                Thursday     3.74498               3.059730
## 268      2016-01-31                  Sunday     5.25677               3.059730
## 269      2016-03-02               Wednesday     1.14635               3.059730
## 270      2016-03-31                Thursday     2.81793               3.059730
## 271      2016-05-01                  Sunday     2.13990               3.059730
## 272      2016-05-31                 Tuesday     0.54040               3.059730
## 273      2016-07-01                  Friday     1.55664               3.059730
## 274      2016-07-31                  Sunday     2.77524               3.059730
## 275      2016-08-31               Wednesday     1.47609               3.059730
## 276      2016-10-01                Saturday     0.87034               3.059730
## 277      2016-10-31                  Monday     3.08796               3.059730
## 278      2016-12-01                Thursday     1.11661               3.059730
## 279      2016-12-31                Saturday     2.59268               3.059730
##     MAPE_auto.arima_Model
## 1                56.731 %
## 2               408.429 %
## 3                32.394 %
## 4                60.517 %
## 5               189.461 %
## 6                 8.908 %
## 7               528.368 %
## 8               224.953 %
## 9               138.331 %
## 10               21.075 %
## 11              107.618 %
## 12              214.791 %
## 13               39.062 %
## 14               70.905 %
## 15               26.092 %
## 16              204.377 %
## 17               34.145 %
## 18              153.274 %
## 19               86.706 %
## 20              218.913 %
## 21              134.008 %
## 22               10.885 %
## 23               97.144 %
## 24               81.742 %
## 25              222.695 %
## 26                48.03 %
## 27              256.721 %
## 28                22.07 %
## 29              186.981 %
## 30                6.528 %
## 31               35.722 %
## 32              422.906 %
## 33              137.185 %
## 34               26.532 %
## 35                122.8 %
## 36              284.794 %
## 37              152.922 %
## 38               17.631 %
## 39              173.176 %
## 40               20.773 %
## 41                7.384 %
## 42               27.338 %
## 43              295.912 %
## 44               58.474 %
## 45               67.748 %
## 46               20.848 %
## 47              122.842 %
## 48              133.023 %
## 49                55.58 %
## 50              183.437 %
## 51               23.259 %
## 52               30.159 %
## 53                5.427 %
## 54               15.295 %
## 55               16.162 %
## 56               73.153 %
## 57              137.255 %
## 58                5.781 %
## 59                8.121 %
## 60               40.174 %
## 61             1005.833 %
## 62              123.344 %
## 63               22.753 %
## 64              109.667 %
## 65               50.247 %
## 66              786.236 %
## 67              249.228 %
## 68               21.975 %
## 69              137.297 %
## 70                11.08 %
## 71               95.406 %
## 72              134.087 %
## 73              656.217 %
## 74              286.798 %
## 75              188.452 %
## 76               65.225 %
## 77               55.537 %
## 78              224.785 %
## 79              554.978 %
## 80              119.671 %
## 81              137.297 %
## 82               21.461 %
## 83              115.919 %
## 84               45.756 %
## 85                3.943 %
## 86               29.572 %
## 87               50.133 %
## 88                32.77 %
## 89               53.984 %
## 90               101.89 %
## 91              199.027 %
## 92              438.211 %
## 93              137.297 %
## 94               21.763 %
## 95              115.846 %
## 96              295.457 %
## 97               253.64 %
## 98              117.289 %
## 99                3.191 %
## 100              52.147 %
## 101              41.643 %
## 102              203.68 %
## 103             169.798 %
## 104             503.795 %
## 105             135.719 %
## 106              25.544 %
## 107              97.473 %
## 108             276.337 %
## 109              52.876 %
## 110              283.66 %
## 111              11.285 %
## 112              90.494 %
## 113              18.245 %
## 114              10.269 %
## 115             591.152 %
## 116              439.94 %
## 117             116.759 %
## 118               1.038 %
## 119               4.787 %
## 120             288.621 %
## 121            1186.249 %
## 122             210.339 %
## 123              30.355 %
## 124              61.272 %
## 125              13.606 %
## 126                 8.4 %
## 127             716.799 %
## 128             416.114 %
## 129             137.256 %
## 130              21.713 %
## 131              88.949 %
## 132             237.655 %
## 133             845.791 %
## 134              90.278 %
## 135               8.212 %
## 136              19.286 %
## 137              38.036 %
## 138              48.194 %
## 139              42.552 %
## 140             709.195 %
## 141             137.271 %
## 142               8.099 %
## 143              96.613 %
## 144              65.215 %
## 145             462.006 %
## 146             187.393 %
## 147              19.376 %
## 148               1.165 %
## 149              19.752 %
## 150              16.638 %
## 151              11.025 %
## 152             543.734 %
## 153             130.993 %
## 154              25.055 %
## 155              73.219 %
## 156             232.016 %
## 157             308.209 %
## 158             256.118 %
## 159              13.115 %
## 160              12.925 %
## 161              35.648 %
## 162              255.18 %
## 163                69.9 %
## 164             110.379 %
## 165             103.269 %
## 166               7.866 %
## 167              58.682 %
## 168             172.107 %
## 169             158.334 %
## 170             137.826 %
## 171              90.113 %
## 172              59.527 %
## 173               2.118 %
## 174            1040.966 %
## 175               2.555 %
## 176             443.276 %
## 177             137.297 %
## 178              25.055 %
## 179             115.898 %
## 180               2.395 %
## 181               1.603 %
## 182             917.434 %
## 183              61.142 %
## 184              25.994 %
## 185              45.537 %
## 186             1210.04 %
## 187            2038.475 %
## 188             457.734 %
## 189             137.297 %
## 190              25.055 %
## 191             101.627 %
## 192             284.877 %
## 193             695.789 %
## 194             409.777 %
## 195              45.368 %
## 196              36.466 %
## 197               7.662 %
## 198             1143.54 %
## 199             997.661 %
## 200              65.377 %
## 201             136.915 %
## 202              20.525 %
## 203              61.901 %
## 204             120.943 %
## 205             483.706 %
## 206             1075.96 %
## 207              21.101 %
## 208              70.885 %
## 209              29.681 %
## 210              10.472 %
## 211               2.297 %
## 212             374.031 %
## 213              85.863 %
## 214              22.304 %
## 215             111.065 %
## 216             149.719 %
## 217             647.114 %
## 218              32.566 %
## 219             139.256 %
## 220              32.056 %
## 221              12.538 %
## 222              66.033 %
## 223             287.288 %
## 224             573.312 %
## 225              98.535 %
## 226              23.373 %
## 227             110.331 %
## 228             182.795 %
## 229             144.307 %
## 230              41.083 %
## 231              44.424 %
## 232              68.874 %
## 233              46.614 %
## 234             307.475 %
## 235             212.409 %
## 236             264.206 %
## 237               96.98 %
## 238              23.377 %
## 239              66.321 %
## 240             198.606 %
## 241             858.592 %
## 242             420.823 %
## 243              54.538 %
## 244              31.969 %
## 245              73.995 %
## 246              34.364 %
## 247             274.283 %
## 248              17.264 %
## 249              96.485 %
## 250               7.212 %
## 251             104.361 %
## 252             223.894 %
## 253             251.382 %
## 254               15.82 %
## 255             327.534 %
## 256              22.655 %
## 257              12.862 %
## 258              16.124 %
## 259              94.506 %
## 260              51.392 %
## 261               57.03 %
## 262              23.085 %
## 263              60.198 %
## 264             148.643 %
## 265              56.125 %
## 266               9.926 %
## 267              18.298 %
## 268              41.794 %
## 269             166.911 %
## 270               8.581 %
## 271              42.985 %
## 272             466.197 %
## 273               96.56 %
## 274              10.251 %
## 275             107.286 %
## 276             251.556 %
## 277               0.914 %
## 278              174.02 %
## 279              18.014 %
data.frame(FD,forecating_date=forecasting_data_by_name,forecasting_by_auto.arima=tail(forecasting_auto_arima$mean,N_forecasting_days))
##            FD forecating_date forecasting_by_auto.arima
## 1  2017-01-31         Tuesday                   3.05973
## 2  2017-03-03          Friday                   3.05973
## 3  2017-03-31          Friday                   3.05973
## 4  2017-05-01          Monday                   3.05973
## 5  2017-05-31       Wednesday                   3.05973
## 6  2017-07-01        Saturday                   3.05973
## 7  2017-07-31          Monday                   3.05973
## 8  2017-08-31        Thursday                   3.05973
## 9  2017-10-01          Sunday                   3.05973
## 10 2017-10-31         Tuesday                   3.05973
## 11 2017-12-01          Friday                   3.05973
## 12 2017-12-31          Sunday                   3.05973
plot(forecasting_auto_arima)
x1_test <- ts(testing_data, start =(rows-validation_data_days+1) )
lines(x1_test, col='red',lwd=2)

graph4<-autoplot(forecasting_auto_arima,xlab = paste ("Time in  ", frequency ,y_lab , sep=" "), ylab=y_lab)
graph4

## Error of forecasting
Error_auto.arima<-abs(testing_data-validation_forecast)  # Absolute error of forecast (AEOF)
sqrt(sum(Error_auto.arima^2/validation_data_days))
## [1] 2.136216
REOF_A_auto.arima<-abs(((testing_data-validation_forecast)/testing_data)*100)  #Relative error of forecast (divided by actual)(REOF_A)
REOF_F_auto.arima<-abs(((testing_data-validation_forecast)/validation_forecast)*100)  #Relative error of forecast (divided by forecast)(REOF_F)
correlation_auto.arima<-cor(testing_data,validation_forecast, method = c("pearson"))     # correlation coefficient between predicted and actual values 
RMSE_auto.arima<-sqrt(sum((Error_auto.arima^2))/validation_data_days)   #  Root mean square forecast error
MAD_auto.arima<-abs((sum(testing_data-validation_forecast))/validation_data_days)   # average forecast accuracy
AEOF_auto.arima<-c(Error_auto.arima)
REOF_auto.arima1<-c(paste(round(REOF_A_auto.arima,3),"%"))
REOF_auto.arima2<-c(paste(round(REOF_F_auto.arima,3),"%"))
data.frame(correlation_auto.arima,RMSE_auto.arima,MAPE_Mean_All,MAD_auto.arima) # analysis of Error  by using Holt's linear model shows result of correlation ,MSE ,MPER
##   correlation_auto.arima RMSE_auto.arima
## 1            -0.02744551        2.136216
##                                                MAPE_Mean_All MAD_auto.arima
## 1 108.079 % MAPE  279 month Average Rainfall - (MM) In Egypt      0.6684562