#### Package ####
library(MASS)
library(car)
## Warning: package 'car' was built under R version 4.3.3
## Loading required package: carData
library(forecast)
## Warning: package 'forecast' was built under R version 4.3.3
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(tseries)
## Warning: package 'tseries' was built under R version 4.3.3
library(quadprog)
library(zoo)
## Warning: package 'zoo' was built under R version 4.3.3
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(fracdiff)
## Warning: package 'fracdiff' was built under R version 4.3.3
library(fUnitRoots)
## Warning: package 'fUnitRoots' was built under R version 4.3.3
library(lmtest)
#### Data ####
data=read.table(file.choose(),header=T,sep = ",")
head(data)
## Price.All.
## 1 51.76
## 2 49.13
## 3 43.45
## 4 48.20
## 5 51.75
## 6 55.40
DataAll<-ts(data)
DataInsample<-ts(data[1:216,])
DataOutsample<-ts(data[217:240,],start = 217,end = 240)
plot(DataAll)

plot(DataInsample)

plot(DataOutsample)

#### Buat Model Dari InSample ####
# ACF dan PACF dari data aktual
acf(DataInsample,24);grid()

pacf(DataInsample,24);grid()

# Cek Stasioner Dalam Variance
boxcox(DataInsample~1)

powerTransform(DataInsample)
## Estimated transformation parameter
## DataInsample
## 0.489028
lambda = powerTransform(DataInsample)$lambda
DataTransform = DataInsample^(lambda)
head(DataTransform)
## Time Series:
## Start = 1
## End = 6
## Frequency = 1
## [1] 6.889556 6.716081 6.324452 6.653607 6.888905 7.122380
boxcox(DataTransform~1)

powerTransform(DataTransform)
## Estimated transformation parameter
## DataTransform
## 0.9999998
plot(DataTransform)

# Cek Stasioner Dalam Rata-rata
adfTest(DataTransform)
##
## Title:
## Augmented Dickey-Fuller Test
##
## Test Results:
## PARAMETER:
## Lag Order: 1
## STATISTIC:
## Dickey-Fuller: -0.2529
## P VALUE:
## 0.535
##
## Description:
## Fri Nov 15 00:58:05 2024 by user: mrio1
DataDiff = diff(DataTransform,differences = 1)
head(DataDiff)
## Time Series:
## Start = 2
## End = 7
## Frequency = 1
## [1] -0.1734743 -0.3916295 0.3291552 0.2352976 0.2334749 -0.3669769
plot(DataDiff)

adfTest(DataDiff)
## Warning in adfTest(DataDiff): p-value smaller than printed p-value
##
## Title:
## Augmented Dickey-Fuller Test
##
## Test Results:
## PARAMETER:
## Lag Order: 1
## STATISTIC:
## Dickey-Fuller: -9.3892
## P VALUE:
## 0.01
##
## Description:
## Fri Nov 15 00:58:05 2024 by user: mrio1
#ACF dan PACF dari data Baru
acf(DataDiff);grid() #Terdapat ACF signifikan pada lag 1

pacf(DataDiff);grid() #Terdapat PACF signifikan pada lag 1

#Penaksiran dan Pengujian Signifikansi Parameter
model1=arima(x=DataTransform,order=c(0,1,1));model1
##
## Call:
## arima(x = DataTransform, order = c(0, 1, 1))
##
## Coefficients:
## ma1
## 0.2329
## s.e. 0.0657
##
## sigma^2 estimated as 0.1519: log likelihood = -102.53, aic = 209.07
coeftest(model1)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ma1 0.232901 0.065691 3.5454 0.000392 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model2=arima(x=DataTransform,order=c(1,1,0));model2
##
## Call:
## arima(x = DataTransform, order = c(1, 1, 0))
##
## Coefficients:
## ar1
## 0.2263
## s.e. 0.0665
##
## sigma^2 estimated as 0.1522: log likelihood = -102.7, aic = 209.41
coeftest(model2)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.226254 0.066539 3.4003 0.000673 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model3=arima(x=DataTransform,order=c(1,1,1));model3
##
## Call:
## arima(x = DataTransform, order = c(1, 1, 1))
##
## Coefficients:
## ar1 ma1
## 0.0526 0.1830
## s.e. 0.3018 0.2973
##
## sigma^2 estimated as 0.1519: log likelihood = -102.52, aic = 211.04
coeftest(model3)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.052567 0.301763 0.1742 0.8617
## ma1 0.183031 0.297314 0.6156 0.5381
#### Pemeriksaan Diagnostik ####
#Autokorelasi Residual (LJung-Box)
tsdiag(model1,length(DataDiff)) #ARIMA (0,1,1)

tsdiag(model2,length(DataDiff)) #ARIMA (1,1,0)

