Prediksi Pertumbuhan Ekonomi Indonesia Triwulan II - IV 2022 dengan ARIMA Intervensi (Intervention Analysis) dengan R

ARIMA Intervensi dengan R

Halo teman-teman, berjumpa lagi dengan blog sederhana ini. Pada beberapa unggahan sebelumnya, kita telah belajar dan berbagai bersama mengenai pemodelan Autoregressive Integrated and Moving Average (ARIMA). Kali ini kita akan coba ulas bersama secara singkat mengenai tetangganya model ARIMA. Bukan tetangga sebenarnya, tetapi lebih ke saudara dari model ARIMA. Karena model satu  ini memang merupakan hasil pengembangan dari ARIMA.

Model yang satu ini kita namakan sebagai ARIMA Intervensi atau bisa juga disebut ARIMA dengan intervensi. ARIMA Intervensi ini adalah bentuk Intervention Analysis, namun bentuknya berbeda dengan model yang akhir-akhir ini berkembang di tengah masyarakat, yaitu Causal Impact Time Series Model. ARIMA Intervensi merupakan model ARIMA dengan variabel eksogen berupa error sebenarnya, bentuknya mirip ARIMAX. Kalau ARIMAX variabel eksogennya merupakan variabel lain yang tidak berasal dari dirinya sendiri.

Baik, sebelum menuju praktik pemodelan menggunakan R, kita akan ulas terlebih dahulu mengenai pengertian atau ARIMA Intervensi secara teoritis. ARIMA Intervensi ini merupakan alat analisis data runtun waktu (time series) di mana sebuah data runtun waktu dipengaruhi oleh kejadian eksternal yang menyebabkan adanya perubahan pada pola data selama periode waktu tertentu. Menurut Morokimban, dkk. (2021), ARIMA Intervensi merupakan bentuk intervention analysis untuk mengolah data deret waktu yang dipengaruhi oleh peristiwa di luar kendali atau yang disebut intervensi. Menurut Damayanti dan Siska (2021), ARIMA Intervensi merupakan model intervensi data time series yang digunakan untuk pemodelan sekaligus peramalan data yang mengandung intervensi baik dari faktor internal maupun eksternal. Dari beberapa pengertian berdasarkan kajian di atas, bisa kita tarik benang merah bahwa ARIMA Intervensi merupakan bentuk model analisis intervensi pada data runtun waktu (time series) dengan memasukkan intervensi baik sebagai faktor internal maupun sebagai faktor eksternal.

Intervensi yang dimaksud dalam ARIMA Intervensi atau analisis intervensi ini banyak kita temui di sekitar kita. Bisa berupa kebijakan pemerintah, bencana alam, atau kejadian lain yang membuat sebuah data runtun waktu secara nyata berubah pola, baik perubahan itu menjadi sebuah pola baru yang permanen, atau bersifat sementara atau singkat. Sebagai contoh yang nyata dan masih berlangsung adalah pandemi Covid-19 yang menerpa dunia sejak awal 2020 lalu. Dari data, efek dari pandemi ini terlihat begitu mengubah polanya. Terhadap jumlah penumpang kereta api harian misalkan, sebelum pandemi Covid-19, mungkin datanya terlihat normal tanpa fluktuasi yang berarti, tetapi sejak pandemi Covid-19 menerpa, pola data jumlah penumpang kereta api itu pastinya akan berubah drastis atau signifikan menurun. Ini kalau intervensi itu dipahami sebuah kejadian alam.

Berbeda bila intervensi yang disebabkan oleh sebuah kebijakan pemerintah, misalkan Pembatasan Sosial Berskala Besar (PSBB) yang sekitar kuartal atau triwulan II - 2020 mulai diterapkan di sejumlah wilayah di Indonesia khususnya. Tentu efeknya terhadap perubahan pola data runtun waktu akan berbeda, bila efek yang dimaksud adalah dampak secara alami pandemi Covid-19 dengan dampak yang ditimbulkan akibat kebijakan pemerintah dengan penerapan PSBB atau lockdown. Efek yang ditimbulkan oleh intervensi secara alami pandemi Covid-19 akan terlihat lebih smooth perubahan pola data runtun waktunya dibandingkan efek kebijakan PSBB atau lockdown yang kita saksikan bersama menimbulkan shock atau kejutan tajam terhadap data.

Demikian halnya ketika pemulihan pasca pandemi Covid-19, efek yang alami akibat pandemi, dengan asumsi tanpa kebijakan pemerintah, secara shock tidak begitu tajam, tetapi waktu untuk pemulihan akan semakin lama karena terjadi secara alami. Berbeda dengan efek kebijakan merespon pandemi dengan penerapan SPBB dan lockdown sejumlah wilayah, secara tajam dan tiba-tiba membuat data runtun waktu menjadi berubah drastis namun pemulihan data menuju normal semakin cepat seiring dengan penanganan serius terhadap pandemi Covid-19. Ini kita bicara sekilas mengenai intervensi yang terjadi secara alami dan intervensi buatan berupa kebijakan pemerintah.

Secara umum, ARIMA Intervensi itu sendiri bisa kita maknai sebagai model yang menggabungkan formulasi ARIMA dengan intervensi yang mengikuti sebuah sebaran fungsi tertentu. Untuk lebih tergambar, bisa kita lihat pada ilustrasi matematis berikut:

Persamaan umum ARIMA dengan Intervensi fungsi Pulse dan Step

