ARIMA

Generate Data dengan Model

library(forecast)
## Warning: package 'forecast' was built under R version 4.5.3
library(tseries)
## Warning: package 'tseries' was built under R version 4.5.3
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(TSA)
## Warning: package 'TSA' was built under R version 4.5.3
## Registered S3 methods overwritten by 'TSA':
##   method       from    
##   fitted.Arima forecast
##   plot.Arima   forecast
## 
## Attaching package: 'TSA'
## The following objects are masked from 'package:stats':
## 
##     acf, arima
## The following object is masked from 'package:utils':
## 
##     tar
set.seed(123)
n <- 200

phi1  <-  0.5
phi2  <- -0.7
teta1 <- -0.3
teta2 <- -0.5

ar    <- numeric(4)
ar[1] <-  phi1 + 2           
ar[2] <-  phi2 - 2*phi1 - 1  
ar[3] <-  phi1 - 2*phi2      
ar[4] <-  phi2              

ma    <- numeric(2)
ma[1] <- -teta1              
ma[2] <- -teta2             

et <- rnorm(n, mean = 0, sd = sqrt(1.10))
Yt <- numeric(n)

for (t in 5:n) {
  Yt[t] <- ar[1] * Yt[t-1] +
            ar[2] * Yt[t-2] +
            ar[3] * Yt[t-3] +
            ar[4] * Yt[t-4] +
            et[t]            +
            ma[1] * et[t-1]  +
            ma[2] * et[t-2]
}

data <- ts(Yt[-(1:50)])

ts.plot(data, col = "blue", lwd = 1.5,
        main = "Plot Data Yt - 150 Observasi (ARIMA 2,2,2)",
        ylab = "Yt", xlab = "Waktu")
points(data, pch = 20, col = "blue", cex = 0.5)

Split Data Train dan Data Test

train.data <- data[1:120]
test.data  <- data[121:150]

Visualisasi data training yang akan digunakan untuk mencari model terbaik

ts.plot(train.data, col="blue")
title(main = "Plot data train")
points(train.data, pch = 20, col = "blue")

Model ARIMA

# Uji stasioneritas

Mengidentifikasi kestasioneran data dilakukan dengan uji ADF.

Uji Augmented Dickey-Fuller (ADF) adalah salah satu alat identifikasi untuk menguji kestasioneran data dan memiliki hipotesis sebagai berikut:

\(H_0\) : Data tidak stasioner (unit roots mendekati 1)

\(H_1\): Data stasioner (unit roots tidak mendekati 1)

adf.test(train.data, alternative = "stationary",k=trunc((length(train.data)-1)^(1/3)))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train.data
## Dickey-Fuller = -2.3354, Lag order = 4, p-value = 0.4373
## alternative hypothesis: stationary

Berdasarkan hasil uji ADF diperoleh p-value sebesar \(0.4373 > 0.05\) yang berarti bahwa H0 gagal ditolak atau data tidak stasioner. Karena data tidak stasioner maka selanjutnya dilakukan differencing untuk membuat data stasioner sebelum dilakukan identifikasi model tentatif.

Differencing

#Differencing Ordo 1
data.dif1 <- diff(train.data, difference=1)
plot.ts(data.dif1)
points(data.dif1)

adf.test(data.dif1, alternative = "stationary",k=trunc((length(train.data)-1)^(1/3)))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  data.dif1
## Dickey-Fuller = -1.7984, Lag order = 4, p-value = 0.6603
## alternative hypothesis: stationary

Berdasarkan hasil uji ADF diff 1 diperoleh p-value sebesar $ 0.6603 > 0.05$ yang berarti bahwa H0 gagal ditolak atau data tidak stasioner. Karena data tidak stasioner maka selanjutnya dilakukan differencing kedua untuk membuat data stasioner sebelum dilakukan identifikasi model tentatif.

#Differencing Ordo 2
data.dif2 <- diff(train.data, difference=2)
plot.ts(data.dif2)
points(data.dif2)

adf.test(data.dif2, alternative = "stationary",k=trunc((length(train.data)-1)^(1/3)))
## Warning in adf.test(data.dif2, alternative = "stationary", k =
## trunc((length(train.data) - : p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  data.dif2
## Dickey-Fuller = -4.2162, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary

