library(forecast)
library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(TSA)
## 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

Generate Data

Data digenerate sebanyank \(200\), kemudian \(50\) data pertama dihapus sehingga data yang digunakan data ke \(51-200\) untuk dianalisis

set.seed(123)

n_total <- 200

phi <- c(0.5, -0.7)
theta <- c(-0.3, -0.5)

data <- arima.sim(n = n_total,
                  model = list(ar = phi, ma = theta),
                  sd = sqrt(1.18))

# Buang 50 data pertama
data <- data[51:200]

ts_data <- ts(data)

# Plot manual
plot(ts_data, type="l", col="blue",
     main="Time Series Data",
     ylab="Y_t", xlab="Waktu")

xx

train_size <- 120
train <- ts_data[1:train_size]
test <- ts_data[(train_size+1):150]

plot(train, type="l", col="blue", main="Train Data")
lines(test, col="red")
legend("topleft", legend=c("Train","Test"),
       col=c("blue","red"), lty=1)

Model ARIMA

1. Uji Stasioneritas (ADF)

untuk menguji kestasioneran data dilakukan dengan uji ADF

adf.test(train)
## Warning in adf.test(train): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train
## Dickey-Fuller = -7.7141, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary

2. Identifikasi Kandidat Model

acf(train, lag.max = 20, col = "blue")

Plot ACF menunjukkan korelasi yang signifikan pada lag 2 dan 3 secara negatif, serta lag 4 dan 5 secara positif. Karena pola korelasi terputus (cuts off) secara signifikan setelah lag-lag awal, hal ini mengindikasikan bahwa model deret waktu tersebut memiliki komponen Moving Average (MA).”

pacf(train, lag.max = 20, col = "blue")

batas signifikansi (biasanya selang kepercayaan 95%). Jika batang (spike) melewati garis ini, maka korelasi pada lag tersebut dianggap signifikan secara statistik.

eacf(train)
## AR/MA
##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 x x x x x o x o x o o  x  o  x 
## 1 x x x x x o x o x o o  x  o  x 
## 2 o x o x o o o o o o o  o  o  o 
## 3 x x o x x o o o o o o  o  o  o 
## 4 x x o x o o o o o o o  o  o  o 
## 5 o x o x o o o o o o o  o  o  o 
## 6 x x x o x o o o o o o  o  o  o 
## 7 x x x o x x o o o o o  o  o  o
#ARIMA(0,0,2)
arima002 <- arima(train, order = c(0,0,2), include.mean = TRUE, method = "ML") 
arima002
## 
## Call:
## arima(x = train, order = c(0, 0, 2), include.mean = TRUE, method = "ML")
## 
## Coefficients:
##           ma1      ma2  intercept
##       -0.0284  -0.9716    -0.0106
## s.e.   0.0403   0.0395     0.0066
## 
## sigma^2 estimated as 1.671:  log likelihood = -204.23,  aic = 414.47
#ARIMA(2,0,0)
arima200 <- arima(train, order = c(2,0,0), include.mean = TRUE, method = "ML") 
arima200
## 
## Call:
## arima(x = train, order = c(2, 0, 0), include.mean = TRUE, method = "ML")
## 
## Coefficients:
##          ar1      ar2  intercept
##       0.3910  -0.8121    -0.0192
## s.e.  0.0524   0.0507     0.0783
## 
## sigma^2 estimated as 1.464:  log likelihood = -194.23,  aic = 394.45
#ARIMA(2,0,3)
arima203 <- arima(train, order = c(2,0,3), include.mean = TRUE, method = "ML") 
arima203
## 
## Call:
## arima(x = train, order = c(2, 0, 3), include.mean = TRUE, method = "ML")
## 
## Coefficients:
##          ar1      ar2      ma1      ma2     ma3  intercept
##       0.5185  -0.6840  -0.3934  -0.6457  0.1869    -0.0146
## s.e.  0.0996   0.0717   0.1318   0.1096  0.1455     0.0130
## 
## sigma^2 estimated as 1.073:  log likelihood = -176.58,  aic = 365.15
AICKandidatModel <- c(411.38, 391.36, 362.06)
KndidatModelARIMA <- c("ARIMA(0,0,2)", "ARIMA(2,0,0)", "ARIMA(2,0,3)")
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,2)    411.38
## 2   ARIMA(2,0,0)    391.36
## 3   ARIMA(2,0,3)    362.06

Diagnostic model

ARIMA203diag <- stats::arima(train, order = c(2,0,3), method = "ML")
checkresiduals(ARIMA203diag)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(2,0,3) with non-zero mean
## Q* = 3.6216, df = 5, p-value = 0.6051
## 
## Model df: 5.   Total lags used: 10
sisaan <- arima203$residuals
# Uji formal normalitas data
ks.test(sisaan,"pnorm")
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  sisaan
## D = 0.0726, p-value = 0.5518
## alternative hypothesis: two-sided
# Uji nilai tengah sisaan
t.test(sisaan, mu = 0, alternative = "two.sided")
## 
##  One Sample t-test
## 
## data:  sisaan
## t = -0.078104, df = 119, p-value = 0.9379
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -0.1954599  0.1806253
## sample estimates:
##    mean of x 
## -0.007417268
# Uji autokorelasi
Box.test(sisaan, lag = 20 ,type = "Ljung")
## 
##  Box-Ljung test
## 
## data:  sisaan
## X-squared = 18.594, df = 20, p-value = 0.5483