Dari ilustrasi di atas, selanjutnya kita akan berkenalan dengan dua jenis fungsi intervensi yang populer digunakan dalam penelitian dengan alat analisis ARIMA Intervensi, yaitu fungsi Pulse dan fungsi Step. Fungsi Pulse ditandai sebagai sebuah dummy variable yang bernilai 1 ketika sebuah intervensi terjadi pada waktu T, kemudian efek intervensi itu lenyap atau hilang dan data runtun waktu kembali normal seperti sedia kala. Beberapa peristiwa yang diduga dapat kita nyatakan mengikuti sebaran fungsi Pulse misalnya peristiwa Bom Bali I, Bom Bali II, Gunung Merapi meletus, Gunung Krakatau meletus, pemadaman listrik sehari, dan sejenisnya. Sedangkan fungsi Step ditandai sebagai sebuah dummy variable yang bernilai 1 saat kejadian, peristiwa, atau intervensi terjadi dan efeknya gradual naik atau turun secara perlahan sejak waktu T dan efeknya bisa sementara atau bisa juga bersifat permanen menjadikan data runtun waktu berpola baru. Beberapa identifikasi pola intervensi diilustrasikan pada gambar berikut:

Pola residual penentuan order fungsi intervensi Pulse dan Step

Berikutnya, kita beranjak mengangkat sebuah topik yang mungkin menarik untuk dijadikan pemicu ide penelitian. Kali ini kita akan membahas mengenai penerapan ARIMA Intervensi atau model intervensi untuk peramalan laju pertumbuhan ekonomi Indonesia triwulan II hingga triwulan IV tahun 2022.

Meramal pertumbuhan ekonomi Indonesia triwulan II hingga IV tahun 2022 ini sebenarnya telah dilakukan berbagai pihak. Oleh karena itu, kita juga mau mencoba melakukan peramalan kira-kira berapa persen pertumbuhan ekonomi Indonesia pada triwulan II 2022 sampai triwulan IV 2022 tahun ini? Menurut Laporan World Economic Outlook (WEO) International Monetary Fund (IMF), dalam periode 2021-2023 ekonomi Indonesia diramalkan akan tumbuh kuat sebesar 3,3 persen, 5,6 persen, dan 6,0 persen. Menurut Asian Development Bank (ADB), ekonomi Indonesia pada 2022 diperkirakan akan tumbuh 5,2 persen. Sedangkan menurut Bank Indonesia (BI), ekonomi Indonesia pada tahun 2022 akan berada pada kisaran 4,7 persen hingga 5,5 persen.

Menanggapi beberapa peramalan atau prediksi pertumbuhan ekonomi Indonesia selama 2022 dan 2023 tersebut, kita juga akan mencoba melakukannya melalui pemodelan analisis intervensi ARIMA. Adapun efek intervensi yang terakomodir pada residual peramalan ARIMA sebelum intervensi memiliki pola yang mirip ilustrasi berikut sehingga kita akan tentukan order intervensi yang tentatif adalah = 0, r = 2, dan s = 0.

Pola efek residual Intervensi Step - 34 pertumbuhan ekonomi Indonesia

Intervensi dari pemodelan yang akan kita gunakan adalah kebijakan pemerintah memberlakukan Pembatasan Sosial Berskala Besar (PSBB) yang dilakukan sekitar triwulan II - 2020 lampu. Sedangkan data runtun waktu yang akan kita gunakan adalah data laju pertumbuhan ekonomi Indonesia triwulanan year on year (y on y) bersumber dari laman Badan Pusat Statistik Republik Indonesia (bps.go.id) periode 2012 hingga triwulan I - 2022. Datanya telah saya siapkan dan dapat teman-teman unduh pada tautan berikut. Untuk melakukan pemodelan, kita dapat menggunakan beberapa code sebagai beriku:

#Import data laju pertumbuhan ekonomi Indonesia Triwulan 1/2012 - Triwulan I/2022 year on year
library(readxl)
lpeind <- read_excel("C:/Users/Joko Ade/Downloads/lpe_ind.xlsx")
head(lpeind, 10)
## # A tibble: 10 x 1
##        Y
##    <dbl>
##  1  6.5 
##  2  6.3 
##  3  6.4 
##  4  6.17
##  5  6.11
##  6  6.02
##  7  5.81
##  8  5.62
##  9  5.72
## 10  5.21
#Mengattach data
attach(lpeind)
## The following object is masked from lpeind (pos = 3):
## 
##     Y
## The following object is masked from lpeind (pos = 16):
## 
##     Y
#Melihat sekilas data
str(lpeind)
## tibble [41 x 1] (S3: tbl_df/tbl/data.frame)
##  $ Y: num [1:41] 6.5 6.3 6.4 6.17 6.11 6.02 5.81 5.62 5.72 5.21 ...
#konversi ke data runtun waktu
#frekuensi = 4 karena triwulanan
lpe_y <- ts(Y, start = c(2012,1), frequency = 4)
str(lpe_y)
##  Time-Series [1:41] from 2012 to 2022: 6.5 6.3 6.4 6.17 6.11 6.02 5.81 5.62 5.72 5.21 ...
lpe_y
##       Qtr1  Qtr2  Qtr3  Qtr4
## 2012  6.50  6.30  6.40  6.17
## 2013  6.11  6.02  5.81  5.62
## 2014  5.72  5.21  5.12  5.01
## 2015  5.02  4.83  4.74  4.78
## 2016  5.15  4.94  5.21  5.03
## 2017  4.94  5.01  5.06  5.19
## 2018  5.06  5.27  5.17  5.18
## 2019  5.06  5.05  5.01  4.96
## 2020  2.97 -5.32 -3.49 -2.17
## 2021 -0.70  7.07  3.51  5.02
## 2022  5.01
#Visualisasi grafik garis
plot(lpe_y, col = "blue", lwd = 1, main = "Laju Pertumbuhan Ekonomi Indonesia \nTw I/2012 - Tw I/2022 year on year", xlab = "Periode",
     ylab = "persen")