berdasarkan hasil uji ADF differencing kedua, diperoleh nilai p-value \(0.01 < 0.05\) yang berarti H0 ditolak, sehingga dapat disimpulkan bahwa Data telah stasioner setelah dilakukan differencing ordo 2. Karena data telah stasioner selanjutnya akan dilakukan identifikasi model tentatif.

Identifikasi kandidat model

Identifikasi kandidat model diperoleh berdasarkan nilai \(p\) dan \(q\) dimana nilai \(d=0\)

#Plot ACF
acf(data.dif2, lag.max = 20, col = "blue")

Berdasarkan plot ACF terlihat bahwa plot cuts off setelah lag ke-6 sehingga kandidat model yang diperoleh adalah \(ARIMA(0,2,6)\)

#Plot PACF
pacf(data.dif2, lag.max = 20, col = "blue")

Berdasarkan plot ACF terlihat bahwa plot cuts off setelah lag ke-6 sehingga kandidat model yang diperoleh adalah \(ARIMA(2,2,0)\)

#EACF
eacf(data.dif2)
## AR/MA
##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 x o x x o x o o o o o  o  o  o 
## 1 x x x x x x o o o o o  o  o  o 
## 2 o x o o o o o o o o o  o  o  o 
## 3 x x o o o o o o o o o  o  o  o 
## 4 x x o o o o o o o o o  o  o  o 
## 5 x x o o o o o o o o o  o  o  o 
## 6 x x o o o o o o o o o  o  o  o 
## 7 x o o o o o o o o o o  o  o  o

Berdasarkan hasil EACF di atas kandidat model yang diperoleh adalah \(ARIMA(2,2,2)\) dan \(ARIMA(3,2,2)\)

Pendugaan Parameter dan Penentuan Model Terbaik

arima026<-arima(data.dif2,  order=c(0,0,6), include.mean = TRUE,method="ML") #ARIMA (0,2,6)
arima026
## 
## Call:
## arima(x = data.dif2, order = c(0, 0, 6), include.mean = TRUE, method = "ML")
## 
## Coefficients:
##          ma1     ma2      ma3      ma4     ma5     ma6  intercept
##       0.7099  0.1121  -0.3424  -0.3555  0.0421  0.1281    -0.0334
## s.e.  0.0960  0.1214   0.1131   0.1125  0.1340  0.1271     0.1215
## 
## sigma^2 estimated as 1.028:  log likelihood = -169.65,  aic = 353.29
arima220<-arima(data.dif2,  order=c(2,0,0), include.mean = TRUE,method="ML") #ARIMA (2,2,0)
arima220
## 
## Call:
## arima(x = data.dif2, order = c(2, 0, 0), include.mean = TRUE, method = "ML")
## 
## Coefficients:
##          ar1      ar2  intercept
##       0.7566  -0.5476    -0.0339
## s.e.  0.0777   0.0772     0.1201
## 
## sigma^2 estimated as 1.058:  log likelihood = -171.24,  aic = 348.49
arima222<-arima(data.dif2,  order=c(2,0,2), include.mean = TRUE,method="ML") #ARIMA (2,2,2)
arima222
## 
## Call:
## arima(x = data.dif2, order = c(2, 0, 2), include.mean = TRUE, method = "ML")
## 
## Coefficients:
##          ar1      ar2      ma1     ma2  intercept
##       0.6972  -0.7064  -0.0006  0.3732    -0.0299
## s.e.  0.1220   0.0893   0.1449  0.1329     0.1257
## 
## sigma^2 estimated as 1.005:  log likelihood = -168.33,  aic = 346.65
arima322<-arima(data.dif2,  order=c(3,0,2), include.mean = TRUE,method="ML") #ARIMA (3,2,2)
arima322
## 
## Call:
## arima(x = data.dif2, order = c(3, 0, 2), include.mean = TRUE, method = "ML")
## 
## Coefficients:
##          ar1      ar2     ar3      ma1     ma2  intercept
##       0.8267  -0.8322  0.0977  -0.1198  0.4073    -0.0297
## s.e.  0.3237   0.2991  0.2266   0.3095  0.1522     0.1308
## 
## sigma^2 estimated as 1.003:  log likelihood = -168.24,  aic = 348.47
AICKandidatModel <- c(353.29, 348.49, 346.65, 348.47)
KndidatModelARIMA <- c("ARIMA(0,0,6)", "ARIMA(2,0,0)", "ARIMA(2,0,2)", "ARIMA(3,0,2)")
compmodelARIMA <- cbind(KndidatModelARIMA, AICKandidatModel)
colnames(compmodelARIMA) <- c("Kandidat Model", "Nilai AIC")
compmodelARIMA <- as.data.frame(compmodelARIMA)
compmodelARIMA
##   Kandidat Model Nilai AIC
## 1   ARIMA(0,0,6)    353.29
## 2   ARIMA(2,0,0)    348.49
## 3   ARIMA(2,0,2)    346.65
## 4   ARIMA(3,0,2)    348.47

