Pemodelan ARIMA - Pendugaan Parameter, Diagnostik Model, dan Peramalan

Author

Windi Pangesti

Published

September 30, 2025

1 Packages

library(ggplot2)
Warning: package 'ggplot2' was built under R version 4.5.1
library(tsibble)
Warning: package 'tsibble' was built under R version 4.5.1
Registered S3 method overwritten by 'tsibble':
  method               from 
  as_tibble.grouped_df dplyr

Attaching package: 'tsibble'
The following objects are masked from 'package:base':

    intersect, setdiff, union
library(tseries)
Warning: package 'tseries' was built under R version 4.5.1
Registered S3 method overwritten by 'quantmod':
  method            from
  as.zoo.data.frame zoo 
library(MASS)
Warning: package 'MASS' was built under R version 4.5.1
library(forecast)
Warning: package 'forecast' was built under R version 4.5.1
library(TSA)
Warning: package 'TSA' was built under R version 4.5.1
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
library(TTR)
Warning: package 'TTR' was built under R version 4.5.1
library(aTSA)

Attaching package: 'aTSA'
The following object is masked from 'package:forecast':

    forecast
The following objects are masked from 'package:tseries':

    adf.test, kpss.test, pp.test
The following object is masked from 'package:graphics':

    identify
library(graphics)

2 Data Bangkitan

2.1 Pembangkitan Data

Data yang akan dibangkitkan adalah data dengan model MA(2) sebagai berikut.

set.seed(99)
ma2 <- arima.sim(list(order = c(0,0,2), ma = c(0.55,0.65)), n = 175)+4
ma2
Time Series:
Start = 1 
End = 175 
Frequency = 1 
  [1] 4.49071631 4.80394208 3.93837292 4.21162120 2.96778088 4.09424753
  [7] 3.34367706 2.82374946 2.30572186 3.67012008 4.77215717 2.50298361
 [13] 0.06689652 0.69719194 1.62952003 2.03843466 3.28275389 3.41093311
 [19] 5.57205655 5.53304026 5.06876470 4.11188578 3.99453461 4.45028419
 [25] 5.13185970 4.18878528 2.77669801 4.29314034 5.25424896 6.11546992
 [31] 4.99383232 4.34030238 1.68064153 1.45459776 1.55933893 3.07120223
 [37] 3.99958888 4.41679260 4.36932382 2.60366790 2.88436115 1.20290343
 [43] 1.58546297 0.87504167 1.43567718 1.74447003 4.58115546 4.19264317
 [49] 3.41497257 3.65617694 3.64870703 4.18915281 2.91427928 3.06953017
 [55] 2.72924825 4.05224518 3.19315725 3.13139205 2.98300418 3.30952700
 [61] 3.38662568 3.93815667 2.75216183 2.22537215 2.75469274 3.27920726
 [67] 3.71367963 4.18194076 4.52010140 5.06423657 3.84069820 4.17380212
 [73] 2.81737472 3.88403244 4.28112889 5.88417181 4.60943031 4.79040128
 [79] 3.75600991 4.46374501 3.07651548 4.47149619 4.95331895 5.58093098
 [85] 5.02410403 5.65717457 4.79529040 5.57746719 4.30866531 4.54586289
 [91] 5.90287735 6.26262115 4.90377794 4.16778182 2.97888110 3.96261300
 [97] 4.57632862 5.17638845 3.29212732 3.08407762 1.51997819 2.37682895
[103] 1.41729445 2.62729467 4.55626129 4.53506176 4.33273421 4.09764594
[109] 3.69189530 6.26922352 4.71058587 2.18796459 0.99271444 2.36017520
[115] 2.56802058 3.12571455 2.35220118 1.39504830 3.32322089 3.51819723
[121] 3.65100047 2.06437183 2.50074056 3.72894093 4.51803113 5.96147741
[127] 6.31810865 4.49844946 4.70019321 3.19925150 4.97200242 5.23609125
[133] 4.61041577 4.43158609 4.70286955 4.97817978 2.99749253 3.36446001
[139] 3.39733570 5.98789818 5.54326091 5.98082205 4.07580985 3.50924650
[145] 3.01548178 3.71216360 3.35567942 5.32792863 2.71263888 3.48230604
[151] 3.95741680 5.61687328 6.11543361 4.36342978 4.02669402 4.06572631
[157] 6.41852142 6.45760770 5.78313790 3.77679260 4.73861434 3.90112243
[163] 3.01927456 1.89874624 2.97162008 4.09943497 5.53945885 3.61065518
[169] 5.28958884 3.25253226 5.06698088 4.48742994 3.90755200 4.68000318
[175] 2.82863391

Data kemudian dibagi menjadi data latih dan data uji. Pembagian kali ini dilakukan dengan proporsi / perbandingan, yaitu 80:20.

ma2 <- ma2[-c(1:25)]
ma2.train <- ma2[1:120]
ma2.test <- ma2[121:150]

2.2 Eksplorasi Data

Sebelum masuk dalam tahap pemodelan, dilakukan eksplorasi data dengan plot deret waktu untuk melihat pola data.

#--PLOT TIME SERIES--#
plot(ma2.train,
     col = "navyblue",
     lwd = 1,
     type = "o",
     xlab = "Time",
     ylab = "Data")

Berdasarkan plot data deret waktu di atas, terlihat data cenderung stasioner dalam rataan dan ragam. Data stasioner dalam rataan karena menyebar/bergerak di sekitar nilai tengahnya (0) dan dikatakan stasioner dalam ragam karena memiliki lebar pita yang cenderung sama. Selain dengan plot data deret waktu, akan dilakukan pengecekan stasioneritas data dengan plot ACF dan uji ADF.

#--CEK KESTASIONERAN---#
acf(ma2.train, main="ACF", lag.max=20)

Berdasarkan plot ACF di atas, dapat dilihat bahwa plot cuts off pada lag ke-2. Hal ini sesuai dengan proses pembangkitan model MA(2).

tseries::adf.test(ma2.train) 

    Augmented Dickey-Fuller Test

data:  ma2.train
Dickey-Fuller = -3.96, Lag order = 4, p-value = 0.01358
alternative hypothesis: stationary
#stasioner

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar 0.01358 yang lebih kecil dari taraf nyata 5% sehingga tolak \(H_0\) dan menandakan bahwa data stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF.

index <- seq(1:120)

# Box-Cox
bc <- boxcox(
  ma2.train~index,
  lambda = seq(0, 3, by = 1)
)