#Membubuhi grid pada grafik
grid()
#memberi garis vertikal warna putus-putus pada grafik
abline(v =2020.2, col = "red", lty=2)
#menambahkan teks keterangan pada garis vertikal merah
text(2019.2, 0, c("Efek Kebijakan PSBB"))
plot of chunk unnamed-chunk-5
Visualisasi 1

#Melihat Data Pertumbuhan yang Paling Ekstrem Bawah
which.min(lpe_y)
## [1] 34
#Data ke-34 merupakan Periode Intervensi
#Library yang dibutuhkan
library(lmtest)
library(forecast)
library(tseries)
#Periode Pra-Intervensi dari Q1 2012 - Q1 2020
pre <- window(lpe_y, start=c(2012), end=c(2020,1))
plot(pre)
plot of chunk unnamed-chunk-8
Visualisasi 2

#Uji Stasioneritas pada mean
#Uji Augmented Dickey Fuller (ADF)
#Uji Pada Level  d= 0
adf.test(pre)[4]
## $p.value
## [1] 0.835727
#Uji pada Diff 1, d = 1
adf.test(diff(pre))[4]
## Warning in adf.test(diff(pre)): p-value greater than printed p-value
## $p.value
## [1] 0.99
#Uji pada Diff 2, d = 2
adf.test(diff(diff(pre))) #Stasioner di Diff 2, d = 2
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff(diff(pre))
## Dickey-Fuller = -1.7452, Lag order = 3, p-value = 0.6708
## alternative hypothesis: stationary
#Uji Philip - Perons (PP)
#uji pada level d = 0
pp.test(pre)[4]
## $p.value
## [1] 0.5120746
#uji pada Diff 1 d = 1
pp.test(diff(pre))[4] #======> Stasioner pada diff 1
## Warning in pp.test(diff(pre)): p-value smaller than printed p-value
## $p.value
## [1] 0.01
#Transformasi Box-Cox agar stasioner pada Ragam
#Mencari Lambda Opsional
require(car)
lamdafm1 <- boxCox(pre~1, family = "yjPower")
plot of chunk unnamed-chunk-10
Visualisasi 3

lamdaopt <- lamdafm1$x[which.max(lamdafm1$y)]
lamdaopt
## [1] 2
lpe_box <- forecast(as.numeric(lpeind$Y), lambda = lamdaopt)
#Data yang digunakan pemodelan arima pra Intervensi
lpe_bc <- lpe_box$fitted
#Plot pre_box
plot(lpe_bc)
plot of chunk unnamed-chunk-11
Visualisasi 4

#Uji Stasioneritas pada Mean
adf.test(lpe_bc)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  lpe_bc
## Dickey-Fuller = -4.1786, Lag order = 3, p-value = 0.01249
## alternative hypothesis: stationary
pp.test(lpe_bc)
## 
##  Phillips-Perron Unit Root Test
## 
## data:  lpe_bc
## Dickey-Fuller Z(alpha) = -16.139, Truncation lag parameter = 3, p-value
## = 0.1115
## alternative hypothesis: stationary
#Cek ACF dan PACF model lpe_bc, d = 0
par(mfrow=c(1, 2))
acf(lpe_bc)
pacf(lpe_bc)
plot of chunk unnamed-chunk-13
Visualisasi 5

#dari hasil cek ACF dan PACF model yang mungkin adalah ARIMA dengan AR max 2, MA max 3, d = 0
#Karena stasioner pada level, include.mean = T
#Model ARIMA(1, 0, 0)
modpre1 <- arima(lpe_bc, order = c(1, 0, 0), include.mean = T)
coeftest(modpre1)
## 
## z test of coefficients:
## 
##           Estimate Std. Error z value  Pr(>|z|)    
## ar1       0.766292   0.094528  8.1065 5.210e-16 ***
## intercept 4.660828   0.981590  4.7482 2.052e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
tsdiag(modpre1)
plot of chunk unnamed-chunk-14
Visualisasi 6

jarque.bera.test(modpre1$residuals)
## 
##  Jarque Bera Test
## 
## data:  modpre1$residuals
## X-squared = 389.47, df = 2, p-value < 2.2e-16
ks.test(modpre1$residuals, ecdf(modpre1$residuals))
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  modpre1$residuals
## D = 0.02439, p-value = 1
## alternative hypothesis: two-sided
checkresiduals(modpre1)
plot of chunk unnamed-chunk-14
Visualisasi 7

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(1,0,0) with non-zero mean
## Q* = 9.7998, df = 6, p-value = 0.1333
## 
## Model df: 2.   Total lags used: 8
#Model ARIMA(2, 0, 0)
modpre2 <- arima(lpe_bc, order = c(2, 0, 0), include.mean = T)
coeftest(modpre2)
## 
## z test of coefficients:
## 
##           Estimate Std. Error z value  Pr(>|z|)    
## ar1        0.91351    0.15067  6.0630 1.336e-09 ***
## ar2       -0.18714    0.15078 -1.2411    0.2146    
## intercept  4.61122    0.84587  5.4514 4.996e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
tsdiag(modpre2) 
plot of chunk unnamed-chunk-14
Visualisasi 8