Model terbaik diperoleh berdasarkan nilai AIC terkecil dari kandidat model. Berdasarkan hasil perbandingan, model dengan nilai AIC terkecil adalah ARIMA(2,0,2) sebesar 346.65. Oleh karena itu, model terbaik yang diperoleh yaitu ARIMA(2,0,2).

Model ARIMA(2,0,2) diperoleh dari penjabaran operator backshift sebagai berikut:

\[ \phi_p(B)(1 - B)^d Y_t = \mu + \theta_q(B)e_t \]

Untuk model ARIMA(2,0,2):

\[ (1 - \phi_1 B - \phi_2 B^2)(1 - B)^0 Y_t = \mu + (1 + \theta_1 B + \theta_2 B^2)e_t \]

Karena \((1 - B)^0 = 1\), maka diperoleh:

\[ (1 - \phi_1 B - \phi_2 B^2)Y_t = \mu + (1 + \theta_1 B + \theta_2 B^2)e_t \]

Jika dijabarkan, maka:

\[ Y_t - \phi_1 Y_{t-1} - \phi_2 Y_{t-2} = \mu + e_t + \theta_1 e_{t-1} + \theta_2 e_{t-2} \]

Sehingga model dapat dituliskan menjadi:

\[ Y_t = \mu + \phi_1 Y_{t-1} + \phi_2 Y_{t-2} + \theta_1 e_{t-1} + \theta_2 e_{t-2} + e_t \]

Berdasarkan hasil estimasi parameter diperoleh \(\hat{\mu} = -0.0299\), \(\hat{\phi}_1 = 0.6972\), \(\hat{\phi}_2 = -0.7064\), \(\hat{\theta}_1 = -0.0006\), dan \(\hat{\theta}_2 = 0.3732\).

Sehingga model ARIMA(2,0,2) yang terbentuk adalah:

\[ Y_t = -0.0299 + 0.6972Y_{t-1} - 0.7064Y_{t-2} - 0.0006e_{t-1} + 0.3732e_{t-2} + e_t \]

Nilai ragam galat yang diperoleh adalah \(\hat{\sigma}^2 = 1.005\).

Model terbaik tersebut selanjutnya dapat digunakan untuk peramalan.

Selanjutnya dilakukan uji hipotesis untuk mengetahui signifikansi parameter model. Hipotesis yang digunakan adalah:

\[ H_0 : \text{parameter} = 0 \]

\[ H_1 : \text{parameter} \ne 0 \]

Statistik uji yang digunakan adalah:

\[ t_{hitung} = \frac{\text{parameter estimasi}}{\text{SE parameter estimasi}} \]

Kriteria pengambilan keputusan adalah menolak \(H_0\) jika:

\[ |t_{hitung}| > t_{\alpha/2,(n-k)} \]

intercept_mu <- -0.0299 / (1 - 0.6972 - (-0.7064))
intercept_mu
## [1] -0.02962743
ar1_phi1 <- 0.6972 / 0.1220
ar1_phi1
## [1] 5.714754
ar2_phi2 <- -0.7064 / 0.0893
ar2_phi2
## [1] -7.910414
ma1_teta1 <- -0.0006 / 0.1449
ma1_teta1
## [1] -0.004140787
ma2_teta2<- 0.3732 / 0.1329
ma2_teta2
## [1] 2.808126
prmtr <- c("mu", "phi(1)", "phi(2)", "theta(1)", "theta(2)")

