Stage 1: Model Identification Contoh berikut menunjukkan prosedur untuk mencocokkan seri data dengan komponen musiman akan menggunakan data HIV yang terjadi di Indonesia tahun 1990-2019.
library(tseries)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(forecast)
library(readxl)
data_lopo <- read_excel("~/.A. KULIAH/Semester 7/Analis Runtun Waktu/Data lopo paper.xlsx")
#check the structure of data set
str(data_lopo)
## tibble [30 × 5] (S3: tbl_df/tbl/data.frame)
## $ No : num [1:30] 1 2 3 4 5 6 7 8 9 10 ...
## $ Negara : chr [1:30] "Indonesia" "Indonesia" "Indonesia" "Indonesia" ...
## $ Kode Negara : chr [1:30] "IDN" "IDN" "IDN" "IDN" ...
## $ Tahun : num [1:30] 1990 1991 1992 1993 1994 ...
## $ Jumlah Penderita: num [1:30] 2747 2192 1121 1582 1801 ...
data_lopo.ts <- ts(data_lopo$`Jumlah Penderita`, start = c(1990, 1),
end = c(2019, 12), frequency = 12)
options(scipen = 2) #Suppress the scientific value for ylab
plot(data_lopo.ts, type ="o", pch = 16,
ylab = "Data No. 1", panel.first = grid ())
Seri data diselidiki dengan memplot data infeksi HIV terhadap waktu. Grafik tersebut menunjukkan bahwa rangkaian tersebut memiliki puncak dan palung yang teratur tidak stasioner karena terdapat komponen musiman dalam rangkaian tersebut. Dari seri asli, puncak reguler dan melalui pola musiman yang ditunjukkan dalam series.
par(mfrow = c(2, 1)) # 2 graphs in a single device
acf(data_lopo.ts, 36, main = "ACF DATA no. 1 HIV",
panel.first = grid (), xaxt = "n")
axis(1, at = 0:36/12, labels=0:36) # xaxis re-label
pacf(data_lopo.ts, 36, main = "PACF DATA no. 1 HIV",
panel.first = grid (), xaxt = "n")
axis(1, at = 0:36/12, labels=0:36) # xaxis re-label
Berdasarkan plot ACF, terdapat pola seperti gelombang yang menegaskan
komponen musiman dalam rangkaian infeksi HIV dan sedikit perluasan pada
plot PACF. Pola ini mencirikan seri dengan efek musiman.
Karena ada komponen musiman pada seri, pembedaan musim urutan pertama dilakukan. Perhatikan bahwa kami menambahkan argumen tambahan dalam fungsi diff(), lag = 12 untuk melakukan pembedaan musiman.
data_lopo_sea.ts <- diff(data_lopo.ts, lag = 12)
par(mfrow = c(1, 1)) # 1 graph in a single device
plot(data_lopo_sea.ts, type ="o", pch = 16,
ylab = "DATA No. 1 HIV",
main = "Seasonal Differencing", panel.first = grid ())
par (mfrow = c(2, 1)) # 2 graphs in a single device
acf(data_lopo_sea.ts, 36,
main = "ACF for DATA no.1 (Seasonal Diff)",
panel.first = grid (), xaxt = "n")
axis(1, at = 0:36/12, labels=0:36)
pacf(data_lopo_sea.ts, 36, main = "PACF for DATA no.1 (Seasonal Diff)", panel.first = grid (), xaxt = "n")
axis(1, at = 0:36/12, labels=0:36)
Penjelasan: Setelah melakukan pembedaan musiman pertama, plot ACF dan
PACF menunjukkan karakteristik peluruhan dan bergelombang, yang
menunjukkan bahwa deret tersebut masih belum stasioner. Plot ACF
menunjukkan pola yang menurun dan masih menunjukkan pola gelombang
(tetapi tidak begitu jelas dibandingkan dengan data asli) sementara PACF
menghasilkan beberapa lonjakan yang signifikan terutama pada lag
pertama.
Ini menunjukkan bahwa kita perlu melakukan pembedaan non-musiman pertama untuk seri tersebut.
data_lopo_nonsea.ts <- diff(data_lopo_sea.ts, differences = 1)
par (mfrow = c(1, 1)) # 1 graph in a single device
plot (data_lopo_nonsea.ts, type ="o", pch = 16,
ylab = "DATa No.1",
main = "Non-Seasonal Differencing",
panel.first = grid ())
par(mfrow = c(2, 1)) # 2 graphs in a single device
acf(data_lopo_nonsea.ts, 36,
main = "ACF for DATA No.1 HIV (Non-Seasonal Diff)",
panel.first = grid (), xaxt = "n")
axis(1, at = 0:36/12, labels=0:36)
pacf(data_lopo_nonsea.ts, 36, main = "PACF for DATA No. HIV (Non-Seasonal Diff)", panel.first = grid (), xaxt = "n")
axis(1, at = 0:36/12, labels=0:36)
Penjelasan: Setelah melakukan non-seasonal differencing, time plot tidak
menunjukkan adanya trend, baik ACF maupun PACF menunjukkan beberapa
lonjakan yang signifikan tanpa adanya pola yang jelas.
Ini dapat menyimpulkan bahwa akhirnya, deret kami sekarang stasioner setelah pembedaan musiman dan nonmusiman pertama, sehingga D=1 dan d=1. Untuk menentukan urutan AR(p), MA(q), SAR(P), SMA(Q), akan diamati lonjakan pada periode lag tertentu.
untuk mengidentifikasi bagian musiman, salah satu kebutuhan untuk mengamati lonjakan pada lag 12 atau 24 atau 36 (untuk data bulanan) dan untuk mengidentifikasi bagian non-musiman adalah dengan mengamati lonjakan signifikan pada periode selain itu.
Berdasarkan ACF, dua lonjakan signifikan terdeteksi pada lag 1 dan lag 8. (Perhatikan bahwa, kami mengecualikan ACF pada lag = 0 sebagai bagian dari perhitungan lonjakan signifikan) Kedua lonjakan ini dapat digunakan untuk menentukan bagian MA non-musiman. Lonjakan signifikan lainnya diamati pada lag 12 untuk menyarankan bagian SMA musiman dari model. Dengan demikian, MA (2) dan SMA (1) disarankan berdasarkan plot ACF.
Selanjutnya, untuk mengidentifikasi urutan p dan P, kami mengamati PACF. Ada dua kemungkinan lonjakan signifikan yaitu pada lag 1 dan lag 8, menunjukkan AR(2) untuk AR non-musiman dan ada lonjakan signifikan pada lag 12, menunjukkan SAR(1) untuk AR musiman.
selanjutnya untuk memastikan bahwa model yang ditentukan dengan baik tidak terlewatkan, beberapa formulasi model akan diidentifikasi dan diestimasi.
Model berikut telah diidentifikasi: SARIMA(2, 1, 2)(1, 1, 1), SARIMA(1, 1, 2)(0, 1, 1), SARIMA(1, 1, 2)(1, 1, 1) dan SARIMA(2, 1, 3)(1, 1, 1).
# Model 1: ARIMA (2, 1, 2)(1, 1, 1)_30
model1_arima <- arima (data_lopo.ts, order = c(2, 1, 2),
seas = list(order = c(1, 1, 1), 12))
summary (model1_arima)
##
## Call:
## arima(x = data_lopo.ts, order = c(2, 1, 2), seasonal = list(order = c(1, 1,
## 1), 12))
##
## Coefficients:
## ar1 ar2 ma1 ma2 sar1 sma1
## -0.2545 0.4932 0.5020 -0.4980 -0.2797 -1.0000
## s.e. 0.1825 0.1489 0.1871 0.1867 0.0531 0.0268
##
## sigma^2 estimated as 3239571: log likelihood = -3121.06, aic = 6256.12
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -26.22204 1767.084 876.5016 -5.934164 24.26688 0.969964
## ACF1
## Training set -0.04169811
# Model 2: SARIMA (1, 1, 2)(0, 1, 1)_12
model2_sarima <- arima (data_lopo.ts, order = c(1, 1, 2),
seas = list(order = c(0, 1, 1), 12))
summary (model2_sarima)
##
## Call:
## arima(x = data_lopo.ts, order = c(1, 1, 2), seasonal = list(order = c(0, 1,
## 1), 12))
##
## Coefficients:
## ar1 ma1 ma2 sma1
## 0.5515 -0.3917 0.0253 -0.9999
## s.e. 0.2476 0.2552 0.0654 0.0253
##
## sigma^2 estimated as 3812928: log likelihood = -3141.97, aic = 6293.94
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -19.69458 1917.091 821.9124 -4.405386 21.01595 0.9095539
## ACF1
## Training set -0.001980122
# Model 3: ARIMA (1, 1, 1)
model3 <- arima(data_lopo.ts, order = c(1, 1, 1))
summary(model3)
##
## Call:
## arima(x = data_lopo.ts, order = c(1, 1, 1))
##
## Coefficients:
## ar1 ma1
## 0.6146 -0.5030
## s.e. 0.1815 0.1965
##
## sigma^2 estimated as 4318858: log likelihood = -3251.9, aic = 6509.81
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 24.47842 2075.298 839.7152 -5.023481 23.54406 0.929255 -0.01517494
# Model 4: ARIMA (1, 1, 0)
model4 <- arima(data_lopo.ts, order = c(1, 1, 0))
summary(model4)
##
## Call:
## arima(x = data_lopo.ts, order = c(1, 1, 0))
##
## Coefficients:
## ar1
## 0.1094
## s.e. 0.0524
##
## sigma^2 estimated as 4353543: log likelihood = -3253.33, aic = 6510.66
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 27.95523 2083.615 866.488 -7.516636 24.35049 0.9588826 -0.01171052
Penjelasan: Berdasarkan nilai AIC terendah, kami memilih model 4, ARIMA (1, 1, 0) sebagai model terbaik. Selain itu, berdasarkan uji Ljung-Box, kami menerima hipotesis nol yang menunjukkan bahwa residunya adalah white noise.
Box.test(model4$residuals, type = "Ljung-Box")
##
## Box-Ljung test
##
## data: model4$residuals
## X-squared = 0.049782, df = 1, p-value = 0.8234
Selanjutnya dilanjutkan dengan penerapan ARIMA (1, 1, 0) untuk menghasilkan nilai forecast 3 tahun ke depan (2020-2023).
Stage 3: Model Application
# forecasting CPI data by using ARIMA (1, 1, 0) model
model4.for <- predict(model4, n.ahead = 3)
ts.plot(data_lopo.ts, model4.for$pred, ylim = c(1500, 20000),
ylab = "CPI", col = "blue")
grid ()
# calculating upper and lower limit
# additional plotting
U = model4.for$pred + model4.for$se
L = model4.for$pred - model4.for$se
xx = c(time (U), rev (time (U)))
yy = c(L, rev(U))
polygon(xx, yy, border = 8, col = gray (0.6, alpha=0.2))
lines(model4.for$pred, type = "p", col = "red")
model4.for
## $pred
## Jan Feb Mar
## 2020 14038.70 14039.98 14040.12
##
## $se
## Jan Feb Mar
## 2020 2086.515 3116.349 3896.913
# plotting forecast value for 2020-2023
plot(model4.for$pred, type = "o", ylim = c(1500, 20000), ylab ="CPI",
main = "Forecast Value for 1990-2024")
grid()
polygon(xx, yy, border = 8, col = gray (0.6, alpha=0.2))
text(model4.for$pred~time(model4.for$pred), labels = round (pred, 2),
data=model4.for, cex=0.7, font=2, pos=1)
Explanation: The forecast values for 2020-2023 are 112.39, 114.52, 116.34, 117.91 and 119.25.