jarque.bera.test(modpre2$residuals)
## 
##  Jarque Bera Test
## 
## data:  modpre2$residuals
## X-squared = 336.47, df = 2, p-value < 2.2e-16
ks.test(modpre2$residuals, ecdf(modpre2$residuals))
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  modpre2$residuals
## D = 0.02439, p-value = 1
## alternative hypothesis: two-sided
checkresiduals(modpre2)
plot of chunk unnamed-chunk-14
Visualisasi 9

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(2,0,0) with non-zero mean
## Q* = 8.8084, df = 5, p-value = 0.117
## 
## Model df: 3.   Total lags used: 8
#Model ARIMA(0, 0, 1)
modpre3 <- arima(lpe_bc, order = c(0, 0, 1), include.mean = T)
coeftest(modpre3)
## 
## z test of coefficients:
## 
##           Estimate Std. Error z value  Pr(>|z|)    
## ma1       0.956935   0.090862 10.5317 < 2.2e-16 ***
## intercept 4.559979   0.495293  9.2066 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
tsdiag(modpre3)
plot of chunk unnamed-chunk-14
Visualisasi 10

jarque.bera.test(modpre3$residuals)
## 
##  Jarque Bera Test
## 
## data:  modpre3$residuals
## X-squared = 304.76, df = 2, p-value < 2.2e-16
ks.test(modpre3$residuals, ecdf(modpre3$residuals))
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  modpre3$residuals
## D = 0.02439, p-value = 1
## alternative hypothesis: two-sided
checkresiduals(modpre3)
plot of chunk unnamed-chunk-14
Visualisasi 11

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(0,0,1) with non-zero mean
## Q* = 13.844, df = 6, p-value = 0.03143
## 
## Model df: 2.   Total lags used: 8
#Model ARIMA(0, 0, 2)
modpre4 <- arima(lpe_bc, order = c(0, 0, 2), include.mean = T)
coeftest(modpre4)
## 
## z test of coefficients:
## 
##           Estimate Std. Error z value  Pr(>|z|)    
## ma1        0.36946    0.11889  3.1075  0.001887 ** 
## ma2        0.82551    0.15069  5.4780   4.3e-08 ***
## intercept  4.54043    0.54446  8.3393 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
tsdiag(modpre4)
plot of chunk unnamed-chunk-14
Visualisasi 12

jarque.bera.test(modpre4$residuals)
## 
##  Jarque Bera Test
## 
## data:  modpre4$residuals
## X-squared = 332.21, df = 2, p-value < 2.2e-16
ks.test(modpre4$residuals, ecdf(modpre4$residuals))
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  modpre4$residuals
## D = 0.02439, p-value = 1
## alternative hypothesis: two-sided
checkresiduals(modpre4)
plot of chunk unnamed-chunk-14
Visualisasi 13

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(0,0,2) with non-zero mean
## Q* = 10.08, df = 5, p-value = 0.07301
## 
## Model df: 3.   Total lags used: 8
#Model ARIMA(1, 0, 1)
modpre5 <- arima(lpe_bc, order = c(1, 0, 1), include.mean = T)
coeftest(modpre5)
## 
## z test of coefficients:
## 
##           Estimate Std. Error z value  Pr(>|z|)    
## ar1        0.69845    0.13327  5.2409 1.598e-07 ***
## ma1        0.17990    0.18170  0.9901    0.3221    
## intercept  4.63510    0.90055  5.1469 2.648e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
tsdiag(modpre5)
plot of chunk unnamed-chunk-14
Visualisasi 14

jarque.bera.test(modpre5$residuals)
## 
##  Jarque Bera Test
## 
## data:  modpre5$residuals
## X-squared = 353.17, df = 2, p-value < 2.2e-16
ks.test(modpre5$residuals, ecdf(modpre5$residuals))
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  modpre5$residuals
## D = 0.02439, p-value = 1
## alternative hypothesis: two-sided
checkresiduals(modpre5)
plot of chunk unnamed-chunk-14
Visualisasi 15

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(1,0,1) with non-zero mean
## Q* = 8.8106, df = 5, p-value = 0.1169
## 
## Model df: 3.   Total lags used: 8
#Model ARIMA(1, 0, 2)
modpre6 <- arima(lpe_bc, order = c(1, 0, 2), include.mean = T)
coeftest(modpre6)
## 
## z test of coefficients:
## 
##           Estimate Std. Error z value  Pr(>|z|)    
## ar1        0.54006    0.14612  3.6961  0.000219 ***
## ma1        0.15137    0.11074  1.3669  0.171643    
## ma2        0.72187    0.14776  4.8853 1.033e-06 ***
## intercept  4.53515    0.87443  5.1864 2.144e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
tsdiag(modpre6)
plot of chunk unnamed-chunk-14
Visualisasi 16

jarque.bera.test(modpre6$residuals)
## 
##  Jarque Bera Test
## 
## data:  modpre6$residuals
## X-squared = 565.6, df = 2, p-value < 2.2e-16
ks.test(modpre6$residuals, ecdf(modpre6$residuals))
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  modpre6$residuals
## D = 0.02439, p-value = 1
## alternative hypothesis: two-sided
checkresiduals(modpre6)
plot of chunk unnamed-chunk-14
Visualisasi 17

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(1,0,2) with non-zero mean
## Q* = 6.096, df = 4, p-value = 0.1921
## 
## Model df: 4.   Total lags used: 8
#Model ARIMA(2, 0, 2)
modpre7 <- arima(lpe_bc, order = c(2, 0, 2), include.mean = T)
coeftest(modpre7)
## 
## z test of coefficients:
## 
##            Estimate Std. Error z value  Pr(>|z|)    
## ar1        0.830270   0.211014  3.9347 8.331e-05 ***
## ar2       -0.363821   0.200154 -1.8177   0.06911 .  
## ma1       -0.032675   0.154397 -0.2116   0.83239    
## ma2        0.761140   0.129992  5.8553 4.761e-09 ***
## intercept  4.493167   0.684919  6.5601 5.376e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
tsdiag(modpre7)
plot of chunk unnamed-chunk-14
Visualisasi 18

