# Load Library
library(tseries)
## Warning: package 'tseries' was built under R version 4.4.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.4.3
## 
## Attaching package: 'TSA'
## The following objects are masked from 'package:stats':
## 
##     acf, arima
## The following object is masked from 'package:utils':
## 
##     tar
library(forecast)
## Warning: package 'forecast' was built under R version 4.4.3
## Registered S3 methods overwritten by 'forecast':
##   method       from
##   fitted.Arima TSA 
##   plot.Arima   TSA
# Pembangkitan Data
set.seed(1)
n <- 200
ar_param <- 0.5
ma_param <- 0.4

# Simulasi ARIMA(1,1,1)
ts_data <- arima.sim(model = list(order = c(1, 1, 1), ar = ar_param, ma = ma_param), n = n)
# Plot Data Awal
ts.plot(ts_data, main = "Simulasi Data ARIMA (1,1,1)", col = "blue")

# Identifikasi Model Awal
# Plot ACF dan PACF untuk melihat pola awal
par(mfrow = c(1, 2))
acf(ts_data, main = "ACF Data Asli")
pacf(ts_data, main = "PACF Data Asli")

par(mfrow = c(1, 1))

Plot ACF & PACF

# Pengujian Kestasioneran (ADF Test)
print("Hasil ADF Test Data Asli")
## [1] "Hasil ADF Test Data Asli"
adf_original <- adf.test(ts_data)
print(adf_original)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  ts_data
## Dickey-Fuller = -2.1074, Lag order = 5, p-value = 0.5311
## alternative hypothesis: stationary

Uji ADF

# Proses Differencing
diff_data <- diff(ts_data)
# Identifikasi Ulang Setelah Differencing
par(mfrow = c(1, 2))
acf(diff_data, main = "ACF Setelah Differencing")
pacf(diff_data, main = "PACF Setelah Differencing")

par(mfrow = c(1, 1))
print("Hasil ADF Test Setelah Differencing")
## [1] "Hasil ADF Test Setelah Differencing"
adf_diff <- adf.test(diff_data)
## Warning in adf.test(diff_data): p-value smaller than printed p-value
print(adf_diff)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff_data
## Dickey-Fuller = -4.4493, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary

Uji ADF

# Penentuan Kandidat Model
# Menggunakan EACF untuk melihat kandidat model p dan q
print("Tabel EACF")
## [1] "Tabel EACF"
eacf(diff_data)
## AR/MA
##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 x x x o o o o o o o o  o  o  o 
## 1 x o o o o o o o o o o  o  o  o 
## 2 x o o o o o o o o o o  o  o  o 
## 3 o 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 o 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 x o o o o o o x o  o  o  o
# Perbandingan dengan auto arima
print("Hasil auto.arima")
## [1] "Hasil auto.arima"
model_auto <- auto.arima(ts_data)
summary(model_auto)
## Series: ts_data 
## ARIMA(1,1,1) 
## 
## Coefficients:
##          ar1     ma1
##       0.4918  0.3787
## s.e.  0.0859  0.0933
## 
## sigma^2 = 0.9265:  log likelihood = -275.54
## AIC=557.08   AICc=557.2   BIC=566.97
## 
## Training set error measures:
##                      ME      RMSE       MAE      MPE     MAPE      MASE
## Training set 0.05217333 0.9553617 0.7537636 24.28786 68.31331 0.6789159
##                      ACF1
## Training set -0.007914125

Kandidat Model

Kandidat Model yang akan digunakan adalah ARIMA(1,1,1), ARIMA(1,1,2), ARIMA(2,1,1), ARIMA(2,1,2), dan ARIMA(0,1,3)

# Pemilihan Model Terbaik Berdasarkan AIC
print("Perbandingan Model (AIC)")
## [1] "Perbandingan Model (AIC)"
# Model 1: ARIMA(1,1,1)
mod1 <- arima(ts_data, order = c(1, 1, 1), method = "ML")
print(paste("AIC ARIMA(1,1,1):", mod1$aic))
## [1] "AIC ARIMA(1,1,1): 555.080004148892"
# Model 2: ARIMA(1,1,2)
mod2 <- arima(ts_data, order = c(1, 1, 2), method = "ML")
print(paste("AIC ARIMA(1,1,2):", mod2$aic))
## [1] "AIC ARIMA(1,1,2): 557.066510635887"
# Model 3: ARIMA(2, 1, 1)
mod3 <- arima(ts_data, order = c(2, 1, 1), method = "ML")
print(paste("AIC ARIMA(2,1,1):", mod3$aic))
## [1] "AIC ARIMA(2,1,1): 557.062773311398"
# Model 4: ARIMA(2,1,2)
mod4 <- arima(ts_data, order = c(2, 1, 2), method = "ML")
print(paste("AIC ARIMA(2,1,2):", mod4$aic))
## [1] "AIC ARIMA(2,1,2): 553.99716529261"
# Model 5: ARIMA(0,1,3)
mod5 <- arima(ts_data, order = c(0, 1, 3), method = "ML")
print(paste("AIC ARIMA(0,1,3):", mod5$aic))
## [1] "AIC ARIMA(0,1,3): 556.17357556732"

Model Terbaik

Berdasarkan hasil pemodelan, diperoleh model dengan nilai AIC terkecil adalah ARIMA(2,1,2). Hasil ini berbeda dengan pembangkitan data dengan model ARIMA(1,1,1), hasil indentifikasi dan pemodelan tidak selalu menghasilkan model yang sama persis. Beberapa kemungkinan penyebab perbedaan tersebut.