# Nilai lambda optimum
lambda <- bc$x[which.max(bc$y)]
lambda
[1] 1.090909
# Selang kepercayaan 95% untuk lambda
ci_lambda <- bc$x[bc$y > max(bc$y) - 0.5 * qchisq(0.95, 1)]

# Batas bawah dan batas atas
ci_lower <- min(ci_lambda)
ci_upper <- max(ci_lambda)

c(Batas_Bawah = ci_lower, Batas_Atas = ci_upper)
Batas_Bawah  Batas_Atas 
  0.6969697   1.5151515 

Gambar di atas menunjukkan nilai rounded value (\(\lambda\)) optimum sebesar 1,09 dan pada selang kepercayaan 95% nilai memiliki batas bawah 0,69 dan batas atas 1,515. Selang tersebut memuat nilai satu sehingga dapat dikatakan bahwa data bangkitan stasioner dalam ragam.

2.3 Spesifikasi Model

#---SPESIFIKASI MODEL---#
par(mfrow = c(1,2))
acf(ma2.train, main="ACF", lag.max=20) #ARIMA(0,0,2)
pacf(ma2.train, main="PACF", lag.max=20) #ARIMA(1,0,0)

par(mfrow = c(1,1))

Berdasarkan Plot ACF, terlihat cuts off pada lag ke-2 sehingga dapat kita asumsikan model yang terbentuk adalah ARIMA(0,0,2). Selanjutnya, berdasarkan plot PACF, terlihat cuts off pada lag pertama sehingga model yang terbentuk adalah ARIMA(1,0,0). Selain dengan plot ACF dan PACF, penentuan spesifikasi model dilakukan dengan extended ACF (EACF) berikut ini.

eacf(ma2.train) 
AR/MA
  0 1 2 3 4 5 6 7 8 9 10 11 12 13
0 x x o o o o o o o o o  o  o  o 
1 o x x o o o o o o o o  o  o  o 
2 x x x o o o o o o o o  o  o  o 
3 x x x o o o o o o o o  o  o  o 
4 o o o x o o o o o o o  o  o  o 
5 x o o x o o o o o o o  o  o  o 
6 x o o o o o o o x o o  o  o  o 
7 o o o o o x o o o o o  o  o  o 
#ARIMA(0,0,2) #ARIMA(1,0,3) #ARIMA(2,0,3) #ARIMA(3,0,3) 
#Terdapat 5 model tentatif

Menggunakan plot EACF, dapat diambil beberapa model dengan melihat ujung segitiga yang terbentuk, antara lain ARIMA(0,0,2), ARIMA(1,0,3), ARIMA(2,0,3), dan ARIMA(3,0,3).

2.4 Pendugaan Parameter

Selanjutnya akan dilakukan pendugaan parameter kelima model ARIMA yang terbentuk sebelumnya. Pendugaan dilakukan dengan fungsi Arima() yang dilanjutkan dengan melihat nilai AIC pada ringkasan data dan melihat signifikansi parameter.

#---PENDUGAAN PARAMETER MODEL---#
model1.ma2=Arima(ma2.train, order=c(0,0,2),method="ML")
summary(model1.ma2) #AIC=326.87
Series: ma2.train 
ARIMA(0,0,2) with non-zero mean 

Coefficients:
         ma1     ma2    mean
      0.6953  0.5349  3.7918
s.e.  0.0829  0.0673  0.1841

sigma^2 = 0.8497:  log likelihood = -159.44
AIC=326.87   AICc=327.22   BIC=338.02

Training set error measures:
                       ME     RMSE     MAE       MPE     MAPE     MASE
Training set -0.004254881 0.910219 0.73195 -9.740748 24.85194 0.852277
                   ACF1
Training set 0.05965759
lmtest::coeftest(model1.ma2) #seluruh parameter signifikan

z test of coefficients:

          Estimate Std. Error z value  Pr(>|z|)    
ma1       0.695312   0.082903  8.3871 < 2.2e-16 ***
ma2       0.534929   0.067337  7.9441 1.957e-15 ***
intercept 3.791764   0.184115 20.5946 < 2.2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model2.ma2=Arima(ma2.train, order=c(1,0,0),method="ML") 
summary(model2.ma2) #AIC=340.47
Series: ma2.train 
ARIMA(1,0,0) with non-zero mean 

Coefficients:
         ar1    mean
      0.6428  3.7815
s.e.  0.0690  0.2450

sigma^2 = 0.9625:  log likelihood = -167.24
AIC=340.47   AICc=340.68   BIC=348.84

Training set error measures:
                       ME      RMSE       MAE       MPE     MAPE      MASE
Training set -0.002975587 0.9728552 0.7723112 -10.61667 26.61199 0.8992733
                   ACF1
Training set 0.06622426
lmtest::coeftest(model2.ma2) #seluruh parameter signifikan

z test of coefficients:

          Estimate Std. Error z value  Pr(>|z|)    
ar1       0.642823   0.069023  9.3131 < 2.2e-16 ***
intercept 3.781515   0.245000 15.4348 < 2.2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model3.ma2=Arima(ma2.train, order=c(1,0,3),method="ML") 
summary(model3.ma2) #AIC=329.22
Series: ma2.train 
ARIMA(1,0,3) with non-zero mean 

Coefficients:
         ar1    ma1     ma2     ma3    mean
      0.0610  0.684  0.6137  0.0934  3.7918
s.e.  0.4257  0.416  0.3263  0.2714  0.2083

sigma^2 = 0.8518:  log likelihood = -158.61
AIC=329.22   AICc=329.96   BIC=345.94

Training set error measures:
                       ME      RMSE      MAE       MPE     MAPE     MASE
Training set -0.004465851 0.9034798 0.725319 -8.862145 24.28653 0.844556
                    ACF1
Training set 0.005156424
lmtest::coeftest(model3.ma2) #tidak ada yang signifikan

z test of coefficients:

          Estimate Std. Error z value Pr(>|z|)    
ar1       0.060970   0.425686  0.1432  0.88611    
ma1       0.684021   0.415962  1.6444  0.10009    
ma2       0.613727   0.326319  1.8808  0.06001 .  
ma3       0.093411   0.271412  0.3442  0.73072    
intercept 3.791809   0.208338 18.2003  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model4.ma2=Arima(ma2.train, order=c(2,0,3),method="ML") 
summary(model4.ma2) #AIC=330.6
Series: ma2.train 
ARIMA(2,0,3) with non-zero mean 