jarque.bera.test(modpre7$residuals)
## 
##  Jarque Bera Test
## 
## data:  modpre7$residuals
## X-squared = 665.39, df = 2, p-value < 2.2e-16
ks.test(modpre7$residuals, ecdf(modpre7$residuals))
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  modpre7$residuals
## D = 0.02439, p-value = 1
## alternative hypothesis: two-sided
checkresiduals(modpre7)
plot of chunk unnamed-chunk-14
Visualisasi 19

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(2,0,2) with non-zero mean
## Q* = 3.7047, df = 3, p-value = 0.2952
## 
## Model df: 5.   Total lags used: 8
#Model ARIMA(0, 0, 3)
modpre8 <- arima(lpe_bc, order = c(0, 0, 3), include.mean = T)
coeftest(modpre8)
## 
## z test of coefficients:
## 
##           Estimate Std. Error z value  Pr(>|z|)    
## ma1        1.10450    0.15507  7.1225 1.060e-12 ***
## ma2        0.96164    0.16201  5.9355 2.930e-09 ***
## ma3        0.85714    0.13826  6.1996 5.659e-10 ***
## intercept  4.56896    0.70982  6.4368 1.220e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
tsdiag(modpre8)
plot of chunk unnamed-chunk-14
Visualisasi 20

jarque.bera.test(modpre8$residuals)
## 
##  Jarque Bera Test
## 
## data:  modpre8$residuals
## X-squared = 1507, df = 2, p-value < 2.2e-16
ks.test(modpre8$residuals, ecdf(modpre8$residuals))
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  modpre8$residuals
## D = 0.02439, p-value = 1
## alternative hypothesis: two-sided
checkresiduals(modpre8)
plot of chunk unnamed-chunk-14
Visualisasi 21

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(0,0,3) with non-zero mean
## Q* = 2.0352, df = 4, p-value = 0.7293
## 
## Model df: 4.   Total lags used: 8
#Model ARIMA(1, 0, 3)
modpre9 <- arima(lpe_bc, order = c(1, 0, 3), include.mean = T)
coeftest(modpre9)
## 
## z test of coefficients:
## 
##           Estimate Std. Error z value  Pr(>|z|)    
## ar1       0.018778   0.213337  0.0880    0.9299    
## ma1       1.095300   0.190945  5.7362 9.682e-09 ***
## ma2       0.950676   0.205288  4.6309 3.640e-06 ***
## ma3       0.855374   0.142139  6.0179 1.767e-09 ***
## intercept 4.570049   0.719035  6.3558 2.073e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
tsdiag(modpre9)
plot of chunk unnamed-chunk-14
Visualisasi 22

jarque.bera.test(modpre9$residuals)
## 
##  Jarque Bera Test
## 
## data:  modpre9$residuals
## X-squared = 1498, df = 2, p-value < 2.2e-16
ks.test(modpre9$residuals, ecdf(modpre9$residuals))
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  modpre9$residuals
## D = 0.02439, p-value = 1
## alternative hypothesis: two-sided
checkresiduals(modpre9)
plot of chunk unnamed-chunk-14
Visualisasi 23

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(1,0,3) with non-zero mean
## Q* = 2.0581, df = 3, p-value = 0.5604
## 
## Model df: 5.   Total lags used: 8
#Model ARIMA(2, 0, 3)
modpre10 <- arima(lpe_bc, order = c(2, 0, 3), include.mean = T)
coeftest(modpre10)
## 
## z test of coefficients:
## 
##           Estimate Std. Error z value  Pr(>|z|)    
## ar1       0.019015   0.205595  0.0925    0.9263    
## ar2       0.037517   0.184237  0.2036    0.8386    
## ma1       1.092562   0.178878  6.1078 1.010e-09 ***
## ma2       0.935785   0.208368  4.4910 7.088e-06 ***
## ma3       0.843218   0.146820  5.7432 9.290e-09 ***
## intercept 4.569282   0.741197  6.1647 7.060e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
tsdiag(modpre10)
plot of chunk unnamed-chunk-14
Visualisasi 24

jarque.bera.test(modpre10$residuals)
## 
##  Jarque Bera Test
## 
## data:  modpre10$residuals
## X-squared = 1500.1, df = 2, p-value < 2.2e-16
ks.test(modpre10$residuals, ecdf(modpre10$residuals))
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  modpre10$residuals
## D = 0.02439, p-value = 1
## alternative hypothesis: two-sided
checkresiduals(modpre10)
plot of chunk unnamed-chunk-14
Visualisasi 24

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(2,0,3) with non-zero mean
## Q* = 2.0412, df = 3, p-value = 0.5639
## 
## Model df: 6.   Total lags used: 9
#Perbandingan AIC
knitr::kable(cbind(c("ARIMA (1, 0, 0)", "ARIMA (2, 0, 0)", "ARIMA (0, 0, 1)",
                     "ARIMA (0, 0, 2)", "ARIMA (1, 0, 1)", "ARIMA (1, 0, 2)", "ARIMA (2, 0, 2)",
                     "ARIMA (0, 0, 3)", "ARIMA (1, 0, 3)", "ARIMA (2, 0, 3)"),
                   c(modpre1$aic, modpre2$aic, modpre3$aic, modpre4$aic,
                     modpre5$aic, modpre6$aic, modpre7$aic, modpre8$aic, modpre9$aic, modpre10$aic),
                   c(accuracy(modpre1)[5], accuracy(modpre2)[5], accuracy(modpre3)[5], accuracy(modpre4)[5],
                     accuracy(modpre5)[5], accuracy(modpre6)[5], accuracy(modpre7)[5], accuracy(modpre8)[5],
                     accuracy(modpre9)[5], accuracy(modpre10)[5])),
             col.names = c("Model", "Nilai AIC", "MAPE"))