thitung <- c(abs(intercept_mu), abs(ar1_phi1), abs(ar2_phi2), abs(ma1_teta1), abs(ma2_teta2))

ttabel <- rep(1.981, 5)

keputusan <- ifelse(thitung > ttabel, "Signifikan", "Tidak Signifikan")

tabel_signif <- data.frame(
  "Parameter dugaan" = prmtr,
  "T-Hitung" = thitung,
  "T-Tabel" = ttabel,
  "Keputusan" = keputusan
)

tabel_signif
##   Parameter.dugaan    T.Hitung T.Tabel        Keputusan
## 1               mu 0.029627428   1.981 Tidak Signifikan
## 2           phi(1) 5.714754098   1.981       Signifikan
## 3           phi(2) 7.910414334   1.981       Signifikan
## 4         theta(1) 0.004140787   1.981 Tidak Signifikan
## 5         theta(2) 2.808126411   1.981       Signifikan
lmtest::coeftest(arima222)
## 
## z test of coefficients:
## 
##              Estimate  Std. Error z value  Pr(>|z|)    
## ar1        0.69722418  0.12200785  5.7146 1.100e-08 ***
## ar2       -0.70637928  0.08930404 -7.9098 2.578e-15 ***
## ma1       -0.00063465  0.14490503 -0.0044    0.9965    
## ma2        0.37318626  0.13294732  2.8070    0.0050 ** 
## intercept -0.02992489  0.12568978 -0.2381    0.8118    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Model \(ARIMA(2,0,2)\) menunjukkan bahwa tidak semua parameter signifikan. Parameter ma1 dan intercept tidak signifikan pada taraf nyata \(5%\)

#Dibandingkan dengan autoarima
auto.arima(data.dif2, trace = TRUE)
## 
##  ARIMA(2,0,2) with non-zero mean : 349.4075
##  ARIMA(0,0,0) with non-zero mean : 419.2018
##  ARIMA(1,0,0) with non-zero mean : 389.9771
##  ARIMA(0,0,1) with non-zero mean : 371.1358
##  ARIMA(0,0,0) with zero mean     : 417.1702
##  ARIMA(1,0,2) with non-zero mean : 369.5099
##  ARIMA(2,0,1) with non-zero mean : 352.291
##  ARIMA(3,0,2) with non-zero mean : 351.4932
##  ARIMA(2,0,3) with non-zero mean : 351.385
##  ARIMA(1,0,1) with non-zero mean : 371.074
##  ARIMA(1,0,3) with non-zero mean : 364.7356
##  ARIMA(3,0,1) with non-zero mean : 353.484
##  ARIMA(3,0,3) with non-zero mean : 350.1263
##  ARIMA(2,0,2) with zero mean     : 347.2431
##  ARIMA(1,0,2) with zero mean     : 367.3473
##  ARIMA(2,0,1) with zero mean     : 350.2026
##  ARIMA(3,0,2) with zero mean     : 349.2831
##  ARIMA(2,0,3) with zero mean     : 349.1743
##  ARIMA(1,0,1) with zero mean     : 368.9567
##  ARIMA(1,0,3) with zero mean     : 362.6261
##  ARIMA(3,0,1) with zero mean     : 351.3543
##  ARIMA(3,0,3) with zero mean     : 347.887
## 
##  Best model: ARIMA(2,0,2) with zero mean
## Series: data.dif2 
## ARIMA(2,0,2) with zero mean 
## 
## Coefficients:
##          ar1      ar2     ma1     ma2
##       0.6967  -0.7060  0.0002  0.3737
## s.e.  0.1220   0.0894  0.1449  0.1327
## 
## sigma^2 = 1.041:  log likelihood = -168.35
## AIC=346.71   AICc=347.24   BIC=360.56

Diagnostic model

ARIMA202diag <- stats::arima(data.dif2, order = c(2,0,2), method = "ML")
checkresiduals(ARIMA202diag)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(2,0,2) with non-zero mean
## Q* = 1.5853, df = 6, p-value = 0.9536
## 
## Model df: 4.   Total lags used: 10