Coefficients:
         ar1      ar2     ma1     ma2     ma3    mean
      0.2670  -0.1935  0.4749  0.6454  0.0524  3.7925
s.e.  0.4227   0.1744  0.4136  0.3050  0.2587  0.1916

sigma^2 = 0.8538:  log likelihood = -158.3
AIC=330.6   AICc=331.6   BIC=350.11

Training set error measures:
                       ME      RMSE       MAE       MPE     MAPE      MASE
Training set -0.004511346 0.9006288 0.7299239 -9.000208 24.57932 0.8499178
                    ACF1
Training set 0.006394934
lmtest::coeftest(model4.ma2) #hanya ma2 yang signifikan

z test of coefficients:

           Estimate Std. Error z value Pr(>|z|)    
ar1        0.267023   0.422731  0.6317  0.52761    
ar2       -0.193470   0.174380 -1.1095  0.26723    
ma1        0.474856   0.413641  1.1480  0.25097    
ma2        0.645418   0.304955  2.1164  0.03431 *  
ma3        0.052372   0.258742  0.2024  0.83960    
intercept  3.792457   0.191625 19.7910  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model5.ma2=Arima(ma2.train, order=c(3,0,3),method="ML") 
summary(model5.ma2) #AIC=329.87
Series: ma2.train 
ARIMA(3,0,3) with non-zero mean 

Coefficients:
          ar1     ar2      ar3     ma1     ma2     ma3    mean
      -0.3810  0.2176  -0.2170  1.1432  0.7306  0.3543  3.7947
s.e.   0.3026  0.1535   0.1541  0.2896  0.3056  0.2426  0.1890

sigma^2 = 0.8418:  log likelihood = -156.93
AIC=329.87   AICc=331.16   BIC=352.17

Training set error measures:
                       ME      RMSE     MAE       MPE     MAPE      MASE
Training set -0.004402562 0.8903241 0.70915 -8.698653 23.76772 0.8257288
                   ACF1
Training set 0.01679809
lmtest::coeftest(model5.ma2) #hanya ma1 dan ma2 yang signifikan

z test of coefficients:

          Estimate Std. Error z value  Pr(>|z|)    
ar1       -0.38103    0.30264 -1.2590    0.2080    
ar2        0.21757    0.15355  1.4170    0.1565    
ar3       -0.21701    0.15408 -1.4084    0.1590    
ma1        1.14318    0.28962  3.9472 7.909e-05 ***
ma2        0.73062    0.30555  2.3911    0.0168 *  
ma3        0.35428    0.24258  1.4605    0.1442    
intercept  3.79470    0.18897 20.0808 < 2.2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#model yang dipilih adalah model 1, yaitu ARIMA(0,0,2)
hasil_model <- data.frame(
  Model = c("ARIMA(0,0,2)",
            "ARIMA(1,0,0)",
            "ARIMA(1,0,3)",
            "ARIMA(2,0,3)",
            "ARIMA(3,0,3)"),
  AIC = c(
    AIC(model1.ma2),
    AIC(model2.ma2),
    AIC(model3.ma2),
    AIC(model4.ma2),
    AIC(model5.ma2)
  ),
  BIC = c(
    BIC(model1.ma2),
    BIC(model2.ma2),
    BIC(model3.ma2),
    BIC(model4.ma2),
    BIC(model5.ma2)
  )
)

hasil_model
         Model      AIC      BIC
1 ARIMA(0,0,2) 326.8723 338.0222
2 ARIMA(1,0,0) 340.4735 348.8360
3 ARIMA(1,0,3) 329.2172 345.9421
4 ARIMA(2,0,3) 330.5985 350.1109
5 ARIMA(3,0,3) 329.8664 352.1664

Berdasarkan pendugaan parameter di atas, nilai AIC terkecil dimiliki oleh model ARIMA(0,0,2) dan parameter model ARIMA(0,0,2) juga seluruhnya signifikan sehingga model yang dipilih adalah model ARIMA(0,0,2).

2.5 Analisis Sisaan

Model terbaik hasil identifikasi kemudian dicek asumsi sisaannya. Sisaan model ARIMA harus memenuhi asumsi normalitas, kebebasan, dan kehomogenan ragam. Diagnostik model dilakukan secara eksplorasi dan uji formal.

2.5.1 Eksplorasi Sisaan

#Eksplorasi
sisaan.ma2 <- model1.ma2$residuals
par(mfrow=c(2,2))

#qqnorm(sisaan.ma2)
#qqline(sisaan.ma2, col = "blue", lwd = 2)
car::qqPlot(sisaan.ma2)
[1] 87 85
plot(c(1:length(sisaan.ma2)),sisaan.ma2)

# ACFF dan PACF sisaan
acf(sisaan.ma2)
pacf(sisaan.ma2)

par(mfrow = c(2,2))

Berdasarkan plot kuantil-kuantil normal, secara eksplorasi ditunjukkan sisaan menyebar normal mengikuti garis \(45^{\circ}\). Kemudian dapat dilihat juga lebar pita sisaan yang cenderung sama menandakan bahwa sisaan memiliki ragam yang homogen. Akan tetapi, plot ACF dan PACF sisaan ARIMA(0,0,2) signifikan pada lag ke-6 sehingga sisaan tidak saling bebas. Kondisi ini akan diuji lebih lanjut dengan uji formal.

2.5.2 Uji Formal

#1) Sisaan Menyebar Normal
ks.test(sisaan.ma2,"pnorm") 

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  sisaan.ma2
D = 0.043157, p-value = 0.9788
alternative hypothesis: two-sided
#gagal tolak H0 > sisaan menyebar normal

Selain dengan eksplorasi, asumsi tersebut dapat diuji menggunakan uji formal. Pada tahapan ini uji formal yang digunakan untuk normalitas adalah uji Kolmogorov-Smirnov (KS). Hipotesis pada uji KS adalah sebagai berikut.

\(H_0\) : Sisaan menyebar normal

\(H_1\) : Sisaan tidak menyebar normal

Berdasarkan uji KS tersebut, didapat p-value sebesar 0.9788 yang lebih besar dari taraf nyata 5% sehingga gagal tolak \(H_0\) dan menandakan bahwa sisaan menyebar normal. Hal ini sesuai dengan hasil eksplorasi menggunakan plot kuantil-kuantil normal.

#2) Sisaan saling bebas/tidak ada autokorelasi
Box.test(sisaan.ma2, type = "Ljung") 

    Box-Ljung test

data:  sisaan.ma2
X-squared = 0.43785, df = 1, p-value = 0.5082
#gagal tolak H0 > sisaan saling bebas