## Warning in trainingaccuracy(object, test, d, D): test elements must be within
## sample

## Warning in trainingaccuracy(object, test, d, D): test elements must be within
## sample

## Warning in trainingaccuracy(object, test, d, D): test elements must be within
## sample

## Warning in trainingaccuracy(object, test, d, D): test elements must be within
## sample

## Warning in trainingaccuracy(object, test, d, D): test elements must be within
## sample

## Warning in trainingaccuracy(object, test, d, D): test elements must be within
## sample

## Warning in trainingaccuracy(object, test, d, D): test elements must be within
## sample

## Warning in trainingaccuracy(object, test, d, D): test elements must be within
## sample

## Warning in trainingaccuracy(object, test, d, D): test elements must be within
## sample

## Warning in trainingaccuracy(object, test, d, D): test elements must be within
## sample
Model Nilai AIC MAPE
ARIMA (1, 0, 0) 158.645853576448 NaN
ARIMA (2, 0, 0) 159.13975976907 NaN
ARIMA (0, 0, 1) 163.315744573826 NaN
ARIMA (0, 0, 2) 164.129032776725 NaN
ARIMA (1, 0, 1) 159.584637257102 NaN
ARIMA (1, 0, 2) 156.623374786337 NaN
ARIMA (2, 0, 2) 155.600581219104 NaN
ARIMA (0, 0, 3) 144.460666107613 NaN
ARIMA (1, 0, 3) 146.452892844622 NaN
ARIMA (2, 0, 3) 148.411825121056 NaN
#Dengan pertimbangan signifikansi variabel, model terbaik adalah model ARIMA(0, 0, 3)
#Identifikasi Order Intervensi
preforcast <- forecast(modpre8, h = 8)
## Error in ts(x): 'ts' object must have one or more observations
par(mfrow=c(1, 1))
#menampilkan Forecast Pra Intervensi
preforcast
##    Point Forecast    Lo 80    Hi 80       Lo 95    Hi 95
## 42       5.339365 3.786503 6.892227  2.96446779 7.714263
## 43       4.242082 1.954650 6.529513  0.74375714 7.740406
## 44       4.919852 2.190542 7.649162  0.74573287 9.093972
## 45       4.568962 1.545709 7.592215 -0.05470469 9.192628
## 46       4.568962 1.545709 7.592215 -0.05470469 9.192628
## 47       4.568962 1.545709 7.592215 -0.05470469 9.192628
## 48       4.568962 1.545709 7.592215 -0.05470469 9.192628
## 49       4.568962 1.545709 7.592215 -0.05470469 9.192628
#Identifikasi intervensi order dengan plot residual
error_iden <- rep(0, 33)
error_iden[1:33] <- preforcast$residuals[1:33]
error_iden[34:41] <- Y[34:41] - preforcast$mean
plot(error_iden, type = "h", xlab = "Waktu", ylab = "residuals", xaxt = "n", ylim = c(-15, 15))
abline(h=c(-3*sd(preforcast$residuals), 3*sd(preforcast$residuals)), col = "blue", lty = 2)
abline(h=0, col = "blue", lty = 2)
abline(v=34, col = "red", lty = 3, lwd = 1.5)
text(34, 12, "T", cex = 1, pos = 1)
axis(1, at = c(0, 10, 20, 30, 40), labels = c("T-34", "T-24", "T-14", "T-8", "T+6"))
plot of chunk unnamed-chunk-17
Visualisasi 25

#Estimasi parameter intervensi Pulse
library(TSA)
#Model ARIMA Intervensi order b = 0, r = 2, s = 0
modintervensi <- arimax(lpe_y, order=c(0, 0, 3),#Order ARIMA
                        seasonal=list(order=c(0, 0, 0), frequency=4), #Tanpa Musiman frekuensi bulanan (12)
                        include.mean=TRUE, #karena with non-zero mean jadi TRUE
                        xtransf= data.frame(Qtr2=1 * (seq(lpe_y) == 34)), #cek bahwa waktu Pra-Intervensi 1 sampai data ke-33, maka seq(cds) == 34 atau mulai data 34
                        transfer=list(c(2, 0)), method = "ML") # list(c(r, s))

modintervensi
## 
## Call:
## arimax(x = lpe_y, order = c(0, 0, 3), seasonal = list(order = c(0, 0, 0), frequency = 4), 
##     include.mean = TRUE, method = "ML", 
##     xtransf = data.frame(Qtr2 = 1 * (seq(lpe_y) == 34)), transfer = list(c(2, 
##         0)))
## 
## Coefficients:
##           ma1     ma2     ma3  intercept  Qtr2-AR1  Qtr2-AR2  Qtr2-MA0
##       -0.5085  0.3336  0.5997      5.240    0.9212   -0.2585  -10.4511
## s.e.   0.1444  0.1559  0.1273      0.166    0.0349    0.0427    0.5215
## 
## sigma^2 estimated as 0.4767:  log likelihood = -45.75,  aic = 105.51
coeftest(modintervensi)
## 
## z test of coefficients:
## 
##             Estimate Std. Error  z value  Pr(>|z|)    
## ma1        -0.508485   0.144378  -3.5219 0.0004284 ***
## ma2         0.333602   0.155866   2.1403 0.0323299 *  
## ma3         0.599703   0.127298   4.7110 2.465e-06 ***
## intercept   5.240047   0.166034  31.5602 < 2.2e-16 ***
## Qtr2-AR1    0.921226   0.034889  26.4046 < 2.2e-16 ***
## Qtr2-AR2   -0.258476   0.042742  -6.0473 1.473e-09 ***
## Qtr2-MA0  -10.451127   0.521535 -20.0392 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
tsdiag(modintervensi)
plot of chunk unnamed-chunk-18
Visualisasi 26

