title: “Modelling and Projecting Political corruption index in Somalia” author: “Abdirizak Ahmed Osman” date: “2026-06-04” # Modelling and Projecting Political corruption index in Somalia: # Insights from Classical,Machine Learning, # Deep Learning , and Hybrid Models # Link of the Data:https://ourworldindata.org/grapher/political-corruption-index.csv?v=1&csvType=full&useColumnShortNames=true
set.seed(123)
#1.1 Data Cleaning data<-read.csv(“CORRUPTION.CSV”) #Selecting area Somalia<-data[data\(entity=="Somalia",] View() #select Study variable corruption<-Somalia\)corruption_vdem__estimate_best #any missing value any(is.na(corruption)) #1.2 Data transformation is.ts(corruption) class(corruption) corruptionts<-ts(corruption, frequency = 1, start = 1900)
#1.3 data measurment library(psych) describe(corruptionts)
#1.4 data visualitation library(TSstudio) ts_plot(corruptionts) windows() plot.ts(corruptionts, main= “Somalia political corruption index 1900-2025”, xlab=“years”, ylab=“corruption_index”, col=“blue”)
#2.0 diagnostic analytics
#2.1 Data validation (Splitting data into train and test) split<-ts_split(corruptionts, sample.out = 126) train<-split\(train test<-split\)test
#2.2 checking stationarity library(tseries) adf.test(corruptionts) pp.test(corruptionts)
#2.3 differencing techniques library(forecast) ndiffs(corruptionts) ndiffs(train)
corruptiontsd<-diff(corruptionts) adf.test(corruptiontsd) pp.test(corruptiontsd)
traind<-diff(train) adf.test(traind) testd<-diff(test)
#2.4 Functional Analysis windows() acf(corruptionts) windows() pacf(corruptionts)
windows() acf(train) windows() pacf(train)
#3. Predictive Analytics #3.1 : Modelling # using Autoarima arima<-auto.arima(corruptionts) summary(arima) arima1<-auto.arima(train) summary(arima1)
#4 prescriptive analysis #4.1 best model selection bestmodel<-auto.arima(corruptionts, stepwise = FALSE, approximation = FALSE, trace = TRUE, allowdrift = TRUE, allowmean = TRUE) bestmodel1<-auto.arima(train, stepwise = FALSE, approximation = FALSE, trace = TRUE, allowdrift = TRUE, allowmean = TRUE) #4.2 model comparisom #4.3 model adequacy checking windows() checkresiduals(arima)
windows() checkresiduals(arima1) #4.4 forecasting #forecasting from 2025 to 2050 forecast<-forecast(arima,h=25) print(forecast) windows() plot(forecast)
#end ########################################################################## library(Metrics)
split<-ts_split(corruptionts,sample.out = 25) train<-split\(train test<-split\)test #5. Modelling ##################################################3 #5.1: ARIMA Model #fitting arima model fitARIMA = auto.arima(train, stepwise = FALSE, approximation = FALSE, trace = TRUE, allowdrift = TRUE, allowmean = TRUE) # Parameter estimation print(fitARIMA)
summary(fitARIMA) windows() checkresiduals(fitARIMA)
predARIMA = forecast::forecast(fitARIMA,h=25) summary(predARIMA) test windows() plot(predARIMA) #accuracy metrics a1<-forecast::accuracy(predARIMA, test);a1 smape(test,predARIMA$mean)
##############################################3 #5.2 ETS Model: if it is heteroscedasticity
#fitting ETS model fitETS=ets(train) summary(fitETS) predETS=forecast::forecast(fitETS, h=25) print(predETS) test windows() plot(predETS) a2<-forecast::accuracy(predETS, test);a2 smape(test,predETS$mean)
##############################################3 #5.2 ETS Model: if it is heteroscedasticity
#fitting ETS model fitETS=ets(train) summary(fitETS) predETS=forecast::forecast(fitETS, h=25) print(predETS) test windows() plot(predETS) a2<-forecast::accuracy(predETS, test);a2 smape(test,predETS$mean)
fit_bats=bats(train) summary(fit_bats) predBATS=forecast::forecast(fit_bats,h=25) print(predBATS) test windows() plot(predBATS) a3<-forecast::accuracy(predBATS,test);a3 smape(test,predBATS$mean)
fit_tbats = tbats(train) summary(fit_tbats) predTBATS=forecast::forecast(fit_tbats, h=25) print(predTBATS) test windows() autoplot(predTBATS) a4<-forecast::accuracy(predTBATS, test);a4 smape(test,predTBATS$mean)
###########################################3 # 5.5 Theta model: if the sample size is less than 30 fit_theta=thetaf(train, h=25) print(fit_theta) windows() autoplot(fit_theta) a5<-forecast::accuracy(fit_theta\(mean, test);a5 smape(test,fit_theta\)mean)
#5.6 fitting ARFIMA model: if its non-linear fit_ARFIMA=arfima(train) predARFIMA = forecast::forecast(fit_ARFIMA, h=25) print(predARFIMA) test windows() autoplot(predARFIMA) a6<-forecast::accuracy(predARFIMA$mean, test);a6
smape(test,predARFIMA$mean)
windows() par(mfrow=c(3,2)) plot(predARIMA,col=“red”) plot(predETS,col=“red”) plot(fit_theta,col=“red”) plot(predTBATS,col=“red”) plot(predBATS,col=“red”) plot(predARFIMA,col=“red”)
a1;a2;a3;a4;a5;a6
#END