Selanjutnya akan dilakukan uji formal untuk kebebasan sisaan menggunakan uji Ljung-Box. Hipotesis yang digunakan adalah sebagai berikut.

\(H_0\) : Sisaan saling bebas

\(H_1\) : Sisaan tidak tidak saling bebas

Berdasarkan uji Ljung-Box tersebut, didapat p-value sebesar 0.5082 yang lebih besar dari taraf nyata 5% sehingga gagal tolak \(H_0\) dan menandakan bahwa sisaan saling bebas. Hal ini berbeda dengan eksplorasi.

#3) Sisaan homogen
Box.test((sisaan.ma2)^2, type = "Ljung") 

    Box-Ljung test

data:  (sisaan.ma2)^2
X-squared = 2.4711, df = 1, p-value = 0.116
#gagal tolak H0 > sisaan homogen

Hipotesis yang digunakan untuk uji kehomogenan ragam adalah sebagai berikut.

\(H_0\) : Ragam sisaan homogen

\(H_1\) : Ragam sisaan tidak homogen

Berdasarkan uji Ljung-Box terhadap sisaan kuadrat tersebut, didapat p-value sebesar 0.116 yang lebih besar dari taraf nyata 5% sehingga gagal tolak \(H_0\) dan menandakan bahwa ragam sisaan homogen.

#4) Nilai tengah sisaan sama dengan nol
t.test(sisaan.ma2, mu = 0, conf.level = 0.95) 

    One Sample t-test

data:  sisaan.ma2
t = -0.050994, df = 119, p-value = 0.9594
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 -0.1694719  0.1609621
sample estimates:
   mean of x 
-0.004254881 
#gagal tolak h0 > nilai tengah sisaan sama dengan 0

Terakhir, dengan uji-t, akan dicek apakah nilai tengah sisaan sama dengan nol. Hipotesis yang diujikan sebagai berikut.

\(H_0\) : nilai tengah sisaan sama dengan 0

\(H_1\) : nilai tengah sisaan tidak sama dengan 0

Berdasarkan uji-ttersebut, didapat p-value sebesar 0.9594 yang lebih besar dari taraf nyata 5% sehingga gagal tolak \(H_0\) dan menandakan bahwa nilai tengah sisaan sama dengan nol. Hal ini berbeda dengan eksplorasi.

2.6 Overfitting

Tahapan selanjutnya adalah overfitting dilakukan dengan menaikkan orde AR(p) dan MA(q) dari model ARIMA(0,0,2) untuk melihat apakah terdapat model lain yang lebih baik dari model saat ini. Kandidat model overfitting adalah ARIMA(1,0,2) dan ARIMA(0,0,3).

#---OVERFITTING---#
model1a.ma2=Arima(ma2.train, order=c(1,0,2),method="ML")
summary(model1a.ma2) #327.31
Series: ma2.train 
ARIMA(1,0,2) with non-zero mean 

Coefficients:
         ar1     ma1     ma2    mean
      0.1990  0.5451  0.5029  3.7917
s.e.  0.1412  0.1239  0.0836  0.2093

sigma^2 = 0.8453:  log likelihood = -158.65
AIC=327.31   AICc=327.84   BIC=341.25

Training set error measures:
                       ME      RMSE       MAE       MPE     MAPE      MASE
Training set -0.004448537 0.9039253 0.7240135 -8.892151 24.23053 0.8430358
                    ACF1
Training set 0.007803042
lmtest::coeftest(model1a.ma2) #ar1 tidak signifikan

z test of coefficients:

          Estimate Std. Error z value  Pr(>|z|)    
ar1       0.199039   0.141222  1.4094    0.1587    
ma1       0.545109   0.123914  4.3991 1.087e-05 ***
ma2       0.502936   0.083609  6.0153 1.795e-09 ***
intercept 3.791724   0.209264 18.1193 < 2.2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model1b.ma2=Arima(ma2.train, order=c(0,0,3),method="ML")
summary(model1b.ma2) #327.24
Series: ma2.train 
ARIMA(0,0,3) with non-zero mean 

Coefficients:
         ma1    ma2     ma3    mean
      0.7415  0.656  0.1286  3.7916
s.e.  0.0878  0.118  0.0997  0.2067

sigma^2 = 0.8446:  log likelihood = -158.62
AIC=327.24   AICc=327.77   BIC=341.18

Training set error measures:
                       ME      RMSE       MAE      MPE     MAPE      MASE
Training set -0.004403296 0.9035497 0.7261616 -8.89926 24.34304 0.8455371
                    ACF1
Training set 0.007516805
lmtest::coeftest(model1b.ma2) #ma3 tidak signifikan

z test of coefficients:

          Estimate Std. Error z value  Pr(>|z|)    
ma1       0.741488   0.087816  8.4436 < 2.2e-16 ***
ma2       0.656016   0.118034  5.5579 2.731e-08 ***
ma3       0.128647   0.099655  1.2909    0.1967    
intercept 3.791645   0.206722 18.3417 < 2.2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#model yang dipilih adalah model awal, yaitu ARIMA(0,0,2)
overfitting <- data.frame(
  Model = c("ARIMA(1,0,2)","ARIMA(0,0,2)", "ARIMA(0,0,3)"),
  AIC   = c(AIC(model1a.ma2),AIC(model1.ma2), AIC(model1b.ma2)),
  BIC   = c(BIC(model1a.ma2),BIC(model1.ma2), BIC(model1b.ma2))
)

overfitting
         Model      AIC      BIC
1 ARIMA(1,0,2) 327.3095 341.2470
2 ARIMA(0,0,2) 326.8723 338.0222
3 ARIMA(0,0,3) 327.2393 341.1768

Berdasarkan kedua model hasil overfitting di atas, model ARIMA(1,0,2) dan ARIMA(0,0,3) memiliki AIC yang lebih besar dibandingkan dengan model ARIMA(0,0,2) dan parameter kedua model ARIMA(1,0,2) dan ARIMA(0,0,3) tidak seluruhnya signifikan. Oleh karena itu, model ARIMA(0,0,2) akan tetap digunakan untuk melakukan peramalan.

2.7 Peramalan

Peramalan dilakukan menggunakan fungsi forecast() . Contoh peramalan berikut ini dilakukan untuk 30 hari ke depan.

#---FORECAST---#
ramalan <- forecast::forecast(model1.ma2, h = 30) 
ramalan
    Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