jarque.bera.test(modintervensi$residuals)
## 
##  Jarque Bera Test
## 
## data:  modintervensi$residuals
## X-squared = 9.2253, df = 2, p-value = 0.009926
ks.test(modintervensi$residuals, ecdf(modintervensi$residuals))
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  modintervensi$residuals
## D = 0.02439, p-value = 1
## alternative hypothesis: two-sided
checkresiduals(modintervensi)
plot of chunk unnamed-chunk-18
Visualisasi 27

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(0,0,3) with non-zero mean
## Q* = 5.4273, df = 3, p-value = 0.1431
## 
## Model df: 7.   Total lags used: 10
AIC(modintervensi)
## [1] 107.5082
#Diagnosa Intervensi Step
step34 <- filter(1*(seq(lpe_y) == 34), filter = c(0.921226, -0.258476), method = "rec", sides = 1) * -10.451127  #b = 0, r = 1, s = 0
step34
## Time Series:
## Start = 1 
## End = 41 
## Frequency = 1 
##  [1]   0.00000000   0.00000000   0.00000000   0.00000000   0.00000000
##  [6]   0.00000000   0.00000000   0.00000000   0.00000000   0.00000000
## [11]   0.00000000   0.00000000   0.00000000   0.00000000   0.00000000
## [16]   0.00000000   0.00000000   0.00000000   0.00000000   0.00000000
## [21]   0.00000000   0.00000000   0.00000000   0.00000000   0.00000000
## [26]   0.00000000   0.00000000   0.00000000   0.00000000   0.00000000
## [31]   0.00000000   0.00000000   0.00000000 -10.45112700  -9.62784992
## [36]  -6.16806017  -3.19360926  -1.34774037  -0.41610212  -0.03496555
## [41]   0.07534124
plot(step34)
plot of chunk unnamed-chunk-19
Visualisasi 28

#Memodelkan ARIMA Intervensi Step34
#untuk menguji signifikansi intervensi pada model
arima_intervensi <- Arima(lpe_y, order = c(0, 0, 3),seasonal = c(0, 0, 0), xreg = step34,
                          include.mean = T)
summary(arima_intervensi)
## Series: lpe_y 
## Regression with ARIMA(0,0,3) errors 
## 
## Coefficients:
##           ma1     ma2     ma3  intercept    xreg
##       -0.5098  0.3336  0.6003     5.2408  1.0002
## s.e.   0.1388  0.1546  0.1265     0.1506  0.0297
## 
## sigma^2 estimated as 0.5424:  log likelihood=-45.75
## AIC=103.51   AICc=105.98   BIC=113.79
## 
## Training set error measures:
##                       ME     RMSE      MAE      MPE    MAPE      MASE
## Training set -0.02915366 0.690108 0.483772 4.494498 16.5069 0.2462113
##                    ACF1
## Training set 0.06937737
coeftest(arima_intervensi) #Intervensinya Signifikan
## 
## z test of coefficients:
## 
##            Estimate Std. Error z value  Pr(>|z|)    
## ma1       -0.509806   0.138849 -3.6716  0.000241 ***
## ma2        0.333592   0.154589  2.1579  0.030934 *  
## ma3        0.600306   0.126497  4.7456 2.079e-06 ***
## intercept  5.240765   0.150592 34.8011 < 2.2e-16 ***
## xreg       1.000170   0.029673 33.7069 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
tsdiag(arima_intervensi)
plot of chunk unnamed-chunk-20
Visualisasi 29

jarque.bera.test(arima_intervensi$residuals)
## 
##  Jarque Bera Test
## 
## data:  arima_intervensi$residuals
## X-squared = 9.1631, df = 2, p-value = 0.01024
ks.test(arima_intervensi$residuals, ecdf(arima_intervensi$residuals))
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  arima_intervensi$residuals
## D = 0.02439, p-value = 1
## alternative hypothesis: two-sided
checkresiduals(arima_intervensi)
plot of chunk unnamed-chunk-20
Visualisasi 30

