# 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
# 1. SIMULASI DATA ARIMA(1,1,1)

# Set seed agar hasil replikasi sama
set.seed(456)

# Banyak data
n <- 200

# Parameter berbeda dari contoh
ar <- 0.4
ma <- 0.6

# Simulasi data
ts_arima <- arima.sim(
  model = list(
    order = c(1,1,1),
    ar = ar,
    ma = ma
  ),
  n = n
)

# Plot data hasil simulasi
ts.plot(ts_arima,
        main = "Simulasi Data ARIMA(1,1,1)",
        col = "blue")

# INTERPRETASI:
# Data hasil simulasi masih menunjukkan pola fluktuatif
# dan diduga belum stasioner karena terdapat differencing
# orde 1 pada model ARIMA(1,1,1)
# 2. IDENTIFIKASI AWAL ACF & PACF

acf(ts_arima,
    main = "ACF Data Awal")

pacf(ts_arima,
     main = "PACF Data Awal")

# INTERPRETASI:
# ACF menurun secara lambat (slow decay)
# PACF belum menunjukkan cut off yang jelas
# sehingga data diduga belum stasioner
# 3. UJI STASIONERITAS ADF

adf_awal <- adf.test(ts_arima)
adf_awal
## 
##  Augmented Dickey-Fuller Test
## 
## data:  ts_arima
## Dickey-Fuller = -2.3894, Lag order = 5, p-value = 0.413
## alternative hypothesis: stationary
# INTERPRETASI:
# Jika p-value > 0.05 maka data tidak stasioner
# sehingga perlu dilakukan differencing
# 4. DIFFERENCING

diff1 <- diff(ts_arima)

ts.plot(diff1,
        main = "Data Setelah Differencing",
        col = "pink")

# INTERPRETASI:
# Differencing dilakukan sebanyak 1 kali
# karena model awal memiliki d = 1
# 5. ACF & PACF SETELAH DIFFERENCING

acf(diff1,
    main = "ACF Setelah Differencing")

pacf(diff1,
     main = "PACF Setelah Differencing")

# INTERPRETASI:
# Setelah differencing pola ACF dan PACF
# menjadi lebih stabil sehingga kandidat
# model mulai dapat diidentifikasi
# 6. UJI ADF SETELAH DIFFERENCING

adf_diff <- adf.test(diff1)
## Warning in adf.test(diff1): p-value smaller than printed p-value
adf_diff
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff1
## Dickey-Fuller = -5.0485, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary
# INTERPRETASI:
# Jika p-value < 0.05 maka data sudah stasioner
# 7. UBAH MENJADI DATA TS

data.ts <- ts(diff1)

head(data.ts)
## Time Series:
## Start = 1 
## End = 6 
## Frequency = 1 
## [1] 1.7418301 0.1248623 0.8115561 2.1000072 3.0871674 0.7864189
# 8. MENENTUKAN KANDIDAT MODEL

acf(data.ts)

pacf(data.ts)

eacf(data.ts)
## 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  x  x  x 
## 1 x x o x 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 x o o o o o o o  o  o  o 
## 4 x x x x o o o o o o o  o  o  o 
## 5 o x x x x o o o o o o  o  o  o 
## 6 o x x x o x o o o o o  o  o  o 
## 7 o x x o o o o o o o o  o  o  o
# Misal kandidat model:
# ARIMA(1,1,1)
# ARIMA(1,1,2)
# ARIMA(2,1,1)
# ARIMA(2,1,2)
# 9. AUTO ARIMA

auto_model <- auto.arima(ts_arima)
auto_model
## Series: ts_arima 
## ARIMA(1,1,1) 
## 
## Coefficients:
##          ar1     ma1
##       0.4593  0.5656
## s.e.  0.0801  0.0804
## 
## sigma^2 = 0.969:  log likelihood = -280.17
## AIC=566.35   AICc=566.47   BIC=576.24
# Digunakan sebagai pembanding model otomatis
# 10. ESTIMASI MODEL KANDIDAT

model1 <- arima(ts_arima,
                order = c(1,1,1),
                method = "ML")

model2 <- arima(ts_arima,
                order = c(1,1,2),
                method = "ML")

model3 <- arima(ts_arima,
                order = c(2,1,1),
                method = "ML")

model4 <- arima(ts_arima,
                order = c(2,1,2),
                method = "ML")
# 11. MEMBANDINGKAN NILAI AIC

AIC_table <- data.frame(
  Model = c("ARIMA(1,1,1)",
            "ARIMA(1,1,2)",
            "ARIMA(2,1,1)",
            "ARIMA(2,1,2)"),
  
  AIC = c(model1$aic,
          model2$aic,
          model3$aic,
          model4$aic)
)

AIC_table
##          Model      AIC
## 1 ARIMA(1,1,1) 564.3457
## 2 ARIMA(1,1,2) 566.2587
## 3 ARIMA(2,1,1) 566.1541
## 4 ARIMA(2,1,2) 567.7088
# Model terbaik
best_model <- AIC_table[which.min(AIC_table$AIC), ]
best_model
##          Model      AIC
## 1 ARIMA(1,1,1) 564.3457
# KESIMPULAN

cat("Model pembangkitan awal adalah ARIMA(1,1,1)\n")
## Model pembangkitan awal adalah ARIMA(1,1,1)
cat("Dengan parameter AR = 0.4 dan MA = 0.6\n\n")
## Dengan parameter AR = 0.4 dan MA = 0.6
cat("Setelah dilakukan identifikasi, uji stasioneritas,\n")
## Setelah dilakukan identifikasi, uji stasioneritas,
cat("differencing, serta perbandingan AIC,\n")
## differencing, serta perbandingan AIC,
cat("diperoleh model terbaik berdasarkan AIC terkecil.\n\n")
## diperoleh model terbaik berdasarkan AIC terkecil.
cat("Model terbaik dapat sama atau berbeda\n")
## Model terbaik dapat sama atau berbeda
cat("dengan model pembangkitan awal.\n\n")
## dengan model pembangkitan awal.
cat("Jika berbeda, penyebabnya antara lain:\n")
## Jika berbeda, penyebabnya antara lain:
cat("1. Adanya unsur random pada simulasi data\n")
## 1. Adanya unsur random pada simulasi data
cat("2. Ukuran sampel terbatas\n")
## 2. Ukuran sampel terbatas
cat("3. Pola ACF dan PACF tidak selalu jelas\n")
## 3. Pola ACF dan PACF tidak selalu jelas
cat("4. AIC memilih model paling efisien\n")
## 4. AIC memilih model paling efisien
cat("   berdasarkan data hasil simulasi.\n")
##    berdasarkan data hasil simulasi.