121       3.438126 2.256773 4.619479 1.631403 5.244850
122       3.678541 2.239685 5.117397 1.478000 5.879082
123       3.791764 2.220250 5.363278 1.388341 6.195187
124       3.791764 2.220250 5.363278 1.388341 6.195187
125       3.791764 2.220250 5.363278 1.388341 6.195187
126       3.791764 2.220250 5.363278 1.388341 6.195187
127       3.791764 2.220250 5.363278 1.388341 6.195187
128       3.791764 2.220250 5.363278 1.388341 6.195187
129       3.791764 2.220250 5.363278 1.388341 6.195187
130       3.791764 2.220250 5.363278 1.388341 6.195187
131       3.791764 2.220250 5.363278 1.388341 6.195187
132       3.791764 2.220250 5.363278 1.388341 6.195187
133       3.791764 2.220250 5.363278 1.388341 6.195187
134       3.791764 2.220250 5.363278 1.388341 6.195187
135       3.791764 2.220250 5.363278 1.388341 6.195187
136       3.791764 2.220250 5.363278 1.388341 6.195187
137       3.791764 2.220250 5.363278 1.388341 6.195187
138       3.791764 2.220250 5.363278 1.388341 6.195187
139       3.791764 2.220250 5.363278 1.388341 6.195187
140       3.791764 2.220250 5.363278 1.388341 6.195187
141       3.791764 2.220250 5.363278 1.388341 6.195187
142       3.791764 2.220250 5.363278 1.388341 6.195187
143       3.791764 2.220250 5.363278 1.388341 6.195187
144       3.791764 2.220250 5.363278 1.388341 6.195187
145       3.791764 2.220250 5.363278 1.388341 6.195187
146       3.791764 2.220250 5.363278 1.388341 6.195187
147       3.791764 2.220250 5.363278 1.388341 6.195187
148       3.791764 2.220250 5.363278 1.388341 6.195187
149       3.791764 2.220250 5.363278 1.388341 6.195187
150       3.791764 2.220250 5.363278 1.388341 6.195187
data.ramalan <- ramalan$mean
plot(ramalan)

Berdasarkan hasil plot ramalan di atas, dapat dilihat bahwa ramalan ARIMA(0,0,2) cenderung meningkat di awal periode dan stabil hingga akhir periode. Selanjutnya, dapat dicari nilai akurasi antara hasil ramalan dengan data uji sebagai berikut.

perbandingan<-matrix(data=c(ma2.test, data.ramalan),
                     nrow = 30, ncol = 2)
colnames(perbandingan)<-c("Aktual","Hasil Forecast")
perbandingan
        Aktual Hasil Forecast
 [1,] 3.712164       3.438126
 [2,] 3.355679       3.678541
 [3,] 5.327929       3.791764
 [4,] 2.712639       3.791764
 [5,] 3.482306       3.791764
 [6,] 3.957417       3.791764
 [7,] 5.616873       3.791764
 [8,] 6.115434       3.791764
 [9,] 4.363430       3.791764
[10,] 4.026694       3.791764
[11,] 4.065726       3.791764
[12,] 6.418521       3.791764
[13,] 6.457608       3.791764
[14,] 5.783138       3.791764
[15,] 3.776793       3.791764
[16,] 4.738614       3.791764
[17,] 3.901122       3.791764
[18,] 3.019275       3.791764
[19,] 1.898746       3.791764
[20,] 2.971620       3.791764
[21,] 4.099435       3.791764
[22,] 5.539459       3.791764
[23,] 3.610655       3.791764
[24,] 5.289589       3.791764
[25,] 3.252532       3.791764
[26,] 5.066981       3.791764
[27,] 4.487430       3.791764
[28,] 3.907552       3.791764
[29,] 4.680003       3.791764
[30,] 2.828634       3.791764
# Akurasi
accuracy(data.ramalan, ma2.test)
                ME     RMSE       MAE      MPE     MAPE
Test set 0.5059314 1.242369 0.9656338 4.625391 22.43956

3 Data Real

Digunakan data kurs yang dalam hal ini hanya digunakan data 500 periode awal

datakurs<-rio::import("https://raw.githubusercontent.com/rizkynurhambali/praktikum-sta1341/refs/heads/main/Pertemuan%2067/kurs.csv")
datakurs <- datakurs[1:500,]
datakurs.ts<-ts(datakurs)

3.1 Eksplorasi Data

3.1.1 Plot Data Penuh

plot.ts(datakurs.ts, 
        lty = 1, 
        xlab = "Waktu", 
        ylab = "Kurs", 
        main = "Plot Data Kurs")

Berdasarkan plot data deret waktu, terlihat bahwa data cenderung memiliki trend yang naik. Berdasarkan pola data, pembagian data latih dan data uji ditetapkan dengan proporsi 86%:14%.

3.1.2 Plot Data Latih

kurstrain<-datakurs[1:430]
train.ts<-ts(kurstrain)
plot.ts(train.ts, lty=1, xlab="waktu", ylab="Kurs", main="Plot Kurs Train")

Berdasarkan plot data deret waktu pada data latih, terlihat bahwa data cenderung memiliki trend yang naik dan cenderung tidak bergerak pada nilai tengah tertentu. Hal ini mengindikasikan bahwa data tidak stasioner dalam rataan.

3.1.3 Plot Data Uji

kurstest<-datakurs[431:500]
test.ts<-ts(kurstest)
plot.ts(test.ts, lty=1, xlab="waktu", ylab="Kurs", main="Plot Kurs Test")

3.2 Uji Stasioneritas Data

3.2.1 Plot ACF

acf(train.ts)

Berdasarkan plot ACF, terlihat bahwa plot ACF data menurun secara perlahan (tails of slowly). Hal ini juga menjadi indikasi bahwa data tidak stasioner dalam rataan

3.2.2 Uji ADF

tseries::adf.test(train.ts)

    Augmented Dickey-Fuller Test

data:  train.ts
Dickey-Fuller = -2.0526, Lag order = 7, p-value = 0.5553
alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar 0.5553 yang lebih besar dari taraf nyata 5% sehingga tak tolak \(H_0\) dan menandakan bahwa data tidak stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF, sehingga ketidakstasioneran model kedepannya harus ditangani

3.2.3 Plot Box-Cox

index <- seq(1:430)

# Box-Cox
bc <- boxcox(train.ts ~ index, lambda = seq(5, 10, by = 1))

# Nilai lambda optimum (rounded)
lambda_opt <- bc$x[which.max(bc$y)]
lambda_opt
[1] 6.616162
# Selang kepercayaan 95% untuk lambda
ci_lambda <- bc$x[bc$y > max(bc$y) - 0.5 * qchisq(0.95, df = 1)]