## 
##  Ljung-Box test
## 
## data:  Residuals from Regression with ARIMA(0,0,3) errors
## Q* = 5.0604, df = 3, p-value = 0.1674
## 
## Model df: 5.   Total lags used: 8
AIC(arima_intervensi)
## [1] 103.508
#Peramalan hasil model Intervensi
xreg_rob = forecast(auto.arima(step34), h = 3)$mean
#Melakukan peramalan 3 triwulan ke depan Q2 2022 - Q4 2022
fc <- forecast(arima_intervensi, xreg = xreg_rob)
fc
##         Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
## 2022 Q2       5.506978 4.541276 6.472679 4.030064 6.983891
## 2022 Q3       5.293738 4.221357 6.366119 3.653673 6.933803
## 2022 Q4       4.886250 3.774480 5.998020 3.185944 6.586556
#Melihat Akurasi Peramalan
accuracy(arima_intervensi, xreg = xreg_rob)
##                       ME     RMSE      MAE      MPE    MAPE      MASE
## Training set -0.02915366 0.690108 0.483772 4.494498 16.5069 0.2462113
##                    ACF1
## Training set 0.06937737
#Melihat R Square Model ARIMA (0, 0, 3) Tanpa Intervensi
library(caret)
arimasaja <- Arima(lpe_bc, order = c(0, 0, 3), include.mean = T)
pred_arimasaja <- arimasaja$fitted
R2(pred_arimasaja, as.numeric(lpe_y), formula = "traditional")
## [1] 0.1421703
#Melihat R Square Model ARIMA dengan Intervensi
pred <- arima_intervensi$fitted
R2(pred, lpe_y, formula = "traditional")
## [1] 0.9283124
#Menampilkan Prediksi dan nilai asli
library(ggfortify)
prediksi <- as.numeric(pred)
trueval <- as.numeric(lpe_y)
predtrueval <- data.frame(prediksi, trueval)
predtrueval.ts <- ts(predtrueval)
theme_set(theme_bw())
autoplot(predtrueval.ts,xlab = "Periode", ylab = "Laju Pertumbuhan (%)") +
  ggtitle("Plot Runtun Waktu Prediksi dan Data Asli") +
  theme(plot.title = element_text(hjust = .5))
plot of chunk unnamed-chunk-24
Visualisasi 31

pesimis <- as.data.frame(fc$lower)[2]
optimis <- as.data.frame(fc$upper)[2]
a <- plot(lpe_y, col = "blue", type = "b", xlim = c(2011.1, 2023.1), ylim = c(-10, 13), pch = 19,
          ylab = "Pertumbuhan (persen)", xlab = "Periode",
          main = "Peramalan ARIMA(0, 0, 3) Intervensi Step-34 \n Laju Pertumbuhan Ekonomi Indonesia Q2 - Q4 2022")
b <- lines(pred, col = "red", type = "b")
c <- lines(fc$mean, col = "yellow", type = "b", pch = 19)
d <- lines(ts(pesimis$`95%`, start = 2022.1, frequency = 4), col = "red", type = "b")
e <- lines(ts(optimis$`95%`, start = 2022.1, frequency = 4), col = "green", type ="b")
text(2022.2,10, c("Skenario\n Optimis"), cex = 0.8)
text(2022.2,-3, c("Skenario\n Pesimis"), cex = 0.8)
abline(v =2020.2, col = "red", lty=2)
abline(v =2022, col = "red", lty=2)
text(2019.1, 0.2, c("Kebijakan PSBB"), cex = 0.8, col = "blue")
legend(2011.4,-7, legend = c("Data Aktual", "Prediksi dari ARIMA Intervensi", "Forecast", "Upper Forecast 95% - Optimis", 
                             "Lower Forecast 95% - Pesimis"), col = c("blue", "red", "yellow", "green", "red"),
       lty = 1, cex = 0.6, box.col = "white", horiz = F)
plot of chunk unnamed-chunk-25
Visualisasi 32

Berdasarkan model intervensi atau ARIMA Intervensi tentatif yang kita peroleh, dengan tingkat keyakinan 95 persen, pertumbuhan ekonomi Indonesia triwulan II 2022 diperkirakan sebesar 4,03 persen hingga level optimis sebesar 6,98 persen. Sedangkan skenario moderat, petumbuhan ekonomi Indonesia pada triwulan II 2022 diperkirakan sebesar 5,51 persen. Kemudian, dengan tingkat keyakinan 95 persen, pertumbuhan ekonomi Indonesia triwulan III 2022 diperkirakan sebesar 3,65 persen hingga level optimis sebesar 6,93 persen. Sedangkan skenario moderat, petumbuhan ekonomi Indonesia pada triwulan III 2022 diperkirakan sebesar 5,29 persen. Sementara itu, dengan tingkat keyakinan 95 persen, pertumbuhan ekonomi Indonesia triwulan IV 2022 diperkirakan sebesar 3,19 persen hingga level optimis sebesar 6,59 persen. Sedangkan untuk skenario moderat, petumbuhan ekonomi Indonesia pada triwulan IV 2022 diperkirakan sebesar 4,88 persen. Beberapa asumsi yang digunakan dalam peramalan pertumbuhan ekonomi ini adalah tidak adanya perubahan drastis pola konsumsi masyarakat, pandemi Covid-19 tetap terkendali, demikian halnya inflasi yang juga terkendali pada rentang batas normal.

Dari hasil prediksi tersebut, pertumbuhan ekonomi Indonesia pada tahun 2022 berada pada rentang 3,95 persen hingga 6,39 persen secara cummulative to cummulative (c to c). Adapun menurut skenario moderat, pertumbuhan ekonomi Indonesia tahun 2022 adalah sebesar 5,17 persen (c to c). Pertumbuhan skenario moderat dari model kita ini agaknya tidak jauh berbeda dengan prediksi dari ADB yang memprediksi pertumbuhan ekonomi Indonesia tahun 2022 sebesar 5,2 persen.

Dari hasil pemodelan ARIMA (0, 0, 3) dengan intervensi Step - 34 di atas, kita kemudian dapat menyusun persamaan model tentatif sebagai berikut:

Model ARIMA Intervensi tentatif

Demikian sedikit ulasan mengenai ARIMA dengan intervensi fungsi Pulse dan Step menggunakan R. Selamat memahami dan mempraktikkan!

1 komentar

  1. Sangat inspiratif mas, jadi pengen mencoba juga, forecasting dengan memperhatikan efek pandemi...

    BalasHapus


EmoticonEmoticon