Berdasarkan pl0t di atas terlihat bahwa sisaan tidak mengikuti sebaran normal. Selanjutnya, ditinjau dari plot ACF dan PACF terlihat bahwa tidak ada lag yang signifikan. Hal tersebut menunjukkan bahwa tidak ada gejala autokorelasi pada sisaan. Selanjutnya, untuk memastikan kembali akan dilakukan uji asumsi secara formal:

sisaan <- arima222$residuals

Uji formal normalitas data

H0: sisaan menyebar normal

H1: sisaan tidak mengikuti sebaran normal

# Uji formal normalitas data
ks.test(sisaan,"pnorm")
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  sisaan
## D = 0.038865, p-value = 0.9941
## alternative hypothesis: two-sided

Berdasarkan hasil pengujian diperoleh nilai statistik uji sebesar \(D = 0.038865\) dengan \(p\text{-value} = 0.9941\).

Dengan taraf signifikansi \(\alpha = 0.05\), kriteria pengambilan keputusan adalah tolak \(H_0\) jika \(p\text{-value} < 0.05\).

Karena diperoleh \(p\text{-value} = 0.9941 > 0.05\), maka gagal menolak \(H_0\). Dengan demikian dapat disimpulkan bahwa residual berdistribusi normal.

Hal ini menunjukkan bahwa asumsi normalitas pada model ARIMA(2,0,2) telah terpenuhi.

# Uji nilai tengah sisaan

H0:μ=0

H1:μ≠0

# Uji nilai tengah sisaan
t.test(sisaan, mu = 0, alternative = "two.sided")
## 
##  One Sample t-test
## 
## data:  sisaan
## t = 0.032496, df = 117, p-value = 0.9741
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -0.1805189  0.1865417
## sample estimates:
##   mean of x 
## 0.003011403

Berdasarkan hasil pengujian diperoleh nilai statistik uji sebesar \(t = 0.032496\) dengan derajat kebebasan \(df = 117\) dan \(p\text{-value} = 0.9741\). Selain itu, diperoleh rata-rata sampel sebesar \(\bar{x} = 0.003011403\) dengan interval kepercayaan 95% yaitu \((-0.1805189,\; 0.1865417)\).

Dengan taraf signifikansi \(\alpha = 0.05\), kriteria pengambilan keputusan adalah tolak \(H_0\) jika \(p\text{-value} < 0.05\).

Karena diperoleh \(p\text{-value} = 0.9741 > 0.05\), maka gagal menolak \(H_0\). Dengan demikian dapat disimpulkan bahwa rata-rata residual tidak berbeda secara signifikan dari nol.

Hal ini menunjukkan bahwa residual telah memenuhi asumsi dengan rata-rata mendekati nol, sehingga model ARIMA(2,0,2) dapat dikatakan baik dalam merepresentasikan data.

# Uji autokorelasi

H0: tidak ada autokorelasi

H1: terdapat autokorelasi

# Uji autokorelasi
Box.test(sisaan, lag = 23 ,type = "Ljung")
## 
##  Box-Ljung test
## 
## data:  sisaan
## X-squared = 8.7533, df = 23, p-value = 0.9967

Berdasarkan hasil pengujian diperoleh nilai statistik uji sebesar \(X^2 = 8.7533\) dengan derajat kebebasan \(df = 23\) dan \(p\text{-value} = 0.9967\).

Dengan taraf signifikansi \(\alpha = 0.05\), kriteria pengambilan keputusan adalah tolak \(H_0\) jika \(p\text{-value} < 0.05\).

Karena diperoleh \(p\text{-value} = 0.9967 > 0.05\), maka gagal menolak \(H_0\). Dengan demikian dapat disimpulkan bahwa tidak terdapat autokorelasi pada residual.

Hal ini menunjukkan bahwa residual bersifat white noise, sehingga model ARIMA(2,0,2) telah memenuhi asumsi independensi residual dan layak digunakan untuk peramalan. Kesimpulan: Model terbaik adalah \(ARIMA(2,0,2)\) berdasarkan nilai AIC terkecil. Model ini memenuhi seluruh uji diagnostik (normalitas, rata-rata nol, dan tidak ada autokorelasi), sehingga residual bersifat white noise. Dengan demikian, model layak digunakan untuk peramalan