# Batas bawah dan batas atas
ci_lower <- min(ci_lambda)
ci_upper <- max(ci_lambda)

c(Batas_Bawah = ci_lower, Batas_Atas = ci_upper)
Batas_Bawah  Batas_Atas 
   5.656566    7.676768 

Plot Boxcox menunjukkan nilai rounded value (\(\lambda\)) optimum sebesar 6,62 dan pada selang kepercayaan 95% nilai memiliki batas bawah 5,66 dan batas atas 7,68. Selang tersebut memuat nilai satu sehingga dapat dikatakan bahwa data bangkitan stasioner dalam ragam.

3.3 Penanganan Ketidakstasioneran Data

# Dufferencing pertama
train.diff<-diff(train.ts,differences = 1) 

# Plot hasil differencing
plot.ts(train.diff, lty=1, xlab="waktu", ylab="Data Difference 1 Kurs", main="Plot Difference Kurs")

Berdasarkan plot data deret waktu, terlihat bahwa data sudah stasioner dalam rataan ditandai dengan data bergerak pada nilai tengah tertentu (tidak terdapat trend ataupun musiman pada data)

3.3.1 Plot ACF

acf(train.diff)

Berdasarkan plot tersebut, terlihat bahwa plot ACF cuts off pada lag ke 1. Hal ini menandakan data sudah stasioner dalam rataan dan ketidakstasioneran data telah berhasil tertangani.

3.3.2 Uji ADF

tseries::adf.test(train.diff)
Warning in tseries::adf.test(train.diff): p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  train.diff
Dickey-Fuller = -6.3673, Lag order = 7, p-value = 0.01
alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar 0.01 yang lebih kecil dari taraf nyata 5% sehingga tolak \(H_0\) atau data stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF, sehingga dalam hal ini ketidakstasioneran data sudah berhasil ditangani dan dapat dilanjutkan ke pemodelan

3.4 Identifikasi Model

3.4.1 Plot ACF

acf(train.diff)

Berdasarkan plot tersebut, terlihat bahwa plot ACF cenderung cuts off pada lag ke 1, sehingga jika plot PACF dianggap tails of, maka model tentatifnya adalah ARIMA(0,1,1).

3.4.2 Plot PACF

pacf(train.diff)

Berdasarkan plot tersebut, terlihat bahwa plot PACF cenderung cuts off pada lag ke 1, sehingga jika plot ACF dianggap tails of, maka model tentatifnya adalah ARIMA(1,1,0).

Jika baik plot ACF maupun plot PACF keduanya dianggap tails of, maka model yang terbentuk adalah ARIMA(1,1,1)

3.4.3 Plot EACF

eacf(train.diff)
AR/MA
  0 1 2 3 4 5 6 7 8 9 10 11 12 13
0 x o o o o o o o o o o  o  o  o 
1 x x o o o o o o o o o  o  o  o 
2 x 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 x 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 x x o o o o o  o  o  o 
7 x x o x x x x o o o o  o  o  o 

Identifikasi model menggunakan plot EACF dilakukan dengan melihat ujung segitiga pada pola segitiga nol. Dalam hal ini model tentatif yang terbentuk adalah ARIMA(1,1,2), ARIMA(2,1,2), dan ARIMA(3,1,2).

3.5 Pendugaan Parameter Model Tentatif

3.5.1 ARIMA(0,1,1)

model1.da=Arima(train.diff, order=c(0,0,1),method="ML")
summary(model1.da) #AIC=4752.56
Series: train.diff 
ARIMA(0,0,1) with non-zero mean 

Coefficients:
         ma1    mean
      0.1352  7.1077
s.e.  0.0498  3.3499

sigma^2 = 3756:  log likelihood = -2373.28
AIC=4752.56   AICc=4752.62   BIC=4764.75

Training set error measures:
                       ME  RMSE      MAE  MPE MAPE      MASE         ACF1
Training set -0.005374792 61.14 43.42061 -Inf  Inf 0.7396625 -0.006155765
lmtest::coeftest(model1.da) #seluruh parameter signifikan

z test of coefficients:

          Estimate Std. Error z value Pr(>|z|)   
ma1       0.135154   0.049751  2.7166 0.006596 **
intercept 7.107718   3.349898  2.1218 0.033857 * 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

3.5.2 ARIMA(1,1,0)

model2.da=Arima(train.diff, order=c(1,0,0),method="ML")
summary(model2.da) #AIC=4753.48
Series: train.diff 
ARIMA(1,0,0) with non-zero mean 

Coefficients:
         ar1    mean
      0.1189  7.1095
s.e.  0.0479  3.3529

sigma^2 = 3764:  log likelihood = -2373.74
AIC=4753.48   AICc=4753.54   BIC=4765.66

Training set error measures:
                       ME    RMSE      MAE  MPE MAPE      MASE        ACF1
Training set -0.005694796 61.2056 43.46036 -Inf  Inf 0.7403397 0.009939135
lmtest::coeftest(model2.da) #seluruh parameter signifikan

z test of coefficients:

          Estimate Std. Error z value Pr(>|z|)  
ar1       0.118948   0.047901  2.4832  0.01302 *
intercept 7.109487   3.352935  2.1204  0.03397 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

3.5.3 ARIMA(1,1,1)

model3.da=Arima(train.diff, order=c(1,0,1),method="ML")
summary(model3.da) #AIC=4754.1
Series: train.diff 
ARIMA(1,0,1) with non-zero mean 

Coefficients:
          ar1     ma1    mean
      -0.1670  0.2978  7.1037
s.e.   0.2423  0.2322  3.2804

sigma^2 = 3760:  log likelihood = -2373.05
AIC=4754.1   AICc=4754.19   BIC=4770.34

Training set error measures:
                        ME     RMSE      MAE  MPE MAPE      MASE         ACF1
Training set -0.0004181006 61.10659 43.32274 -Inf  Inf 0.7379952 -0.003493016
lmtest::coeftest(model3.da) #tidak ada parameter signifikan

z test of coefficients:

          Estimate Std. Error z value Pr(>|z|)  
ar1       -0.16699    0.24228 -0.6893  0.49066  
ma1        0.29784    0.23217  1.2828  0.19955  
intercept  7.10366    3.28040  2.1655  0.03035 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

3.5.4 ARIMA(1,1,2)

