# Trend Analysis 

# 1. descriptive Analysis

# data Pre-processing 

library(readxl)

livestock<-read_xlsx("~/badeed.xlsx")

# checking missing 

any(is.na(livestock))
## [1] FALSE
# Declaring Time series 

is.ts(livestock)
## [1] FALSE
# converting  to Time series 

livestock_ts<-ts(livestock$export, start=c(2012,1), end= c(2023,12), frequency = 12)

is.ts(livestock_ts)
## [1] TRUE
# descriptive

library(psych)

describe(livestock_ts)
##    vars   n     mean       sd   median trimmed      mad  min     max   range
## X1    1 144 210617.2 288985.3 127549.5  139258 102883.5 8545 1593849 1585304
##    skew kurtosis       se
## X1  2.9     8.39 24082.11
library(TSstudio)

library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
ts.plot(livestock_ts, col="purple")

ts.plot(livestock_ts,xlab="Year",ylab="export data",main="Number of livestocks exported from somaliland
        2012 -2023", col="magenta")

# Splitting Data sets

# Test + Train

library(TSstudio)

splitdata<-ts_split(livestock_ts,sample.out = 24)

train<-splitdata$train

train
##          Jan     Feb     Mar     Apr     May     Jun     Jul     Aug     Sep
## 2012  141262  288139  148713  118107   88395  210183  248533  179825  274086
## 2013  217617  168020  118326   73415  140644  226719  253359  230338  879725
## 2014  222553  142834  172535  143341   82279  280423  242883  281287 1235587
## 2015  165686  164504  220457  129177  152708  290257  165012  649526 1316095
## 2016  183440  146106  177433  144725   45098  321055  165424 1211406  478958
## 2017   41223   41631   33356   34467   51572   53659   57906 1272478   14342
## 2018   25262   34785   17444   32587   32391  103578  241896  842898    8920
## 2019   50292   68750   62667   84853   61328   39953  893599  454654   29675
## 2020   48775   64343   68689   55810   60841  172894  398729   86914   95209
## 2021  128551  137701  144710  152199   80101  560929  410966   58405   70708
##          Oct     Nov     Dec
## 2012 1593849   48583  202758
## 2013  694393   37108  122131
## 2014  186338  201707  197694
## 2015   30330   42383  135040
## 2016  125284   69851   66149
## 2017   37742   27659   35877
## 2018    8545   17486   34139
## 2019   37499   59947   55214
## 2020   59416   63729   91785
## 2021   58866   98707  106891
test<-splitdata$test

test
##          Jan     Feb     Mar     Apr     May     Jun     Jul     Aug     Sep
## 2022  104728  172380  132969  165145  150354  791462  267923   57046   75544
## 2023  168787  139831  157523   97143  346864 1407445  117624  111897   97692
##          Oct     Nov     Dec
## 2022   79359  112012  126548
## 2023  152918  123840  205914
ts.plot(train,xlab="Year",ylab="export",main="Number of livestocks exported from somaliland
        2012 -2023", col="darkblue")

# diagnostic

library(tseries)

adf.test(train)
## Warning in adf.test(train): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train
## Dickey-Fuller = -6.3548, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
pp.test(train)
## Warning in pp.test(train): p-value smaller than printed p-value
## 
##  Phillips-Perron Unit Root Test
## 
## data:  train
## Dickey-Fuller Z(alpha) = -96.337, Truncation lag parameter = 4, p-value
## = 0.01
## alternative hypothesis: stationary
# How to check number of difference

library(forecast)

ndiffs(train)
## [1] 1
diff1<-diff(train)

par(mfrow=c(1,3))

ts.plot(livestock_ts,xlab="Year",ylab="export data",main="number of livestocks exported from somaliland before spliting
        2012 -2023", col="purple")

ts.plot(train,xlab="Year",ylab="export",main="number of livestocks exported from somaliland
        2012 -2023", col="darkred")

ts.plot(diff1, xlab="Years", ylab=" Number of exported", main="First differencing of train data")

#ACF and PACF


par(mfrow=c(1,4))

acf(train)

pacf(train)

acf(diff1)

pacf(diff1)

#  Decomposition


plot(decompose(train,type = "additive"))

plot(decompose(train,type = "multiplicative"))

# III. Predictive Analytics

# Fit the specified SARIMA model

sarima1 <- arima(train, order=c(4, 1, 0), seasonal=list(order=c(2, 0, 0), period=12))

sarima2 <- arima(train, order=c(3, 1, 0), seasonal=list(order=c(2, 0, 0), period=12))

sarima3 <- arima(train, order=c(2, 1, 0), seasonal=list(order=c(2, 0, 0), period=12))

sarima4 <- arima(train, order=c(1, 1, 0), seasonal=list(order=c(2, 0, 0), period=12))

sarima5 <- arima(train, order=c(0, 1, 0), seasonal=list(order=c(2, 0, 0), period=12))

auto.arima(train, seasonal=TRUE)
## Series: train 
## ARIMA(4,1,0)(2,0,0)[12] 
## 
## Coefficients:
##           ar1      ar2      ar3      ar4    sar1     sar2
##       -0.9507  -0.7179  -0.4506  -0.1618  1.1869  -0.4504
## s.e.   0.1071   0.1318   0.1222   0.0907  0.0891   0.0914
## 
## sigma^2 = 3.57e+10:  log likelihood = -1621.47
## AIC=3256.93   AICc=3257.94   BIC=3276.39
AIC(sarima1,sarima2,sarima3,sarima4,sarima5)
##         df      AIC
## sarima1  7 3256.933
## sarima2  6 3258.062
## sarima3  5 3267.226
## sarima4  4 3280.582
## sarima5  3 3308.935
BIC(sarima1,sarima2,sarima3,sarima4,sarima5)
##         df      BIC
## sarima1  7 3276.387
## sarima2  6 3274.737
## sarima3  5 3281.122
## sarima4  4 3291.698
## sarima5  3 3317.273
#Fit Individual Models on Training Data:

# SARIMA model

fit_sarima_t <- auto.arima(train, seasonal = TRUE)

# ETS model

fit_ets <- ets(train)

# TBATS model

fit_tbats <- tbats(train)

# ANN model (Neural Network for Forecasting)

fit_ann <- nnetar(train)

#Forecast on Test Data

# Forecast using ETS

fc_ets <- forecast(fit_ets, h =24)

# Forecast using TBATS

fc_tbats <- forecast(fit_tbats, h =24)

# Forecast using ANN
fc_ann <- forecast(fit_ann, h = 24)

# Forecast using SARIMA

fc_sarima <- forecast(fit_sarima_t, h = 24)

#Evaluate Accuracy

# Function to calculate accuracy

evaluate_forecast <- function(forecast, actual) {
  return(accuracy(forecast, actual))
}

# Evaluate individual models
accuracy_ets <- evaluate_forecast(fc_ets$mean, test)

accuracy_tbats <- evaluate_forecast(fc_tbats$mean, test)

accuracy_ann <- evaluate_forecast(fc_ann$mean, test)

accuracy_sarima <- evaluate_forecast(fc_sarima$mean, test)

# Print accuracies

print(list(
  accuracy_ets = accuracy_ets,
  accuracy_tbats = accuracy_tbats,
  accuracy_ann = accuracy_ann,
  accuracy_sarima = accuracy_sarima
))
## $accuracy_ets
##               ME     RMSE      MAE      MPE     MAPE       ACF1 Theil's U
## Test set 55663.6 231622.8 114159.8 -4.45238 45.55983 -0.1385541 0.7770662
## 
## $accuracy_tbats
##                ME     RMSE      MAE      MPE     MAPE       ACF1 Theil's U
## Test set 119799.1 309359.9 129088.1 21.72566 35.25137 0.07261207  1.075958
## 
## $accuracy_ann
##                ME     RMSE      MAE       MPE     MAPE       ACF1 Theil's U
## Test set 23317.62 227730.9 106305.3 -8.001652 40.54603 -0.2311541 0.8533414
## 
## $accuracy_sarima
##                ME     RMSE      MAE      MPE     MAPE       ACF1 Theil's U
## Test set 53665.81 200193.6 86549.68 3.785126 29.97349 0.02046479 0.6577297
#Combine Forecasts for All Possible Hybrids:

# Function to combine forecasts

combine_forecasts <- function(..., weights = NULL) {
  forecasts <- list(...)
  if (is.null(weights)) {
    weights <- rep(1/length(forecasts), length(forecasts))
  }
  combined <- Reduce(`+`, Map(`*`, forecasts, weights))
  return(combined)
}

# Combine pairs
combined_ets_tbats <- combine_forecasts(fc_ets$mean, fc_tbats$mean)

combined_ets_ann <- combine_forecasts(fc_ets$mean, fc_ann$mean)

combined_ets_sarima <- combine_forecasts(fc_ets$mean, fc_sarima$mean)

combined_tbats_ann <- combine_forecasts(fc_tbats$mean, fc_ann$mean)

combined_tbats_sarima <- combine_forecasts(fc_tbats$mean, fc_sarima$mean)

combined_ann_sarima <- combine_forecasts(fc_ann$mean, fc_sarima$mean)

# Combine triples
combined_ets_tbats_ann <- combine_forecasts(fc_ets$mean, fc_tbats$mean, fc_ann$mean)

combined_ets_tbats_sarima <- combine_forecasts(fc_ets$mean, fc_tbats$mean, fc_sarima$mean)

combined_ets_ann_sarima <- combine_forecasts(fc_ets$mean, fc_ann$mean, fc_sarima$mean)

combined_tbats_ann_sarima <- combine_forecasts(fc_tbats$mean, fc_ann$mean, fc_sarima$mean)

# Combine all

combined_all <- combine_forecasts(fc_ets$mean, fc_tbats$mean, fc_ann$mean, fc_sarima$mean)

#Evaluate Each Hybrid:

# Function to calculate accuracy

evaluate_forecast <- function(forecast, actual) {
  return(accuracy(forecast, actual))
}

# Evaluate pairs
accuracy_ets_tbats <- evaluate_forecast(combined_ets_tbats, test)

accuracy_ets_ann <- evaluate_forecast(combined_ets_ann, test)

accuracy_ets_sarima <- evaluate_forecast(combined_ets_sarima, test)

accuracy_tbats_ann <- evaluate_forecast(combined_tbats_ann, test)

accuracy_tbats_sarima <- evaluate_forecast(combined_tbats_sarima, test)
accuracy_ann_sarima <- evaluate_forecast(combined_ann_sarima, test)

# Evaluate triples
accuracy_ets_tbats_ann <- evaluate_forecast(combined_ets_tbats_ann, test)