#Normalitas Residual
shapiro.test(resid(model1))
##
## Shapiro-Wilk normality test
##
## data: resid(model1)
## W = 0.9519, p-value = 1.256e-06
shapiro.test(resid(model2))
##
## Shapiro-Wilk normality test
##
## data: resid(model2)
## W = 0.95103, p-value = 1.024e-06
#Pemilihan model terbaik (Ukuran Kesalahan Prediksi In Sample)
summary(model1)
##
## Call:
## arima(x = DataTransform, order = c(0, 1, 1))
##
## Coefficients:
## ma1
## 0.2329
## s.e. 0.0657
##
## sigma^2 estimated as 0.1519: log likelihood = -102.53, aic = 209.07
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.005542218 0.3888798 0.2945416 -0.04576632 3.884844 0.9699076
## ACF1
## Training set 0.003340876
summary(model2)
##
## Call:
## arima(x = DataTransform, order = c(1, 1, 0))
##
## Coefficients:
## ar1
## 0.2263
## s.e. 0.0665
##
## sigma^2 estimated as 0.1522: log likelihood = -102.7, aic = 209.41
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.005119543 0.389188 0.2945661 -0.04290725 3.884154 0.9699883
## ACF1
## Training set 0.009967086
#Peramalan (Out Sample) 24 periode
#ARIMA (0,1,1)
set.seed(34)
RawFcast1 = seq(1,24)
a_t = rnorm(24,0,sd(resid(model1)))
for (i in 1:length(RawFcast1)){
theta1 = summary(model1)$coef
if (i==1) {
a_t1 = resid(model1)[216]
RawFcast1[i] = DataTransform[216] + a_t[i] - theta1*a_t1
}
else {
a_t1 = a_t[i-1]
RawFcast1[i] = RawFcast1[i-1] + a_t[i] - theta1*a_t1
}
}
InversedFcast1 = ts(RawFcast1^(1/lambda),start = 217,end = 240)
Error1 = DataOutsample - InversedFcast1
ME1 = mean(Error1)
RMSE1 = sqrt(mean(Error1^2))
MAE1 = mean(abs(Error1))
MPE1 = mean(Error1/DataOutsample)*100
MAPE1 = mean(abs(Error1/DataOutsample))*100
MASE1 = mean(abs(Error1^2))
kesalahan = data.frame(ME1,RMSE1,MAE1,MPE1,MAPE1,MASE1)
print(kesalahan)
## ME1 RMSE1 MAE1 MPE1 MAPE1 MASE1
## 1 -4.745695 10.05708 7.444316 -6.444256 9.684252 101.1449
#ARIMA (1,1,0)
set.seed(407)
RawFcast2 = seq(1,24)
a_t = rnorm(24,0,sd(resid(model2)))
for (i in 1:length(RawFcast2)){
phi1 = summary(model2)$coef
if (i==1) {
RawFcast2[i] = phi1*DataTransform[216] + DataTransform[216] - phi1*DataTransform[215] + a_t[i]
}
else if (i==2){
RawFcast2[i] = phi1*RawFcast1[i-1] + RawFcast1[i-1] - phi1*DataTransform[216] + a_t[i]
}
else {
RawFcast2[i] = phi1*RawFcast1[i-1] + RawFcast1[i-1] - phi1*RawFcast1[i-2] + a_t[i]
}
}
InversedFcast2 = ts(RawFcast2^(1/lambda),start = 217,end = 240)
Error2 = DataOutsample - InversedFcast2
ME2 = mean(Error2)
RMSE2 = sqrt(mean(Error2^2))
MAE2 = mean(abs(Error2))
MPE2 = mean(Error2/DataOutsample)*100
MAPE2 = mean(abs(Error2/DataOutsample))*100
MASE2 = mean(abs(Error2^2))
kesalahan2 = data.frame(ME2,RMSE2,MAE2,MPE2,MAPE2,MASE2)
print(kesalahan2)
## ME2 RMSE2 MAE2 MPE2 MAPE2 MASE2
## 1 -2.573292 8.829646 7.099529 -3.436986 9.262223 77.96264
### Plot Predict and Forecast
InversedPred1=fitted(model1)^(1/lambda)
InversedPred2=fitted(model2)^(1/lambda)
warna = c("black","red","green","black") #Warna Data Aktual, Prediksi, Peramalan, Garis
#Model ARIMA (0,1,1)
plot(DataAll,xlim=c(-1,250),main="ARIMA(0,1,1)",xlab= "Periode",ylab="Harga Minyak Mentah Dunia",pch=16,col=warna[1])
points(DataAll,col=warna[4],lwd=1,pch=16,cex=1.2)
lines(InversedPred1,col=warna[4],lwd=1)
points(InversedPred1,cex=1,col=warna[2],pch=16)
points(InversedFcast1,cex=1,col=warna[3],pch=19)
lines(InversedFcast1,col=warna[4],lwd=1)
legend("topright",legend=c("Aktual","Prediksi 1","Peramalan 1"),cex=1.25,bty="n",col=warna[1:3],pch=c(16,16,19),text.font = 2);grid()

#Model ARIMA (1,1,0)
plot(DataAll,xlim=c(-1,250),main="ARIMA(1,1,0)",xlab= "Periode",ylab="Harga Minyak Mentah Dunia",pch=16,col=warna[1])
points(DataAll,col=warna[4],lwd=1,pch=16,cex=1.2)
lines(InversedPred2,col=warna[4],lwd=0.5)
points(InversedPred2,cex=1,col=warna[2],pch=16)
points(InversedFcast2,cex=1,col=warna[3],pch=19)
lines(InversedFcast2,col=warna[4],lwd=0.5)
legend("topright",legend=c("Aktual","Prediksi 2","Peramalan 2"),cex=1.25,bty="n",col=warna[1:3],pch=c(16,16,19),text.font = 2);grid()