model5.da=Arima(train.diff, order=c(1,0,2),method="ML")
summary(model5.da) #AIC=4754.71
Series: train.diff 
ARIMA(1,0,2) with non-zero mean 

Coefficients:
         ar1      ma1      ma2    mean
      0.3945  -0.2726  -0.1087  7.1127
s.e.  0.3296   0.3270   0.0543  3.0108

sigma^2 = 3757:  log likelihood = -2372.35
AIC=4754.71   AICc=4754.85   BIC=4775.01

Training set error measures:
                    ME     RMSE      MAE  MPE MAPE      MASE        ACF1
Training set -0.009372 61.00723 43.17141 -Inf  Inf 0.7354175 0.003377215
lmtest::coeftest(model5.da) #terdapat parameter tidak signifikan

z test of coefficients:

           Estimate Std. Error z value Pr(>|z|)  
ar1        0.394546   0.329583  1.1971  0.23126  
ma1       -0.272627   0.327014 -0.8337  0.40446  
ma2       -0.108691   0.054328 -2.0006  0.04543 *
intercept  7.112667   3.010799  2.3624  0.01816 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

3.5.5 ARIMA(2,1,2)

model6.da=Arima(train.diff, order=c(2,0,2),method="ML")
summary(model6.da) #AIC=4755.46
Series: train.diff 
ARIMA(2,0,2) with non-zero mean 

Coefficients:
Warning in sqrt(diag(x$var.coef)): NaNs produced
         ar1      ar2      ma1     ma2    mean
      0.2406  -0.3519  -0.1124  0.2629  7.0944
s.e.     NaN      NaN      NaN     NaN  3.0450

sigma^2 = 3755:  log likelihood = -2371.73
AIC=4755.46   AICc=4755.66   BIC=4779.83

Training set error measures:
                      ME    RMSE      MAE  MPE MAPE      MASE         ACF1
Training set 0.007656631 60.9179 43.19401 -Inf  Inf 0.7358024 -0.002419307
lmtest::coeftest(model6.da) #NaN
Warning in sqrt(diag(se)): NaNs produced

z test of coefficients:

          Estimate Std. Error z value Pr(>|z|)  
ar1        0.24058        NaN     NaN      NaN  
ar2       -0.35193        NaN     NaN      NaN  
ma1       -0.11241        NaN     NaN      NaN  
ma2        0.26285        NaN     NaN      NaN  
intercept  7.09437    3.04502  2.3298  0.01982 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

3.6 Ringkasan AIC

model_tentatif <- data.frame(
  Model = c("ARIMA(0,1,1)","ARIMA(1,1,0)","ARIMA(1,1,1)", "ARIMA(1,1,2)",
            "ARIMA(2,1,2)"),
  AIC   = c(AIC(model1.da),AIC(model2.da), AIC(model3.da), AIC(model5.da), AIC(model6.da)),
  BIC   = c(BIC(model1.da),BIC(model2.da), BIC(model3.da), BIC(model5.da), BIC(model6.da))
)

model_tentatif
         Model      AIC      BIC
1 ARIMA(0,1,1) 4752.564 4764.749
2 ARIMA(1,1,0) 4753.480 4765.665
3 ARIMA(1,1,1) 4754.096 4770.342
4 ARIMA(1,1,2) 4754.706 4775.013
5 ARIMA(2,1,2) 4755.459 4779.828

Berdasarkan pendugaan parameter di atas, nilai AIC terkecil dimiliki oleh model ARIMA(0,1,1) dan parameter model ARIMA(0,1,1) juga seluruhnya signifikan sehingga model yang dipilih adalah model ARIMA(0,1,1).

3.7 Analisis Sisaan

Model terbaik hasil identifikasi kemudian dicek asumsi sisaannya. Sisaan model ARIMA harus memenuhi asumsi normalitas, kebebasan sisaan, dan kehomogenan ragam. Diagnostik model dilakukan secara eksplorasi dan uji formal.

3.7.1 Eksplorasi Sisaan

sisaan.da <- model1.da$residuals

par(mfrow = c(2,2),    
    mar = c(4,4,2,1),  
    oma = c(0,0,2,0))  

# Q-Q Plot
qqnorm(sisaan.da, main = "Normal Q-Q Plot")
qqline(sisaan.da, col = "blue", lwd = 2)

# Plot Sisaan vs Waktu
plot(sisaan.da, type = "p",
     main = "Plot Sisaan vs Waktu",
     xlab = "Waktu", ylab = "Sisaan")

# ACF
acf(sisaan.da, main = "ACF Sisaan")

# PACF
pacf(sisaan.da, main = "PACF Sisaan")

Berdasarkan plot kuantil-kuantil normal, secara eksploratif terlihat bahwa sisaan tidak sepenuhnya menyebar normal karena titik-titik cenderung menyimpang dari garis 45∘. Selain itu, lebar pita sebaran sisaan tampak tidak seragam, yang mengindikasikan adanya heterogenitas ragam. Sementara itu, plot ACF dan PACF sisaan dari model ARIMA(0,1,1) menunjukkan tidak adanya spike signifikan pada 20 lag pertama, sehingga secara visual sisaan dapat dianggap saling bebas. Kondisi ini akan diuji lebih lanjut dengan uji formal.

3.7.2 Uji Formal

#1) Sisaan Menyebar Normal 
ks.test(sisaan.da,"pnorm")  #gagal tolak H0 > sisaan menyebar normal

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  sisaan.da
D = 0.48008, p-value < 2.2e-16
alternative hypothesis: two-sided

Selain dengan eksplorasi, asumsi tersebut dapat diuji menggunakan uji formal. Pada tahapan ini uji formal yang digunakan untuk normalitas adalah uji Kolmogorov-Smirnov (KS). Hipotesis pada uji KS adalah sebagai berikut.

\(H_0\) : Sisaan menyebar normal

\(H_1\) : Sisaan tidak menyebar normal

Berdasarkan uji KS tersebut, didapat p-value sebesar 0.00 yang kurang dari taraf nyata 5% sehingga tolak \(H_0\) dan menandakan bahwa sisaan tidak menyebar normal. Hal ini sesuai dengan hasil eksplorasi menggunakan plot kuantil-kuantil normal.

#2) Sisaan saling bebas/tidak ada autokorelasi 
Box.test(sisaan.da, type = "Ljung")  #gagal tolak H0 > sisaan saling bebas

    Box-Ljung test

data:  sisaan.da
X-squared = 0.01637, df = 1, p-value = 0.8982

Selanjutnya akan dilakukan uji formal untuk kebebasan sisaan menggunakan uji Ljung-Box. Hipotesis yang digunakan adalah sebagai berikut.

\(H_0\) : Sisaan saling bebas

\(H_1\) : Sisaan tidak tidak saling bebas

Berdasarkan uji Ljung-Box tersebut, didapat p-value sebesar 0.8982 yang lebih besar dari taraf nyata 5% sehingga gagal tolak \(H_0\) dan menandakan bahwa sisaan saling bebas. Hal ini berbeda dengan eksplorasi.

#3) Sisaan homogen 
Box.test((sisaan.da)^2, type = "Ljung")  #gagal tolak H0 > sisaan homogen

    Box-Ljung test

data:  (sisaan.da)^2
X-squared = 30.14, df = 1, p-value = 4.02e-08

Hipotesis yang digunakan untuk uji kehomogenan ragam adalah sebagai berikut.

\(H_0\) : Ragam sisaan homogen

\(H_1\) : Ragam sisaan tidak homogen

Berdasarkan uji Ljung-Box terhadap sisaan kuadrat tersebut, didapat p-value sebesar 4.02e-08 yang kurang dari taraf nyata 5% sehingga tak tolak \(H_0\) dan menandakan bahwa ragam sisaan tidak homogen.

#4) Nilai tengah sisaan sama dengan nol 
t.test(sisaan.da, mu = 0, conf.level = 0.95)  #gagal tolak h0 > nilai tengah sisaan sama dengan 0

    One Sample t-test

data:  sisaan.da
t = -0.0018187, df = 428, p-value = 0.9985
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 -5.814109  5.803359
sample estimates:
   mean of x 
-0.005374792 

Terakhir, dengan uji-t, akan dicek apakah nilai tengah sisaan sama dengan nol. Hipotesis yang diujikan sebagai berikut.

\(H_0\) : nilai tengah sisaan sama dengan 0

\(H_1\) : nilai tengah sisaan tidak sama dengan 0

Berdasarkan uji-ttersebut, didapat p-value sebesar 0.9985 yang lebih besar dari taraf nyata 5% sehingga gagal tolak \(H_0\) dan menandakan bahwa nilai tengah sisaan sama dengan nol. Hal ini berbeda dengan eksplorasi.

3.8 Overfitting

Tahapan selanjutnya adalah overfitting dilakukan dengan menaikkan orde AR(p) dan MA(q) dari model ARIMA(0,1,1) Kandidat model overfitting adalah ARIMA(1,1,1) dan ARIMA(0,1,2). Karena model hasil overfitting sudah termasuk di dalam model tentatif dan hasilnya tidak lebih baik, maka model terbaik yang dipilih adalah ARIMA(0,1,1) dilanjutkan dengan peramalan.

model3.da=Arima(train.diff, order=c(0,0,2),method="ML")
summary(model3.da) #AIC=4754.1
Series: train.diff 
ARIMA(0,0,2) with non-zero mean 

Coefficients:
         ma1      ma2    mean
      0.1216  -0.0490  7.1098
s.e.  0.0491   0.0485  3.1625

sigma^2 = 3756:  log likelihood = -2372.78
AIC=4753.56   AICc=4753.65   BIC=4769.8

Training set error measures:
                       ME     RMSE      MAE  MPE MAPE      MASE        ACF1
Training set -0.004458039 61.06796 43.21384 -Inf  Inf 0.7361402 0.003711064
lmtest::coeftest(model3.da) #tidak ada parameter signifikan

z test of coefficients:

           Estimate Std. Error z value Pr(>|z|)  
ma1        0.121636   0.049076  2.4785  0.01319 *
ma2       -0.048960   0.048514 -1.0092  0.31288  
intercept  7.109824   3.162509  2.2482  0.02457 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

3.9 Model Terbaik : ARIMA(0,1,1)

model1.da=Arima(train.diff, order=c(0,0,1),method="ML")
summary(model1.da)
Series: train.diff 
ARIMA(0,0,1) with non-zero mean 

Coefficients:
         ma1    mean
      0.1352  7.1077
s.e.  0.0498  3.3499

sigma^2 = 3756:  log likelihood = -2373.28
AIC=4752.56   AICc=4752.62   BIC=4764.75

Training set error measures:
                       ME  RMSE      MAE  MPE MAPE      MASE         ACF1
Training set -0.005374792 61.14 43.42061 -Inf  Inf 0.7396625 -0.006155765
lmtest::coeftest(model1.da)

z test of coefficients:

          Estimate Std. Error z value Pr(>|z|)   
ma1       0.135154   0.049751  2.7166 0.006596 **
intercept 7.107718   3.349898  2.1218 0.033857 * 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

3.10 Peramalan

Peramalan dilakukan menggunakan fungsi forecast() . Contoh peramalan berikut ini dilakukan untuk 30 hari ke depan.

# ---FORECAST---
ramalan.da <- forecast::forecast(model1.da, h = length(test.ts))
data.ramalan.da <- ramalan.da$mean
plot(ramalan.da)

# Inverse differencing
pt_akhir_train <- tail(train.ts, 1) 

forecast <- diffinv(data.ramalan.da, differences = 1, xi = pt_akhir_train)
hasil <- forecast[-1]
hasil <- forecast[1:length(test.ts)]

# Bandingkan aktual vs forecast
perbandingan.da <- cbind(
  Aktual   = test.ts,
  Forecast = hasil
)

print(head(perbandingan.da, 10))   
Time Series:
Start = 1 
End = 10 
Frequency = 1 
   Aktual Forecast
 1  12866 12813.00
 2  12887 12813.68
 3  12862 12820.79
 4  12863 12827.90
 5  12993 12835.01
 6  12962 12842.11
 7  12963 12849.22
 8  13022 12856.33
 9  12983 12863.44
10  13047 12870.55
# Hitung akurasi
akurasi_test <- accuracy(hasil, test.ts)
akurasi_test
                ME     RMSE      MAE         MPE      MAPE      ACF1 Theil's U
Test set -2.198584 134.5937 109.7759 -0.02016321 0.8415403 0.9205691  2.509023
# Plot data
ts.plot(datakurs.ts, col = "black", lty = 1,
        xlab = "Waktu", ylab = "Kurs")

# Garis forecast
lines(431:(430+length(hasil)), hasil, col = "blue", lty = 2, lwd = 2)
legend("topleft", 
       legend = c("Data Aktual", "Forecast"),
       col = c("black", "blue"),
       lty = c(1,2,3), lwd = c(1,2,1), bty = "n")