Pasar modal merupakan salah satu pilar sistem keuangan yang berfungsi mempertemukan pihak yang membutuhkan dana jangka panjang dengan pihak yang memiliki kelebihan dana. Di Indonesia, kinerja pasar saham secara keseluruhan lazim diukur dengan Indeks Harga Saham Gabungan (IHSG), yaitu indeks yang mencerminkan pergerakan harga seluruh saham biasa dan saham preferen yang tercatat di Bursa Efek Indonesia. Karena mencakup seluruh emiten, IHSG kerap dijadikan barometer kondisi ekonomi nasional sekaligus acuan bagi investor, regulator, dan pembuat kebijakan.
Pergerakan harga saham tidak berdiri sendiri. Teori penentuan harga aset, seperti Arbitrage Pricing Theory (Ross, 1976) dan model diskonto arus kas, menyatakan bahwa harga saham ditentukan oleh ekspektasi arus kas dan tingkat diskonto yang dipengaruhi oleh variabel makroekonomi. Chen, Roll, dan Ross (1986) menunjukkan bahwa variabel makroekonomi seperti inflasi, struktur suku bunga, dan harga energi merupakan faktor risiko sistematis yang memengaruhi imbal hasil saham. Bagi perekonomian terbuka kecil seperti Indonesia, faktor global (harga komoditas dan nilai tukar) serta faktor domestik (inflasi) sama-sama relevan.
Nilai tukar rupiah terhadap dolar Amerika Serikat (USD/IDR) memengaruhi biaya impor bahan baku, beban utang luar negeri korporasi, serta aliran modal portofolio asing. Pelemahan rupiah dapat menekan laba emiten yang bergantung pada bahan baku impor, tetapi dapat pula menguntungkan emiten berorientasi ekspor. Emas dunia dipandang sebagai aset lindung nilai (safe haven) sehingga kenaikan harganya sering mencerminkan meningkatnya ketidakpastian global dan dapat menjadi aset substitusi bagi saham. Minyak dunia merupakan input produksi utama dan komoditas yang dampaknya berbeda antara negara pengekspor dan pengimpor neto. Indonesia sejak lama berstatus pengimpor neto minyak mentah dan produk BBM, sementara sektor energi dan pertambangan memiliki bobot yang besar di bursa. Inflasi memengaruhi daya beli, biaya input, dan arah kebijakan moneter sehingga ikut memengaruhi valuasi saham.
Data penelitian ini memperlihatkan dinamika yang cukup lebar selama periode Januari 2017 hingga Agustus 2026 (116 observasi bulanan). IHSG bergerak dari 5.294,10 poin pada Januari 2017, mencapai titik terendah 4.538,93 poin pada Maret 2020 saat pandemi COVID-19, dan titik tertinggi 8.646,94 poin pada Desember 2025. Kurs JISDOR melemah dari kisaran Rp13.300 per dolar AS pada awal periode menjadi Rp18.058 pada Juli 2026. Harga emas futures meningkat tajam dari sekitar USD1.211 per troy ounce menjadi puncak USD5.247,9 pada Februari 2026. Harga minyak WTI futures berfluktuasi antara USD18,84 per barel (April 2020) dan USD114,67 per barel (Mei 2022), sedangkan inflasi bulanan (month-to-month) berkisar antara −0,76% dan 1,65%. Variasi tersebut menunjukkan bahwa periode pengamatan memuat beberapa guncangan besar, yakni pandemi, lonjakan harga energi, serta pengetatan kebijakan moneter global, sehingga cocok untuk menelaah hubungan jangka pendek maupun jangka panjang antarvariabel.
Secara metodologis, data keuangan dan ekonomi berbentuk deret waktu umumnya tidak stasioner pada level. Regresi langsung pada data non-stasioner berisiko menghasilkan regresi lancung (spurious regression) (Granger & Newbold, 1974). Oleh karena itu diperlukan uji stasioneritas dan uji kointegrasi. Apabila variabel memiliki orde integrasi campuran I(0) dan I(1), pendekatan Autoregressive Distributed Lag (ARDL) dengan uji batas (bounds test) dari Pesaran, Shin, dan Smith (2001) dapat digunakan. Apabila seluruh variabel terintegrasi pada orde yang sama dan terdapat kointegrasi, pendekatan Vector Error Correction Model (VECM) dari Johansen (1988) memungkinkan analisis hubungan jangka panjang dan jangka pendek secara simultan, dilengkapi uji kausalitas Granger, Impulse Response Function (IRF), dan Forecast Error Variance Decomposition (FEVD) untuk menelusuri arah, dinamika, dan kontribusi guncangan antarvariabel.
Berdasarkan uraian tersebut, penelitian ini menganalisis pengaruh nilai tukar USD/IDR, harga emas dunia, harga minyak dunia, dan inflasi terhadap IHSG dengan pendekatan ARDL dan VAR/VECM, serta memeriksa kelayakan model melalui uji diagnostik.
Berdasarkan latar belakang di atas, rumusan masalah penelitian ini adalah sebagai berikut.
Bagaimana karakteristik dan stasioneritas data IHSG, nilai tukar USD/IDR, harga emas dunia, harga minyak dunia, dan inflasi pada periode Januari 2017 sampai Agustus 2026?
Apakah terdapat hubungan jangka panjang (kointegrasi) antara IHSG dengan nilai tukar USD/IDR, harga emas dunia, harga minyak dunia, dan inflasi?
Bagaimana pengaruh jangka pendek dan jangka panjang nilai tukar USD/IDR, harga emas dunia, harga minyak dunia, dan inflasi terhadap IHSG berdasarkan model ARDL dan VAR/VECM?
Bagaimana hubungan kausalitas Granger antarvariabel penelitian?
Bagaimana respons IHSG terhadap guncangan masing-masing variabel (IRF) dan seberapa besar kontribusi setiap variabel terhadap ragam galat peramalan IHSG (FEVD)?
Tujuan penelitian ini adalah sebagai berikut.
Mendeskripsikan karakteristik data dan menguji stasioneritas seluruh variabel penelitian.
Menguji ada tidaknya kointegrasi antara IHSG dan variabel makroekonomi yang diteliti.
Mengestimasi dan menginterpretasikan pengaruh jangka pendek dan jangka panjang variabel independen terhadap IHSG menggunakan ARDL dan VAR/VECM.
Menganalisis arah hubungan sebab-akibat antarvariabel melalui uji kausalitas Granger.
Menganalisis respons dinamis IHSG terhadap guncangan variabel lain melalui IRF dan mengukur kontribusi guncangan melalui FEVD.
Manfaat teoretis. Penelitian ini memperkaya kajian empiris mengenai keterkaitan pasar saham dengan faktor ekonomi global dan domestik di Indonesia, khususnya melalui penerapan metode deret waktu multivariat (ARDL dan VAR/VECM) pada data periode terbaru yang memuat berbagai guncangan.
Manfaat praktis.
Bagi investor dan manajer investasi, hasil penelitian dapat menjadi bahan pertimbangan dalam menyusun strategi alokasi aset dan manajemen risiko.
Bagi regulator dan pembuat kebijakan (Bank Indonesia, Otoritas Jasa Keuangan, dan pemerintah), hasil penelitian dapat menjadi masukan dalam menjaga stabilitas pasar keuangan.
Bagi akademisi dan peneliti selanjutnya, penelitian ini dapat menjadi rujukan metodologis dan pembanding.
Variabel dependen adalah IHSG (poin), dan variabel independen adalah kurs JISDOR (Rp/USD), harga emas futures (USD/troy ounce), harga minyak mentah WTI futures (USD/barel), dan inflasi bulanan (month-to-month, %).
Data berupa deret waktu bulanan periode Januari 2017 sampai Agustus 2026 (116 observasi) yang bersumber dari berkas data penelitian (DC.xlsx).
Metode analisis dibatasi pada uji stasioneritas, uji kointegrasi, ARDL, VAR/VECM, uji kausalitas Granger, IRF, FEVD, dan evaluasi model.
Variabel lain yang juga berpotensi memengaruhi IHSG (suku bunga acuan, aliran modal asing, indeks bursa global, dan faktor non-ekonomi) tidak dimasukkan ke dalam model.
Hasil penelitian bersifat asosiatif dan tidak serta-merta menunjukkan hubungan kausal struktural.
IHSG (Jakarta Composite Index) adalah indeks yang mengukur kinerja harga seluruh saham biasa dan preferen yang tercatat di papan utama dan papan pengembangan Bursa Efek Indonesia. IHSG pertama kali diperkenalkan pada 1 April 1983 dengan nilai dasar 100 yang merujuk pada 10 Agustus 1982. Perhitungannya menggunakan metode rata-rata tertimbang kapitalisasi pasar:
$$
_t =
$$
dengan \(p_{i,t}\) harga pasar saham ke-\(i\) pada waktu \(t\), \(q_{i,t}\) jumlah saham tercatat, dan \(d_t\) nilai dasar yang disesuaikan terhadap aksi korporasi. Karena dibobot kapitalisasi pasar, saham berkapitalisasi besar memiliki pengaruh dominan terhadap pergerakan indeks. Perubahan IHSG sering dinyatakan sebagai imbal hasil (return) logaritmik, \(r_t = \ln(\text{IHSG}_t) - \ln(\text{IHSG}_{t-1})\).
Pergerakan IHSG bulanan, Januari 2017 sampai Agustus 2026
Nilai tukar adalah harga satu mata uang dalam satuan mata uang lain. Kurs USD/IDR menyatakan jumlah rupiah yang diperlukan untuk memperoleh satu dolar AS. Kenaikan kurs berarti depresiasi rupiah. Dalam penelitian ini digunakan kurs JISDOR (Jakarta Interbank Spot Dollar Rate), yaitu kurs referensi yang dipublikasikan Bank Indonesia berdasarkan transaksi spot antarbank.
Terdapat dua pendekatan teoretis utama mengenai hubungan kurs dan harga saham. Pertama, pendekatan flow-oriented (Dornbusch & Fischer, 1980) menyatakan bahwa perubahan kurs memengaruhi daya saing ekspor dan impor sehingga memengaruhi laba perusahaan dan harga sahamnya. Kedua, pendekatan stock-oriented (portfolio balance) (Branson, 1983; Frankel, 1983) menyatakan bahwa harga saham memengaruhi kurs melalui aliran modal portofolio. Dengan demikian arah hubungan keduanya dapat bersifat dua arah, dan tanda pengaruhnya bergantung pada struktur ekonomi serta komposisi emiten.
Pergerakan kurs JISDOR (Rp/USD)
Emas adalah logam mulia yang secara tradisional berfungsi sebagai penyimpan nilai dan aset lindung nilai terhadap inflasi, depresiasi mata uang, serta ketidakpastian geopolitik. Harga acuan dunia umumnya dinyatakan dalam dolar AS per troy ounce dan dalam penelitian ini diwakili harga futures emas. Baur dan Lucey (2010) membedakan emas sebagai hedge (tidak berkorelasi atau berkorelasi negatif dengan aset lain secara rata-rata) dan safe haven (tidak berkorelasi atau berkorelasi negatif pada saat pasar mengalami tekanan ekstrem).
Hubungan emas dan saham dapat bersifat substitusi, yaitu ketika ketidakpastian meningkat, dana mengalir dari saham ke emas sehingga harga emas naik dan harga saham turun. Hubungan juga dapat bersifat positif ketika kenaikan emas mencerminkan melemahnya dolar AS atau likuiditas global yang longgar. Bagi Indonesia sebagai produsen emas, kenaikan harga emas juga dapat meningkatkan kinerja emiten pertambangan.
Pergerakan harga emas futures (USD/troy ounce)
Minyak mentah merupakan komoditas energi strategis. Penelitian ini memakai harga minyak West Texas Intermediate (WTI) futures dalam USD per barel. Secara teoretis, kenaikan harga minyak meningkatkan biaya produksi dan menekan margin laba perusahaan pengguna energi, sementara laba perusahaan penghasil energi meningkat. Kilian dan Park (2009) menegaskan bahwa dampak harga minyak terhadap pasar saham bergantung pada sumber perubahannya (guncangan permintaan agregat, guncangan penawaran, atau permintaan spesifik minyak), sehingga tanda pengaruhnya tidak selalu sama sepanjang waktu.
Bagi Indonesia, dampak harga minyak bersifat ganda: sebagai pengimpor neto minyak, kenaikan harga memperbesar beban subsidi energi dan defisit transaksi berjalan, tetapi sebagai produsen batu bara dan gas, sektor energi turut diuntungkan. Bobot sektor energi dan pertambangan di IHSG membuat arah pengaruh akhirnya menjadi pertanyaan empiris.
Pergerakan harga minyak WTI futures (USD/barel)
Inflasi adalah kenaikan harga barang dan jasa secara umum dan terus-menerus dalam suatu periode. Di Indonesia inflasi diukur melalui perubahan Indeks Harga Konsumen (IHK) yang dipublikasikan Badan Pusat Statistik. Inflasi bulanan (month-to-month) dihitung sebagai:
$$
_t = %
$$
Fisher (1930) mengemukakan hipotesis bahwa imbal hasil saham nominal seharusnya mengimbangi inflasi sehingga imbal hasil riil tidak terpengaruh. Namun, banyak studi empiris menemukan hubungan negatif jangka pendek antara inflasi dan imbal hasil saham (Fama, 1981), antara lain karena inflasi tinggi mendorong pengetatan moneter, menaikkan tingkat diskonto, dan menekan daya beli. Karena inflasi bulanan sudah berupa laju perubahan (bukan tingkat indeks) dan dapat bernilai negatif (deflasi), variabel ini tidak ditransformasi logaritma.
Inflasi bulanan month-to-month (%)
| Variabel | N | Rata2 | SimpBaku | Min | Maks |
|---|---|---|---|---|---|
| Emas | 116 | 2095.83 | 954.61 | 1196.20 | 5247.90 |
| IHSG | 116 | 6496.47 | 802.63 | 4538.93 | 8646.94 |
| Inflasi | 116 | 0.23 | 0.33 | -0.76 | 1.65 |
| Kurs | 116 | 14993.98 | 1165.39 | 13319.00 | 18058.00 |
| WTI | 116 | 66.86 | 17.03 | 18.84 | 114.67 |
Kerangka teoretis hubungan variabel makroekonomi dengan harga saham bertumpu pada model diskonto arus kas, yaitu harga saham sama dengan nilai kini seluruh dividen atau arus kas masa depan:
$$
P_t = _{k=1}^{}
$$
Variabel makroekonomi memengaruhi \(P_t\) melalui dua jalur, yaitu ekspektasi arus kas (\(D\)) dan tingkat diskonto (\(r\)). Arbitrage Pricing Theory (Ross, 1976) memperluas gagasan ini dengan menyatakan imbal hasil aset merupakan fungsi linear dari beberapa faktor risiko sistematis, dan Chen et al. (1986) mengidentifikasi variabel makroekonomi sebagai faktor tersebut.
Deret waktu adalah himpunan observasi \(\{y_t\}\) yang dicatat secara berurutan menurut waktu. Karakteristik utamanya adalah adanya ketergantungan antarobservasi (autokorelasi), sehingga asumsi observasi saling bebas pada regresi klasik tidak terpenuhi. Komponen deret waktu umumnya terdiri dari tren, musiman, siklus, dan komponen tak beraturan. Analisis deret waktu bertujuan memahami struktur dinamis data, menjelaskan hubungan antarvariabel, serta meramalkan nilai masa depan (Box, Jenkins, Reinsel, & Ljung, 2015; Hamilton, 1994).
Konsep penting adalah stasioneritas. Deret \(\{y_t\}\) dikatakan stasioner lemah (weakly stationary) apabila:
\(E(y_t) = \mu\) konstan untuk semua \(t\),
\(\text{Var}(y_t) = \sigma^2\) konstan, dan
\(\text{Cov}(y_t, y_{t-k}) = \gamma_k\) hanya bergantung pada selisih waktu \(k\), bukan pada \(t\).
Proses acak murni (random walk) \(y_t = y_{t-1} + \varepsilon_t\) adalah contoh proses tidak stasioner karena variansnya bertambah menurut waktu (\(\text{Var}(y_t) = t\sigma^2\)). Alat bantu identifikasi awal adalah fungsi autokorelasi (ACF) dan autokorelasi parsial (PACF). Pada deret tidak stasioner, ACF turun sangat lambat.
ACF IHSG pada level dan pada selisih pertama log (ilustrasi)
Transformasi dilakukan agar data memenuhi asumsi model, terutama kestabilan ragam dan stasioneritas rata-rata.
a. Transformasi logaritma natural. Digunakan untuk menstabilkan ragam yang meningkat seiring tingkat nilai, serta memudahkan interpretasi koefisien sebagai elastisitas:
$$
Y_t^{*} = (Y_t)
$$
Transformasi ini hanya berlaku untuk nilai positif. Oleh karena itu IHSG, kurs, emas, dan WTI ditransformasi logaritma, sedangkan inflasi (yang dapat negatif dan sudah berupa persentase) dipakai pada levelnya. Perlu dicatat bahwa harga WTI pernah turun ke USD18,84 pada April 2020 (masih positif), sehingga log dapat diterapkan pada data ini.
b. Diferensiasi (differencing). Digunakan untuk menghilangkan tren stokastik (akar unit):
$$
Y_t = Y_t - Y_{t-1}, ^{d} Y_t = (^{d-1} Y_t)
$$
Diferensiasi pertama pada logaritma, \(\Delta \ln Y_t \approx\) laju pertumbuhan (return) kontinu.
c. Diferensiasi musiman \(\Delta_s Y_t = Y_t - Y_{t-s}\), dipakai bila terdapat pola musiman. Pada data bulanan ini polanya tidak menjadi fokus.
Ilustrasi transformasi pada IHSG: level, log, dan selisih pertama log
Regresi antara variabel yang tidak stasioner dapat menghasilkan hubungan lancung dengan \(R^2\) tinggi dan statistik \(t\) signifikan meskipun tidak ada hubungan sebenarnya (Granger & Newbold, 1974). Karena itu uji stasioneritas, khususnya uji akar unit, wajib dilakukan sebelum pemodelan.
a. Uji Augmented Dickey-Fuller (ADF) (Dickey & Fuller, 1979; Said & Dickey, 1984). Model regresi uji:
$$
y_t = + t + y_{t-1} + _{i=1}^{p} *i* y{t-i} + _t
$$
Hipotesis: \(H_0: \gamma = 0\) (terdapat akar unit, data tidak stasioner) melawan \(H_1: \gamma < 0\) (data stasioner). Statistik uji \(\tau = \hat{\gamma}/SE(\hat{\gamma})\) dibandingkan dengan nilai kritis Dickey-Fuller (bukan distribusi \(t\) biasa). Tolak \(H_0\) jika nilai \(p\) < \(\alpha\) (umumnya 0,05). Orde lag \(p\) dipilih dengan kriteria informasi (AIC/SIC).
b. Uji Phillips-Perron (PP) (Phillips & Perron, 1988) memakai koreksi nonparametrik atas autokorelasi dan heteroskedastisitas pada statistik uji sehingga tidak memerlukan penambahan lag selisih.
c. Uji KPSS (Kwiatkowski, Phillips, Schmidt, & Shin, 1992) memiliki hipotesis yang berlawanan: \(H_0\) data stasioner dan \(H_1\) terdapat akar unit. Penggunaan ADF/PP bersama KPSS memberikan konfirmasi yang lebih kuat.
Suatu deret dikatakan terintegrasi berorde \(d\), ditulis \(I(d)\), jika ia menjadi stasioner setelah didiferensiasi sebanyak \(d\) kali. Orde integrasi menentukan pendekatan pemodelan: ARDL dapat dipakai pada campuran I(0) dan I(1) (tetapi tidak untuk I(2)), sedangkan Johansen mensyaratkan variabel terintegrasi pada orde yang sama.
Berikut ilustrasi uji ADF dan KPSS pada data penelitian (hasil lengkap dibahas pada bab hasil).
| ADF_stat | ADF_p | KPSS_stat | KPSS_p | |
|---|---|---|---|---|
| ln IHSG | -3.253 | 0.083 | 1.326 | 0.01 |
| ln Kurs | -2.460 | 0.385 | 2.100 | 0.01 |
| ln Emas | -1.250 | 0.888 | 2.045 | 0.01 |
| ln WTI | -2.155 | 0.512 | 0.817 | 0.01 |
| Inflasi | -4.428 | 0.010 | 0.069 | 0.10 |
| D(ln IHSG) | -5.226 | 0.010 | 0.064 | 0.10 |
| D(ln Kurs) | -6.749 | 0.010 | 0.062 | 0.10 |
| D(ln Emas) | -4.639 | 0.010 | 0.267 | 0.10 |
| D(ln WTI) | -5.947 | 0.010 | 0.042 | 0.10 |
Dua atau lebih deret I(1) dikatakan berkointegrasi jika terdapat kombinasi linear yang stasioner, I(0) (Engle & Granger, 1987). Secara ekonomi, kointegrasi menandakan adanya hubungan keseimbangan jangka panjang meskipun masing-masing variabel menyimpang dalam jangka pendek.
a. Uji Engle-Granger (dua tahap). Tahap pertama mengestimasi regresi kointegrasi \(y_t = \beta_0 + \beta' x_t + u_t\) dengan OLS. Tahap kedua menguji akar unit pada residual \(\hat{u}_t\) dengan uji ADF (nilai kritis khusus Engle-Granger/MacKinnon). Residual stasioner mengindikasikan kointegrasi. Kelemahannya, uji ini hanya mampu mendeteksi satu vektor kointegrasi dan hasilnya bergantung pada pemilihan variabel dependen.
b. Uji Johansen (Johansen, 1988; Johansen & Juselius, 1990) berbasis VAR dan dapat mendeteksi beberapa vektor kointegrasi. Dengan VAR(\(p\)) yang direparameterisasi menjadi bentuk VECM:
$$
t = + _{i=1}^{p-1}i + + _t, = ’
$$
Banyaknya vektor kointegrasi \(r\) sama dengan rank matriks \(\boldsymbol{\Pi}\). Statistik uji yang digunakan adalah:
$$
*{trace}(r) = -T*^{k}(1-_i),
*{max}(r, r+1) = -T*(1-)
$$
Pengujian dilakukan berurutan mulai dari \(H_0: r = 0\). Hipotesis nol ditolak bila statistik uji melebihi nilai kritis. Pemilihan lag VAR dan spesifikasi deterministik (konstanta/tren) memengaruhi hasil sehingga harus ditetapkan terlebih dahulu.
c. Uji batas (bounds test) ARDL (Pesaran et al., 2001) dibahas pada subbab berikutnya.
ARDL adalah model regresi dinamis yang memuat lag variabel dependen dan lag variabel independen. Model ARDL(\(p, q_1, \ldots, q_k\)) ditulis:
$$
y_t = c + *{i=1}^{p}*i y{t-i} + ^{k}*{l=0}^{q_j}*, x_{j,t-l} + _t
$$
Keunggulan pendekatan ARDL (Pesaran & Shin, 1999; Pesaran et al., 2001) adalah:
dapat dipakai bila regresor berorde integrasi campuran I(0) dan I(1), selama tidak ada yang I(2),
cocok untuk sampel relatif kecil, dan
mengestimasi dinamika jangka pendek dan hubungan jangka panjang dalam satu persamaan, serta mengatasi masalah endogenitas lewat penambahan lag yang memadai.
Bentuk koreksi kesalahan (Unrestricted ECM) untuk uji batas:
$$
y_t = c + *0 y{t-1} + *{j=1}^{k}*j x{j,t-1} + ^{p-1}*i y{t-i} + *{j=1}^{k}^{q_j-1}*{j,l}\Delta x{j,t-l} + _t
$$
Uji batas menggunakan uji-\(F\) atas \(H_0: \delta_0 = \delta_1 = \cdots = \delta_k = 0\) (tidak ada hubungan jangka panjang) melawan \(H_1\): minimal satu \(\delta \neq 0\). Statistik \(F\) dibandingkan dengan dua batas kritis Pesaran et al. (2001): batas bawah (semua regresor I(0)) dan batas atas (semua regresor I(1)). Jika \(F\) > batas atas, terdapat kointegrasi; jika \(F\) < batas bawah, tidak ada; jika di antaranya, hasil tidak konklusif.
Jika kointegrasi terbukti, koefisien jangka panjang diperoleh dari:
$$
_j = -
$$
dan model koreksi kesalahan (ARDL-ECM) mengestimasi kecepatan penyesuaian:
$$
y_t = c + *i* y{t-i} + *{j,l}*x{j,t-l} + , ECT_{t-1} + _t
$$
dengan \(\lambda\) (koefisien error correction term) yang harus bernilai negatif dan signifikan, menunjukkan kecepatan kembali ke keseimbangan jangka panjang. Orde lag optimal dipilih dengan AIC atau SIC. Diagnostik residual meliputi uji autokorelasi Breusch-Godfrey, heteroskedastisitas Breusch-Pagan, normalitas Jarque-Bera, spesifikasi Ramsey RESET, serta kestabilan parameter CUSUM dan CUSUMSQ (Brown, Durbin, & Evans, 1975).
VAR. Sims (1980) mengusulkan VAR sebagai alternatif model persamaan simultan yang menuntut pembatasan identifikasi a priori. Semua variabel diperlakukan sebagai endogen, dan masing-masing dimodelkan sebagai fungsi lag seluruh variabel. Untuk vektor \(\mathbf{y}_t = (y_{1t}, \ldots, y_{kt})'\):
$$
_t = + 1 + + p + _t, _t (, _u)
$$
VAR dipakai pada data stasioner (level bila I(0), atau selisih pertama bila I(1) tanpa kointegrasi). Lag optimal dipilih berdasarkan AIC, HQ, SC, atau FPE. Model dinyatakan stabil jika seluruh akar karakteristik berada di dalam lingkaran satuan. Diagnostik residual mencakup uji autokorelasi (Portmanteau/LM), normalitas (Jarque-Bera multivariat), dan heteroskedastisitas (ARCH multivariat).
VECM. Jika variabel I(1) dan berkointegrasi, VAR pada selisih saja akan menghilangkan informasi jangka panjang. VECM menambahkan istilah koreksi kesalahan:
$$
t = ’ + _{i=1}^{p-1}i + + _t
$$
dengan \(\boldsymbol{\beta}\) matriks vektor kointegrasi (hubungan jangka panjang), \(\boldsymbol{\alpha}\) matriks kecepatan penyesuaian, dan \(\boldsymbol{\Gamma}_i\) koefisien dinamika jangka pendek. Elemen \(\alpha\) yang negatif dan signifikan pada persamaan variabel tertentu menunjukkan variabel tersebut menyesuaikan diri terhadap deviasi dari keseimbangan jangka panjang. Orde VECM adalah \(p-1\) di mana \(p\) adalah lag VAR dalam level.
Alur pemilihan model:
| Kondisi | Model |
|---|---|
| Seluruh variabel I(0) | VAR pada level |
| Variabel I(1), tidak berkointegrasi | VAR pada selisih pertama |
| Variabel I(1), berkointegrasi | VECM |
| Campuran I(0) dan I(1), tanpa I(2) | ARDL (uji batas) |
Granger (1969) mendefinisikan kausalitas dalam arti prediktif: \(X\) dikatakan menyebabkan (\(Granger\text{-}cause\)) \(Y\) jika nilai lampau \(X\) membantu memprediksi \(Y\) secara signifikan setelah memperhitungkan nilai lampau \(Y\). Pengujiannya memakai regresi:
$$
y_t = c + *{i=1}^{m}*i y{t-i} + ^{m}*i x*{t-i} + _t
$$
dengan \(H_0: \beta_1 = \beta_2 = \cdots = \beta_m = 0\) (X tidak menyebabkan Y menurut Granger), diuji dengan uji-\(F\) atau uji Wald. Hubungan bisa searah, dua arah (umpan balik), atau tidak ada. Uji ini harus dilakukan pada data stasioner dan sensitif terhadap pemilihan lag. Bila terdapat kointegrasi, kausalitas dapat diuji melalui VECM (kausalitas jangka pendek lewat uji Wald pada koefisien \(\Delta\) lag dan jangka panjang lewat signifikansi koefisien ECT). Sebagai alternatif ketika orde integrasi tidak pasti, prosedur Toda dan Yamamoto (1995) dapat digunakan. Perlu diingat, kausalitas Granger menunjukkan keterdahuluan temporal, bukan kausalitas struktural.
IRF menelusuri respons dinamis suatu variabel terhadap guncangan satu simpangan baku pada variabel lain, dengan semua variabel lain dijaga konstan. Berdasarkan representasi rata-rata bergerak vektor (VMA(\(\infty\))):
$$
t = + ^{}s,
$$
elemen \(\Psi_{ij,s}\) adalah respons variabel \(i\) pada \(s\) periode setelah guncangan variabel \(j\). Karena galat \(\mathbf{u}_t\) umumnya berkorelasi antarpersamaan, guncangan perlu diortogonalisasi, lazimnya memakai dekomposisi Cholesky \(\boldsymbol{\Sigma}_u = \mathbf{P}\mathbf{P}'\) sehingga \(\boldsymbol{\Theta}_s = \boldsymbol{\Psi}_s\mathbf{P}\) (IRF ortogonal). Hasilnya sensitif terhadap urutan variabel, sehingga urutan harus didasarkan pada pertimbangan teoretis, misalnya dari variabel yang paling eksogen (harga minyak dan emas dunia) ke yang paling endogen (IHSG). Alternatif yang tidak bergantung urutan adalah Generalized IRF (Pesaran & Shin, 1998). Interval kepercayaan biasanya diperoleh dengan bootstrap.
FEVD menguraikan ragam galat peramalan \(h\) periode ke depan suatu variabel menjadi proporsi yang disumbangkan oleh guncangan masing-masing variabel dalam sistem. Kontribusi guncangan variabel \(j\) terhadap ragam galat peramalan variabel \(i\) pada horizon \(h\):
$$
*{ij}(h) =* , ^{k}_{ij}(h) = 1
$$
Pada horizon pendek, hampir seluruh ragam galat biasanya berasal dari guncangan variabel itu sendiri, dan kontribusi variabel lain meningkat pada horizon lebih panjang. Hasil FEVD memberi gambaran kekuatan relatif tiap faktor dalam menjelaskan variasi IHSG dan, seperti IRF, bergantung pada urutan Cholesky.
Evaluasi model mencakup (a) pemilihan model, (b) diagnostik residual, dan (c) akurasi peramalan.
a. Kriteria informasi untuk memilih lag dan spesifikasi (nilai terkecil lebih baik):
$$
AIC = -2L + 2m, BIC = -2L + mT, HQ = -2L + 2m(T)
$$
dengan \(m\) banyaknya parameter dan \(T\) banyaknya observasi.
b. Diagnostik residual. Model yang baik memiliki residual yang bebas autokorelasi (Breusch-Godfrey/Ljung-Box/Portmanteau), homoskedastis (Breusch-Pagan/ARCH), berdistribusi normal (Jarque-Bera), dan parameternya stabil (CUSUM, akar karakteristik VAR di dalam lingkaran satuan).
Penelitian ini menggunakan pendekatan kuantitatif dengan metode analisis deret waktu (time series). Pendekatan kuantitatif digunakan karena data yang dianalisis berbentuk numerik dan diolah menggunakan metode statistik. Analisis deret waktu digunakan karena data memiliki urutan pengamatan berdasarkan periode waktu, yaitu bulanan.
Penelitian ini mengamati lima variabel, yaitu Indeks Harga Saham Gabungan (IHSG), harga emas futures, harga minyak mentah West Texas Intermediate (WTI) futures, kurs JISDOR, dan inflasi month-to-month (M-to-M). IHSG menjadi variabel yang pergerakannya diamati, sedangkan empat variabel lainnya digunakan untuk melihat keterkaitan faktor ekonomi global dan domestik dengan pergerakan IHSG.
Secara keseluruhan, penelitian diarahkan untuk memahami karakteristik data, mengidentifikasi pola pergerakan dan hubungan awal antarvariabel, menyiapkan data, kemudian melakukan pengujian dan pemodelan deret waktu (stasioneritas, kointegrasi, ARDL, VAR/VECM) beserta diagnostik dan analisis hubungan dinamisnya.
Data yang digunakan merupakan data sekunder kuantitatif berbentuk deret waktu bulanan. Periode pengamatan dimulai Januari 2017 sampai Agustus 2026, terdiri atas 116 observasi dan lima variabel penelitian. Pada dokumen ini data dimasukkan secara manual (diketik langsung sebagai vektor) sehingga dokumen dapat dijalankan tanpa file eksternal.
Sintaks.
# Data telah dimasukkan secara manual pada bagian awal dokumen.
# Bagian ini menampilkan contoh data yang digunakan dalam penelitian.
head(data)
tail(data)
Interpretasi. Data penelitian terdiri atas satu variabel periode dan lima variabel numerik. Periode digunakan sebagai penanda waktu pengamatan, sedangkan lima variabel numerik digunakan dalam proses analisis. Setiap baris merepresentasikan kondisi kelima variabel pada bulan yang sama sehingga urutan waktu antarpengamatan harus dipertahankan. Hal ini penting karena analisis deret waktu tidak hanya memperhatikan besar nilai, tetapi juga keterkaitan nilai suatu periode dengan periode sebelumnya. Enam baris pertama menunjukkan data dimulai pada Januari 2017 (IHSG 5.294,10; emas USD 1.211,4; WTI USD 52,81; kurs Rp13.343; inflasi 0,97 persen), sedangkan baris terakhir menunjukkan data berakhir pada Agustus 2026.
Variabel yang digunakan dalam penelitian ini terdiri atas IHSG, emas futures, minyak WTI futures, kurs JISDOR, dan inflasi M-to-M. Definisi operasional setiap variabel disajikan pada tabel berikut.
|:–|:–|:–|
IHSG digunakan sebagai variabel utama yang diamati, sedangkan emas futures, minyak WTI futures, kurs JISDOR, dan inflasi merupakan variabel lain yang dianalisis bersama IHSG. Penggunaan istilah variabel utama dan variabel lainnya tidak secara otomatis menunjukkan hubungan sebab-akibat.
Penelitian dilakukan secara bertahap dan saling berkaitan:
Pengumpulan dan pemasukan data bulanan ke dalam R.
Pemeriksaan struktur data, tipe variabel, jumlah observasi, dan kesesuaian periode.
Exploratory Data Analysis (EDA): statistik deskriptif, visualisasi deret waktu, dan analisis korelasi.
Pra-pemrosesan: pemeriksaan missing value, penyesuaian periode bulanan, transformasi logaritmik, dan diferensiasi.
Analisis deret waktu: uji stasioneritas, penentuan orde integrasi, uji kointegrasi, dan penentuan model.
Estimasi model (ARDL dan VAR/VECM).
Pengujian dan diagnostik model.
Analisis hubungan dinamis (Granger, IRF, FEVD) dan interpretasi hasil.
EDA dan pra-pemrosesan tidak dimaksudkan untuk menetapkan kesimpulan akhir mengenai pengaruh faktor ekonomi terhadap IHSG; keduanya merupakan fondasi bagi pengujian dan pemodelan pada tahap berikutnya.
EDA dilakukan untuk memperoleh gambaran awal mengenai karakteristik, pola pergerakan, penyebaran, dan hubungan antarvariabel. Analisis ini mencakup pemeriksaan struktur data, statistik deskriptif, grafik deret waktu, dan matriks korelasi. Hasil EDA bersifat eksploratif sehingga belum digunakan untuk menyatakan adanya pengaruh atau hubungan sebab-akibat.
Pemeriksaan struktur dilakukan untuk mengetahui jumlah observasi, jumlah variabel, tipe data, dan rentang periode pengamatan.
Sintaks.
# Struktur dan dimensi dataset
str(data)
## 'data.frame': 116 obs. of 6 variables:
## $ Periode : Date, format: "2017-01-01" "2017-02-01" ...
## $ IHSG : num 5294 5387 5568 5685 5738 ...
## $ Emas : num 1211 1254 1251 1268 1270 ...
## $ Minyak_WTI : num 52.8 54 50.6 49.3 48.3 ...
## $ Kurs_JISDOR: num 13343 13347 13321 13327 13321 ...
## $ Inflasi : num 0.97 0.23 -0.02 0.09 0.39 0.69 0.22 -0.07 0.13 0.01 ...
dim(data)
## [1] 116 6
# Nama variabel
names(data)
## [1] "Periode" "IHSG" "Emas" "Minyak_WTI" "Kurs_JISDOR"
## [6] "Inflasi"
# Ringkasan statistik awal
summary(data)
## Periode IHSG Emas Minyak_WTI
## Min. :2017-01-01 Min. :4539 Min. :1196 Min. : 18.84
## 1st Qu.:2019-05-24 1st Qu.:5982 1st Qu.:1397 1st Qu.: 54.92
## Median :2021-10-16 Median :6490 Median :1818 Median : 67.03
## Mean :2021-10-16 Mean :6496 Mean :2096 Mean : 66.86
## 3rd Qu.:2024-03-08 3rd Qu.:7052 3rd Qu.:2227 3rd Qu.: 77.00
## Max. :2026-08-01 Max. :8647 Max. :5248 Max. :114.67
## Kurs_JISDOR Inflasi
## Min. :13319 Min. :-0.7600
## 1st Qu.:14173 1st Qu.: 0.0375
## Median :14676 Median : 0.1950
## Mean :14994 Mean : 0.2347
## 3rd Qu.:15816 3rd Qu.: 0.3900
## Max. :18058 Max. : 1.6500
# Periode awal dan akhir
min(data$Periode, na.rm = TRUE)
## [1] "2017-01-01"
max(data$Periode, na.rm = TRUE)
## [1] "2026-08-01"
Interpretasi. Fungsi str() menunjukkan
kolom Periode bertipe tanggal (Date) dan
kelima variabel lainnya bertipe numerik, sehingga perhitungan statistik
dan pembentukan objek deret waktu dapat dilakukan. Fungsi
dim() menghasilkan 116 baris dan 6 kolom: 116 observasi
bulanan dan 6 kolom (1 penanda periode ditambah 5 variabel). Fungsi
summary() memberikan nilai minimum, kuartil, median,
rata-rata, dan maksimum setiap kolom. Nilai minimum dan maksimum kolom
periode adalah 1 Januari 2017 dan 1 Agustus 2026, sesuai dengan periode
penelitian. Apabila hasil pemeriksaan tidak sesuai dengan periode yang
direncanakan, data perlu ditinjau kembali sebelum analisis
dilanjutkan.
Statistik deskriptif digunakan untuk menggambarkan karakteristik masing-masing variabel melalui nilai minimum, maksimum, rata-rata, median, dan standar deviasi.
Sintaks.
statistik_deskriptif <- data %>%
summarise(
across(
c(IHSG, Emas, Minyak_WTI, Kurs_JISDOR, Inflasi),
list(
Minimum = ~ min(.x, na.rm = TRUE),
Maksimum = ~ max(.x, na.rm = TRUE),
Mean = ~ mean(.x, na.rm = TRUE),
Median = ~ median(.x, na.rm = TRUE),
Standar_Deviasi = ~ sd(.x, na.rm = TRUE)
),
.names = "{.col}_{.fn}"
)
) %>%
pivot_longer(
cols = everything(),
names_to = c("Variabel", "Ukuran"),
names_pattern = "(.+)_(Minimum|Maksimum|Mean|Median|Standar_Deviasi)",
values_to = "Nilai"
) %>%
pivot_wider(names_from = Ukuran, values_from = Nilai)
kable(
statistik_deskriptif,
digits = 3,
caption = "Statistik Deskriptif Variabel Penelitian"
)
| Variabel | Minimum | Maksimum | Mean | Median | Standar_Deviasi |
|---|---|---|---|---|---|
| IHSG | 4538.93 | 8646.94 | 6496.471 | 6489.685 | 802.625 |
| Emas | 1196.20 | 5247.90 | 2095.833 | 1817.650 | 954.614 |
| Minyak_WTI | 18.84 | 114.67 | 66.864 | 67.030 | 17.030 |
| Kurs_JISDOR | 13319.00 | 18058.00 | 14993.983 | 14675.500 | 1165.391 |
| Inflasi | -0.76 | 1.65 | 0.235 | 0.195 | 0.334 |
Interpretasi. Nilai minimum dan maksimum menunjukkan rentang setiap variabel, mean menunjukkan rata-rata, median menunjukkan nilai tengah, dan standar deviasi menunjukkan penyebaran data terhadap rata-ratanya.
IHSG berkisar dari 4.538,93 (Maret 2020, saat awal pandemi) sampai 8.646,94 (Desember 2025) dengan rata-rata 6.496,47 dan median 6.489,69. Rata-rata dan median yang hampir sama mengindikasikan distribusi yang relatif simetris.
Emas berkisar dari USD 1.196,2 (September 2018) sampai USD 5.247,9 (Februari 2026) dengan rata-rata 2.095,83 yang lebih besar daripada median 1.817,65. Selisih ini mengindikasikan kemencengan ke kanan karena sebagian nilai tinggi pada periode terakhir menarik rata-rata ke atas.
Minyak WTI berkisar dari USD 18,84 (April 2020) sampai USD 114,67 (Mei 2022) dengan rata-rata 66,86 dan median 67,03 yang hampir sama.
Kurs JISDOR berkisar dari Rp13.319 (Juni 2017) sampai Rp18.058 (Juli 2026) dengan rata-rata 14.993,98 dan median 14.675,50, yang menandakan tren pelemahan rupiah pada periode akhir.
Inflasi berkisar dari -0,76 persen (Januari 2025) sampai 1,65 persen (Maret 2025) dengan rata-rata 0,235 dan median 0,195. Nilai minimum yang negatif menunjukkan adanya deflasi bulanan.
Standar deviasi tidak dapat dibandingkan langsung antarvariabel karena satuannya berbeda. Secara relatif terhadap rata-ratanya, emas paling bervariasi (standar deviasi sekitar 46 persen dari rata-rata), diikuti WTI (sekitar 25 persen), IHSG (sekitar 12 persen), dan kurs (sekitar 8 persen). Standar deviasi yang besar menunjukkan fluktuasi yang lebih lebar, tetapi tidak dengan sendirinya menunjukkan bahwa variabel tersebut lebih berpengaruh terhadap IHSG. Bentuk distribusi dan keberadaan pencilan perlu diperiksa lebih lanjut.
Visualisasi deret waktu digunakan untuk mengamati pola pergerakan masing-masing variabel dari waktu ke waktu, termasuk kecenderungan tren dan fluktuasi.
Sintaks.
data_long <- data %>%
pivot_longer(
cols = c(IHSG, Emas, Minyak_WTI, Kurs_JISDOR, Inflasi),
names_to = "Variabel",
values_to = "Nilai"
)
ggplot(data_long, aes(x = Periode, y = Nilai)) +
geom_line(color = "steelblue", linewidth = 0.7) +
facet_wrap(~ Variabel, scales = "free_y", ncol = 2) +
labs(
title = "Perkembangan Variabel Penelitian",
x = "Periode",
y = "Nilai"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold")
)
Interpretasi. Grafik dibuat dengan
geom_line(), dan facet_wrap() memisahkan panel
setiap variabel dengan skala sumbu Y bebas karena satuan dan rentang
nilainya berbeda.
IHSG naik dari sekitar 5.300 pada awal 2017, jatuh tajam ke titik terendah pada Maret 2020, pulih dan bergerak naik hingga puncak Desember 2025, kemudian turun tajam sepanjang paruh pertama 2026 (5.643,19 pada Juni 2026) dan mulai pulih pada Juli–Agustus 2026.
Emas bergerak naik secara umum, dengan percepatan yang tajam sejak 2024 hingga puncak Februari 2026, lalu terkoreksi.
Minyak WTI turun sangat tajam pada awal 2020, naik hingga puncak Mei 2022, kemudian bergerak mendatar dengan lonjakan kembali pada Maret–April 2026.
Kurs JISDOR cenderung melemah dari sekitar Rp13.300 menjadi sekitar Rp18.000, dengan lonjakan sesaat pada Maret 2020.
Inflasi berfluktuasi di sekitar nol tanpa tren jangka panjang yang jelas, dengan lonjakan dan penurunan tajam pada awal 2025.
Beberapa variabel (IHSG, WTI, dan kurs) mengalami perubahan tajam pada waktu yang berdekatan, yaitu sekitar Maret–April 2020 dan paruh pertama 2026, sebagai indikasi awal adanya dinamika ekonomi yang terjadi bersamaan. Kesamaan waktu pergerakan belum membuktikan hubungan sebab-akibat. Kecenderungan naik atau turun jangka panjang (misalnya pada emas dan kurs) mengindikasikan kemungkinan adanya tren, dan lebar fluktuasi yang berubah sepanjang waktu mengindikasikan varians yang belum konstan. Keduanya perlu diperiksa melalui pengujian formal.
Analisis korelasi Pearson digunakan untuk melihat arah dan kekuatan hubungan linear antarvariabel. Nilai korelasi berada pada rentang -1 sampai 1.
Sintaks.
data_korelasi <- data %>%
dplyr::select(IHSG, Emas, Minyak_WTI, Kurs_JISDOR, Inflasi)
matriks_korelasi <- cor(
data_korelasi,
method = "pearson",
use = "pairwise.complete.obs"
)
kable(round(matriks_korelasi, 3), caption = "Matriks Korelasi Pearson")
| IHSG | Emas | Minyak_WTI | Kurs_JISDOR | Inflasi | |
|---|---|---|---|---|---|
| IHSG | 1.000 | 0.561 | 0.579 | 0.506 | 0.071 |
| Emas | 0.561 | 1.000 | 0.266 | 0.861 | -0.005 |
| Minyak_WTI | 0.579 | 0.266 | 1.000 | 0.351 | 0.111 |
| Kurs_JISDOR | 0.506 | 0.861 | 0.351 | 1.000 | -0.060 |
| Inflasi | 0.071 | -0.005 | 0.111 | -0.060 | 1.000 |
corrplot(
matriks_korelasi,
method = "color",
type = "upper",
addCoef.col = "black",
tl.col = "black",
tl.srt = 45,
number.cex = 0.7,
title = "Matriks Korelasi Antarvariabel",
mar = c(0, 0, 2, 0)
)
Interpretasi. Korelasi IHSG dengan WTI sebesar 0,579, dengan emas sebesar 0,561, dan dengan kurs sebesar 0,506; ketiganya positif dengan kekuatan sedang, artinya IHSG cenderung bergerak searah dengan ketiga variabel tersebut pada data level. Korelasi IHSG dengan inflasi hanya 0,071 sehingga hubungan liniernya sangat lemah. Antarvariabel penjelas, korelasi emas dengan kurs sangat tinggi (0,861), yang menunjukkan keduanya bergerak naik bersama dalam periode pengamatan. Korelasi lainnya lebih lemah: emas–WTI 0,266, WTI–kurs 0,351, dan inflasi dengan variabel lain berada di sekitar nol (-0,060 sampai 0,111).
Matriks korelasi ini bersifat deskriptif, tidak menguji signifikansi statistik, tidak menunjukkan arah pengaruh, dan tidak dapat digunakan untuk menyimpulkan sebab-akibat. Karena data berbentuk deret waktu, korelasi pada data level berpotensi tinggi akibat tren bersama (misalnya emas dan kurs), sehingga hasilnya perlu dibaca bersama hasil pemeriksaan stasioneritas dan analisis lanjutan.
Pra-pemrosesan dilakukan untuk memeriksa dan menyiapkan data agar memiliki struktur yang sesuai untuk analisis lanjutan, mencakup penanganan missing value, penyesuaian frekuensi dan periode, transformasi logaritmik, serta diferensiasi. Hasil pra-pemrosesan tidak dengan sendirinya membuktikan bahwa seluruh variabel telah stasioner; sifat tersebut ditentukan melalui pengujian formal pada subbab 3.7.
Missing value adalah kondisi ketika suatu nilai pengamatan tidak tersedia. Pemeriksaan dilakukan untuk mengetahui jumlah nilai kosong pada setiap variabel.
Sintaks.
# Jumlah dan persentase missing value setiap kolom
jumlah_missing <- colSums(is.na(data))
persentase_missing <- colMeans(is.na(data)) * 100
tabel_missing <- data.frame(
Variabel = names(jumlah_missing),
Jumlah_Missing = as.integer(jumlah_missing),
Persentase_Missing = as.numeric(persentase_missing)
)
kable(
tabel_missing,
digits = 2,
caption = "Pemeriksaan Missing Value"
)
| Variabel | Jumlah_Missing | Persentase_Missing |
|---|---|---|
| Periode | 0 | 0 |
| IHSG | 0 | 0 |
| Emas | 0 | 0 |
| Minyak_WTI | 0 | 0 |
| Kurs_JISDOR | 0 | 0 |
| Inflasi | 0 | 0 |
# Salinan data untuk pra-pemrosesan
data_bersih <- data
# Fungsi penanganan missing value (interpolasi linear + carry nearest)
isi_missing <- function(x) {
if (all(is.na(x))) {
return(x)
}
if (anyNA(x)) {
x <- zoo::na.approx(x, na.rm = FALSE)
x <- zoo::na.locf(x, na.rm = FALSE)
x <- zoo::na.locf(x, fromLast = TRUE, na.rm = FALSE)
}
return(x)
}
data_bersih <- data_bersih %>%
mutate(
across(
c(IHSG, Emas, Minyak_WTI, Kurs_JISDOR, Inflasi),
isi_missing
)
)
# Pemeriksaan ulang missing value
colSums(is.na(data_bersih))
## Periode IHSG Emas Minyak_WTI Kurs_JISDOR Inflasi
## 0 0 0 0 0 0
Interpretasi. Tabel pemeriksaan menunjukkan jumlah dan persentase missing value sebesar nol pada seluruh variabel. Dengan demikian tidak ada nilai yang perlu diinterpolasi dan seluruh observasi dapat dipertahankan. Pemeriksaan ulang setelah penanganan tetap menghasilkan nol pada setiap kolom. Jika hasil pemeriksaan ulang berbeda dari nol, berarti masih ada nilai kosong yang belum dapat diisi dan harus diperiksa sebelum transformasi dan diferensiasi. Interpolasi hanya merupakan metode pengisian nilai yang tidak tersedia, bukan pengganti pengamatan aktual; karena tidak ditemukan missing value, mempertahankan data asli merupakan pilihan yang tepat.
Data penelitian menggunakan frekuensi bulanan dengan periode Januari 2017 sampai Agustus 2026. Penyesuaian dilakukan untuk memastikan urutan bulan lengkap dan konsisten, kemudian data diubah menjadi objek deret waktu berfrekuensi 12.
Sintaks.
# Mengurutkan data berdasarkan periode
data_bersih <- data_bersih %>%
arrange(Periode)
# Membentuk urutan periode bulanan yang lengkap
periode_lengkap <- seq(
from = min(data_bersih$Periode),
to = max(data_bersih$Periode),
by = "month"
)
# Memastikan setiap bulan tercantum dalam dataset
data_bersih <- data_bersih %>%
complete(Periode = periode_lengkap) %>%
arrange(Periode)
# Memeriksa jumlah observasi, periode, dan nilai kosong
nrow(data_bersih)
## [1] 116
range(data_bersih$Periode)
## [1] "2017-01-01" "2026-08-01"
colSums(is.na(data_bersih))
## Periode IHSG Emas Minyak_WTI Kurs_JISDOR Inflasi
## 0 0 0 0 0 0
ts_data <- ts(
data_bersih %>%
dplyr::select(IHSG, Emas, Minyak_WTI, Kurs_JISDOR, Inflasi),
start = c(2017, 1),
frequency = 12
)
# Informasi objek time series
start(ts_data)
## [1] 2017 1
end(ts_data)
## [1] 2026 8
frequency(ts_data)
## [1] 12
Interpretasi. Jumlah baris setelah
complete() tetap 116 dan rentang periode tetap 1 Januari
2017 sampai 1 Agustus 2026, serta tidak ada nilai kosong, sehingga tidak
ada bulan yang hilang dan tidak dilakukan agregasi atau perubahan
frekuensi. Keluaran start() yaitu 2017 bulan ke-1 dan
end() yaitu 2026 bulan ke-8 menunjukkan objek deret waktu
dimulai Januari 2017 dan berakhir Agustus 2026, sedangkan
frequency() bernilai 12 yang menandakan satu siklus tahunan
terdiri atas 12 pengamatan bulanan. Data dapat dilanjutkan ke tahap
berikutnya karena urutan bulan lengkap dan seluruh nilai numeriknya
tersedia.
Transformasi logaritmik dilakukan untuk mengurangi pengaruh perbedaan skala dan membantu menstabilkan varians data, menggunakan logaritma natural:
[
Z_t = (X_t)
]
dengan \(Z_t\) nilai setelah transformasi dan \(X_t\) nilai pengamatan awal. Transformasi diterapkan pada IHSG, emas, WTI, dan kurs karena bernilai positif. Inflasi tidak ditransformasi karena dapat bernilai nol atau negatif.
Sintaks.
data_log <- data_bersih %>%
mutate(
log_IHSG = log(IHSG),
log_Emas = log(Emas),
log_Minyak_WTI = log(Minyak_WTI),
log_Kurs_JISDOR = log(Kurs_JISDOR)
)
# Menampilkan hasil transformasi
head(
data_log %>%
dplyr::select(Periode, log_IHSG, log_Emas, log_Minyak_WTI, log_Kurs_JISDOR, Inflasi)
)
data_log_long <- data_log %>%
dplyr::select(Periode, log_IHSG, log_Emas, log_Minyak_WTI, log_Kurs_JISDOR) %>%
pivot_longer(
cols = -Periode,
names_to = "Variabel",
values_to = "Nilai"
)
ggplot(data_log_long, aes(x = Periode, y = Nilai)) +
geom_line(color = "darkgreen", linewidth = 0.7) +
facet_wrap(~ Variabel, scales = "free_y", ncol = 2) +
labs(
title = "Data Setelah Transformasi Logaritmik",
x = "Periode",
y = "Nilai Logaritmik"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold")
)
Interpretasi. Pada observasi pertama, nilai logaritmik IHSG sebesar 8,5743, emas 7,0995, WTI 3,9667, dan kurs 9,4987, sedangkan inflasi tetap pada skala aslinya (0,97). Selama periode pengamatan, rentang log IHSG adalah 8,420–9,065, log emas 7,087–8,566, log WTI 2,936–4,742, dan log kurs 9,497–9,801. Nilai hasil transformasi merupakan logaritma natural dari nilai asli sehingga tidak lagi dibaca sebagai poin, USD per troy ounce, USD per barel, atau rupiah per dolar.
Pada grafik, bentuk pola tidak berubah drastis (tren dan guncangan 2020 masih terlihat), tetapi skala fluktuasi pada level yang tinggi menjadi lebih terkendali. Pola tren yang masih tampak menunjukkan bahwa transformasi logaritmik saja belum menghilangkan tren. Inflasi tidak dilogaritmakan karena nilainya dapat nol atau negatif (terdapat 26 bulan inflasi negatif), sedangkan logaritma natural hanya terdefinisi untuk nilai positif. Oleh sebab itu, keempat variabel hasil transformasi tidak boleh dibandingkan langsung dengan inflasi dalam hal satuan maupun besarnya nilai.
Diferensiasi adalah proses menghitung selisih antara nilai periode sekarang dan periode sebelumnya. Diferensiasi pertama dirumuskan sebagai:
[
Z_t = Z_t - Z_{t-1}
]
Diferensiasi dilakukan untuk mengurangi tren dan membantu data mencapai kestasioneran pada rata-rata. Diferensiasi pertama diterapkan pada variabel hasil transformasi logaritmik (IHSG, emas, WTI, kurs), sedangkan inflasi didiferensiasi menggunakan nilai aslinya.
Sintaks.
data_diff <- data_log %>%
mutate(
d_IHSG = c(NA, diff(log_IHSG)),
d_Emas = c(NA, diff(log_Emas)),
d_Minyak_WTI = c(NA, diff(log_Minyak_WTI)),
d_Kurs_JISDOR = c(NA, diff(log_Kurs_JISDOR)),
d_Inflasi = c(NA, diff(Inflasi))
)
# Menampilkan hasil diferensiasi
head(
data_diff %>%
dplyr::select(Periode, d_IHSG, d_Emas, d_Minyak_WTI, d_Kurs_JISDOR, d_Inflasi)
)
data_diff_long <- data_diff %>%
dplyr::select(Periode, d_IHSG, d_Emas, d_Minyak_WTI, d_Kurs_JISDOR, d_Inflasi) %>%
pivot_longer(
cols = -Periode,
names_to = "Variabel",
values_to = "Nilai"
) %>%
filter(!is.na(Nilai))
ggplot(data_diff_long, aes(x = Periode, y = Nilai)) +
geom_line(color = "firebrick", linewidth = 0.7) +
facet_wrap(~ Variabel, scales = "free_y", ncol = 2) +
labs(
title = "Data Setelah Diferensiasi Pertama",
x = "Periode",
y = "Nilai Diferensiasi"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold")
)
Interpretasi. Pengamatan pertama bernilai
NA karena tidak memiliki periode sebelumnya, sehingga dari
116 observasi diperoleh 115 observasi diferensiasi. NA ini
merupakan konsekuensi perhitungan, bukan data awal yang hilang. Untuk
empat variabel logaritmik, hasil diferensiasi dibaca sebagai perubahan
relatif bulanan yang mendekati persentase perubahan (misalnya 0,0173
pada IHSG bulan Februari 2017 berarti naik sekitar 1,7 persen),
sedangkan d_Inflasi dibaca dalam poin persentase. Nilai
positif berarti kenaikan dibandingkan bulan sebelumnya, nilai negatif
berarti penurunan, dan nilai mendekati nol berarti perubahan kecil.
Pada grafik, seluruh variabel berfluktuasi di sekitar nol dan tren jangka panjang tidak lagi tampak. Perubahan terbesar terjadi pada Maret–Mei 2020: IHSG turun sekitar 18,3 persen (Maret 2020), WTI turun sekitar 78,2 persen (Maret 2020) lalu naik sekitar 63,3 persen (Mei 2020), dan kurs naik sekitar 14,0 persen (Maret 2020). Pada inflasi, perubahan terbesar terjadi pada Maret 2025 (+2,13 poin) dan Mei 2025 (-1,54 poin). Amplitudo yang masih besar pada periode-periode tersebut menunjukkan bahwa varians belum sepenuhnya konstan. Diferensiasi pertama belum dapat dijadikan bukti stasioneritas; kepastiannya ditentukan melalui uji ADF, PP, dan KPSS pada subbab 3.7.1.
Tahap terakhir menampilkan data hasil transformasi dan diferensiasi serta memeriksa jumlah observasi dan nilai kosong.
Sintaks.
hasil_akhir <- data_diff %>%
dplyr::select(Periode, d_IHSG, d_Emas, d_Minyak_WTI, d_Kurs_JISDOR, d_Inflasi)
# Data hasil pra-pemrosesan
head(hasil_akhir)
# Dimensi data
dim(hasil_akhir)
## [1] 116 6
# Ringkasan data
summary(hasil_akhir)
## Periode d_IHSG d_Emas
## Min. :2017-01-01 Min. :-0.183420 Min. :-0.12866
## 1st Qu.:2019-05-24 1st Qu.:-0.012210 1st Qu.:-0.01609
## Median :2021-10-16 Median : 0.006104 Median : 0.01314
## Mean :2021-10-16 Mean : 0.001818 Mean : 0.01138
## 3rd Qu.:2024-03-08 3rd Qu.: 0.026803 3rd Qu.: 0.03833
## Max. :2026-08-01 Max. : 0.099910 Max. : 0.10072
## NA's :1 NA's :1
## d_Minyak_WTI d_Kurs_JISDOR d_Inflasi
## Min. :-0.781866 Min. :-0.076805 Min. :-1.540000
## 1st Qu.:-0.059401 1st Qu.:-0.005550 1st Qu.:-0.240000
## Median : 0.015012 Median : 0.001048 Median : 0.030000
## Mean : 0.004216 Mean : 0.002480 Mean :-0.006609
## 3rd Qu.: 0.064801 3rd Qu.: 0.012943 3rd Qu.: 0.200000
## Max. : 0.633269 Max. : 0.139634 Max. : 2.130000
## NA's :1 NA's :1 NA's :1
# Jumlah missing value setelah differencing
colSums(is.na(hasil_akhir))
## Periode d_IHSG d_Emas d_Minyak_WTI d_Kurs_JISDOR
## 0 1 1 1 1
## d_Inflasi
## 1
# Jumlah observasi valid setiap variabel hasil differencing
sapply(hasil_akhir[-1], function(x) sum(!is.na(x)))
## d_IHSG d_Emas d_Minyak_WTI d_Kurs_JISDOR d_Inflasi
## 115 115 115 115 115
Interpretasi. Dimensi data akhir adalah 116 baris dan 6 kolom (periode dan lima variabel hasil diferensiasi). Setiap variabel memiliki tepat satu nilai kosong (pengamatan pertama) dan 115 observasi valid, sesuai harapan untuk 116 bulan berurutan tanpa nilai kosong pada data awal. Ringkasan statistik menggambarkan perubahan bulanan, bukan lagi level IHSG, harga komoditas, kurs, maupun inflasi: rata-rata perubahan log bulanan IHSG sekitar 0,0018 (standar deviasi 0,0444), emas 0,0114 (0,0420), WTI 0,0042 (0,1348), dan kurs 0,0025 (0,0226), sedangkan rata-rata perubahan inflasi sekitar -0,0066 poin (standar deviasi 0,4414). WTI memiliki fluktuasi perubahan terbesar. Data ini belum dapat dinyatakan stasioner hanya berdasarkan grafik atau jumlah observasi valid, sehingga pengujian formal dilakukan pada subbab berikutnya.
Analisis deret waktu disusun secara berurutan dan bersifat keputusan bertahap. Hasil uji stasioneritas menentukan orde integrasi, orde integrasi menentukan perlu tidaknya uji kointegrasi, dan keduanya menentukan jenis model akhir. Urutan ini penting karena meregresikan deret yang tidak stasioner secara langsung berisiko menghasilkan regresi lancung (spurious regression).
Variabel IHSG, emas, WTI, dan kurs ditransformasi ke logaritma natural untuk menstabilkan varians serta agar koefisien dapat dibaca sebagai elastisitas. Inflasi tidak dilogaritmakan karena bernilai nol dan negatif pada beberapa bulan (deflasi). Data yang digunakan adalah data yang sama dengan yang telah dimasukkan secara manual pada subbab 3.2.
Sintaks.
options(digits = 4, scipen = 999)
# Fungsi pembantu: jalankan uji, bila gagal tampilkan pesan (dokumen tidak berhenti)
coba <- function(expr) {
tryCatch(expr, error = function(e)
cat(" (uji dilewati karena error:", conditionMessage(e), ")\n"))
}
# Data untuk pemodelan (diambil dari objek `data` yang sudah diinput manual)
df <- data.frame(
Periode = data$Periode,
IHSG = data$IHSG,
EMAS = data$Emas,
WTI = data$Minyak_WTI,
KURS = data$Kurs_JISDOR,
INF = data$Inflasi
)
cat("Jumlah observasi:", nrow(df), "| periode:",
format(min(df$Periode), "%b %Y"), "-", format(max(df$Periode), "%b %Y"), "\n")
## Jumlah observasi: 116 | periode: Jan 2017 - Aug 2026
stopifnot(!anyNA(df))
# Transformasi logaritma natural
df$LIHSG <- log(df$IHSG)
df$LEMAS <- log(df$EMAS)
df$LWTI <- log(df$WTI)
df$LKURS <- log(df$KURS)
vars_lvl <- c("LIHSG", "LEMAS", "LWTI", "LKURS", "INF")
ts_all <- ts(df[, vars_lvl], start = c(2017, 1), frequency = 12)
summary(df[, c("IHSG", "EMAS", "WTI", "KURS", "INF")])
## IHSG EMAS WTI KURS
## Min. :4539 Min. :1196 Min. : 18.8 Min. :13319
## 1st Qu.:5982 1st Qu.:1397 1st Qu.: 54.9 1st Qu.:14173
## Median :6490 Median :1818 Median : 67.0 Median :14676
## Mean :6496 Mean :2096 Mean : 66.9 Mean :14994
## 3rd Qu.:7052 3rd Qu.:2227 3rd Qu.: 77.0 3rd Qu.:15816
## Max. :8647 Max. :5248 Max. :114.7 Max. :18058
## INF
## Min. :-0.7600
## 1st Qu.: 0.0375
## Median : 0.1950
## Mean : 0.2347
## 3rd Qu.: 0.3900
## Max. : 1.6500
plot(ts_all, main = "Plot Deret Waktu (level, log)", xlab = "Tahun")
Interpretasi. Data terdiri atas 116 observasi bulanan dari Januari 2017 sampai Agustus 2026. Ringkasan statistik menunjukkan rata-rata IHSG sebesar 6.496 poin dengan rentang 4.539 sampai 8.647, harga emas rata-rata USD 2.096 per troy ounce dengan rentang yang sangat lebar (1.196 sampai 5.248), harga minyak WTI rata-rata USD 66,9 per barel (minimum 18,8 pada masa pandemi), kurs rata-rata Rp14.994 per dolar AS, dan inflasi bulanan rata-rata 0,23 persen dengan nilai minimum negatif sebesar -0,76 persen. Nilai negatif pada inflasi inilah yang menjadi alasan variabel tersebut tidak dilogaritmakan.
Plot deret waktu memperlihatkan bahwa LEMAS dan LKURS cenderung bertren naik, LIHSG naik dalam jangka panjang dengan guncangan besar pada 2020 dan 2026, LWTI berfluktuasi tajam di sekitar tahun 2020 dan 2022, dan INF bergerak di sekitar nol tanpa tren yang jelas. Pola-pola ini memberi indikasi awal bahwa sebagian besar variabel tidak stasioner di level, yang selanjutnya dibuktikan secara formal.
Suatu deret dikatakan stasioner apabila rata-rata, varians, dan autokovariansnya konstan terhadap waktu. Pengujian memakai tiga uji yang saling melengkapi. Uji Augmented Dickey-Fuller (ADF) memiliki hipotesis H0: terdapat akar unit (tidak stasioner) melawan H1: stasioner, dengan jumlah lag dipilih otomatis berdasarkan AIC. Uji Phillips-Perron (PP) memiliki hipotesis yang sama tetapi mengoreksi autokorelasi dan heteroskedastisitas secara nonparametrik. Uji KPSS memiliki arah hipotesis yang berlawanan (H0: stasioner) sehingga dipakai sebagai konfirmasi. Pada level digunakan spesifikasi intercept dan tren karena data tampak bertren, sedangkan pada selisih pertama cukup intercept. Keputusan ADF dan PP: stasioner apabila statistik uji lebih negatif daripada nilai kritis 5 persen; pada KPSS stasioner apabila statistik uji tidak melebihi nilai kritis.
Sintaks.
uji_adf <- function(x, nama, tingkat, tipe) {
m <- ur.df(x, type = tipe, selectlags = "AIC", lags = 12)
tn <- c(none = "tau1", drift = "tau2", trend = "tau3")[[tipe]]
stat <- m@teststat[1, tn]
cv5 <- m@cval[tn, "5pct"]
lagp <- length(grep("z.diff.lag", rownames(m@testreg$coefficients)))
data.frame(Variabel = nama, Tingkat = tingkat, Spesifikasi = tipe, Lag = lagp,
Statistik = round(stat, 4), CV_5persen = cv5,
Keputusan = ifelse(stat < cv5, "Stasioner", "Tidak stasioner"))
}
uji_pp <- function(x, nama, tingkat, model) {
m <- ur.pp(x, type = "Z-tau", model = model, lags = "short")
stat <- as.numeric(m@teststat)
cv5 <- m@cval[1, "5pct"]
data.frame(Variabel = nama, Tingkat = tingkat, Spesifikasi = model,
Statistik = round(stat, 4), CV_5persen = cv5,
Keputusan = ifelse(stat < cv5, "Stasioner", "Tidak stasioner"))
}
uji_kpss <- function(x, nama, tingkat, tipe) {
m <- ur.kpss(x, type = tipe, lags = "short")
stat <- as.numeric(m@teststat)
cv5 <- m@cval[1, "5pct"]
data.frame(Variabel = nama, Tingkat = tingkat, Spesifikasi = tipe,
Statistik = round(stat, 4), CV_5persen = cv5,
Keputusan = ifelse(stat > cv5, "Tidak stasioner", "Stasioner"))
}
d1 <- diff(ts_all) # selisih pertama
hasil_adf <- rbind(
do.call(rbind, lapply(vars_lvl, function(v) uji_adf(ts_all[, v], v, "Level", "trend"))),
do.call(rbind, lapply(vars_lvl, function(v) uji_adf(d1[, v], v, "Diff-1", "drift")))
)
hasil_pp <- rbind(
do.call(rbind, lapply(vars_lvl, function(v) uji_pp(ts_all[, v], v, "Level", "trend"))),
do.call(rbind, lapply(vars_lvl, function(v) uji_pp(d1[, v], v, "Diff-1", "constant")))
)
hasil_kpss <- rbind(
do.call(rbind, lapply(vars_lvl, function(v) uji_kpss(ts_all[, v], v, "Level", "tau"))),
do.call(rbind, lapply(vars_lvl, function(v) uji_kpss(d1[, v], v, "Diff-1", "mu")))
)
# Pelengkap: p-value ADF (tseries) pada level dan diff-1
p_adf <- data.frame(
Variabel = vars_lvl,
p_Level = sapply(vars_lvl, function(v) adf.test(ts_all[, v])$p.value),
p_Diff1 = sapply(vars_lvl, function(v) adf.test(d1[, v])$p.value)
)
kable(hasil_adf, row.names = FALSE, caption = "Uji ADF")
| Variabel | Tingkat | Spesifikasi | Lag | Statistik | CV_5persen | Keputusan |
|---|---|---|---|---|---|---|
| LIHSG | Level | trend | 2 | -3.408 | -3.43 | Tidak stasioner |
| LEMAS | Level | trend | 1 | -1.483 | -3.43 | Tidak stasioner |
| LWTI | Level | trend | 2 | -2.539 | -3.43 | Tidak stasioner |
| LKURS | Level | trend | 1 | -3.522 | -3.43 | Stasioner |
| INF | Level | trend | 2 | -5.741 | -3.43 | Stasioner |
| LIHSG | Diff-1 | drift | 1 | -6.075 | -2.88 | Stasioner |
| LEMAS | Diff-1 | drift | 1 | -6.910 | -2.88 | Stasioner |
| LWTI | Diff-1 | drift | 3 | -6.834 | -2.88 | Stasioner |
| LKURS | Diff-1 | drift | 2 | -7.689 | -2.88 | Stasioner |
| INF | Diff-1 | drift | 10 | -5.632 | -2.88 | Stasioner |
kable(hasil_pp, row.names = FALSE, caption = "Uji Phillips-Perron")
| Variabel | Tingkat | Spesifikasi | Statistik | CV_5persen | Keputusan |
|---|---|---|---|---|---|
| LIHSG | Level | trend | -2.885 | -3.449 | Tidak stasioner |
| LEMAS | Level | trend | -1.267 | -3.449 | Tidak stasioner |
| LWTI | Level | trend | -2.897 | -3.449 | Tidak stasioner |
| LKURS | Level | trend | -3.676 | -3.449 | Stasioner |
| INF | Level | trend | -9.617 | -3.449 | Stasioner |
| LIHSG | Diff-1 | constant | -9.189 | -2.887 | Stasioner |
| LEMAS | Diff-1 | constant | -9.886 | -2.887 | Stasioner |
| LWTI | Diff-1 | constant | -9.443 | -2.887 | Stasioner |
| LKURS | Diff-1 | constant | -11.694 | -2.887 | Stasioner |
| INF | Diff-1 | constant | -20.273 | -2.887 | Stasioner |
kable(hasil_kpss, row.names = FALSE, caption = "Uji KPSS")
| Variabel | Tingkat | Spesifikasi | Statistik | CV_5persen | Keputusan |
|---|---|---|---|---|---|
| LIHSG | Level | tau | 0.1263 | 0.146 | Stasioner |
| LEMAS | Level | tau | 0.3545 | 0.146 | Tidak stasioner |
| LWTI | Level | tau | 0.1460 | 0.146 | Stasioner |
| LKURS | Level | tau | 0.2817 | 0.146 | Tidak stasioner |
| INF | Level | tau | 0.0595 | 0.146 | Stasioner |
| LIHSG | Diff-1 | mu | 0.0637 | 0.463 | Stasioner |
| LEMAS | Diff-1 | mu | 0.2669 | 0.463 | Stasioner |
| LWTI | Diff-1 | mu | 0.0424 | 0.463 | Stasioner |
| LKURS | Diff-1 | mu | 0.0625 | 0.463 | Stasioner |
| INF | Diff-1 | mu | 0.0535 | 0.463 | Stasioner |
kable(p_adf, row.names = FALSE, digits = 4, caption = "p-value ADF (tseries::adf.test)")
| Variabel | p_Level | p_Diff1 |
|---|---|---|
| LIHSG | 0.0825 | 0.01 |
| LEMAS | 0.8881 | 0.01 |
| LWTI | 0.5124 | 0.01 |
| LKURS | 0.3855 | 0.01 |
| INF | 0.0100 | 0.01 |
Interpretasi. Pada uji ADF level, nilai kritis 5 persen sebesar -3,43. LIHSG (-3,408), LEMAS (-1,483), dan LWTI (-2,539) tidak lebih negatif daripada nilai kritis sehingga H0 tidak ditolak, artinya ketiganya tidak stasioner di level; LIHSG berada sangat dekat dengan batas penolakan. LKURS (-3,522) dan INF (-5,741) menolak H0 sehingga tampak stasioner pada spesifikasi dengan tren. Pada selisih pertama, seluruh variabel menolak H0 dengan statistik antara -5,63 sampai -7,69 (nilai kritis -2,88), sehingga semuanya stasioner setelah satu kali diferensiasi.
Uji PP memberi pola yang sama: LIHSG (-2,885), LEMAS (-1,267), dan LWTI (-2,897) tidak stasioner di level terhadap nilai kritis -3,449, sedangkan LKURS (-3,676) dan INF (-9,617) stasioner, dan semua variabel stasioner pada selisih pertama. Uji KPSS pada level menolak kestasioneran untuk LEMAS (0,3545) dan LKURS (0,2817) karena melebihi nilai kritis 0,146, sedangkan LIHSG (0,1263), LWTI (0,1460), dan INF (0,0595) tidak menolak; LWTI tepat berada di batas. Pada selisih pertama KPSS tidak menolak kestasioneran untuk semua variabel (statistik jauh di bawah 0,463).
p-value ADF dari paket tseries mendukung temuan ini: p-value level LIHSG (0,083), LEMAS (0,888), LWTI (0,512), dan LKURS (0,385) lebih besar daripada 0,05 sehingga H0 tidak ditolak, sedangkan INF (0,01) dan seluruh selisih pertama (0,01) menolak H0. Nilai 0,01 adalah batas bawah tabel (p-value sebenarnya lebih kecil). Secara ringkas, LEMAS jelas tidak stasioner di level, LIHSG dan LWTI tidak stasioner menurut ADF dan PP (KPSS berada di batas), LKURS menunjukkan hasil yang bertentangan antaruji yang diselesaikan pada subbab berikut, dan INF stasioner di level pada ketiga uji.
Orde integrasi adalah banyaknya selisih yang diperlukan agar suatu
deret menjadi stasioner. Fungsi ndiffs menjalankan
diferensiasi berulang otomatis untuk ADF, PP, dan KPSS dengan batas
maksimum dua kali. Karena LKURS menunjukkan hasil yang tidak seragam,
dilakukan pemeriksaan tambahan tanpa tren (spesifikasi drift
dan constant), sebab pada spesifikasi bertren uji dapat menolak
akar unit semata-mata akibat tren deterministik yang ikut
dimodelkan.
Sintaks.
orde <- data.frame(
Variabel = vars_lvl,
ADF = sapply(vars_lvl, function(v) ndiffs(ts_all[, v], alpha = 0.05, test = "adf", type = "trend", max.d = 2)),
PP = sapply(vars_lvl, function(v) ndiffs(ts_all[, v], alpha = 0.05, test = "pp", type = "trend", max.d = 2)),
KPSS = sapply(vars_lvl, function(v) ndiffs(ts_all[, v], alpha = 0.05, test = "kpss", type = "trend", max.d = 2))
)
orde$Kesimpulan <- paste0("I(", orde$ADF, ")")
rownames(orde) <- NULL
kable(orde, caption = "Orde Integrasi")
| Variabel | ADF | PP | KPSS | Kesimpulan |
|---|---|---|---|---|
| LIHSG | 1 | 1 | 1 | I(1) |
| LEMAS | 1 | 1 | 1 | I(1) |
| LWTI | 1 | 1 | 1 | I(1) |
| LKURS | 0 | 0 | 1 | I(0) |
| INF | 0 | 0 | 0 | I(0) |
# Pemeriksaan tambahan LKURS tanpa tren
kable(rbind(
uji_adf(ts_all[, "LKURS"], "LKURS", "Level", "drift"),
data.frame(uji_pp(ts_all[, "LKURS"], "LKURS", "Level", "constant"), Lag = NA)[, c(1:3, 7, 4:6)]
), row.names = FALSE, caption = "Pemeriksaan tambahan LKURS tanpa tren (ADF drift dan PP constant)")
| Variabel | Tingkat | Spesifikasi | Lag | Statistik | CV_5persen | Keputusan |
|---|---|---|---|---|---|---|
| LKURS | Level | drift | 3 | -0.5813 | -2.880 | Tidak stasioner |
| LKURS | Level | constant | NA | -0.7652 | -2.886 | Tidak stasioner |
# Penetapan himpunan variabel
VAR_I1 <- c("LIHSG", "LEMAS", "LWTI", "LKURS") # terintegrasi orde 1
VAR_I0 <- c("INF") # stasioner di level
cat("\nVariabel I(1):", VAR_I1, "\nVariabel I(0):", VAR_I0, "\n")
##
## Variabel I(1): LIHSG LEMAS LWTI LKURS
## Variabel I(0): INF
Interpretasi. Angka pada kolom ADF, PP, dan KPSS menyatakan banyaknya diferensiasi yang dibutuhkan. LIHSG, LEMAS, dan LWTI bernilai 1 pada ketiga uji sehingga dikategorikan I(1), dan INF bernilai 0 pada ketiganya sehingga I(0). LKURS bernilai 0 pada ADF dan PP tetapi 1 pada KPSS, sehingga ketiga uji tidak sepakat. Pemeriksaan tanpa tren menyelesaikan keraguan ini: ADF level dengan drift menghasilkan statistik -0,5813 (nilai kritis -2,88) dan PP dengan constant menghasilkan -0,7652 (nilai kritis -2,887), keduanya tidak menolak akar unit. Dengan demikian kesan stasioner pada spesifikasi bertren hanya disebabkan oleh tren deterministik, KPSS tetap menolak kestasioneran, dan secara teori kurs lazim diperlakukan sebagai I(1). LKURS ditetapkan sebagai I(1).
Hasil akhirnya, himpunan variabel I(1) adalah LIHSG, LEMAS, LWTI, dan LKURS, sedangkan INF adalah I(0). Orde integrasi yang campuran ini menjadi dasar penggunaan ARDL, karena metode Johansen secara teori hanya sah untuk variabel yang seluruhnya I(1); inflasi karenanya dikeluarkan dari sistem VECM tetapi tetap diikutkan pada ARDL dan uji Toda-Yamamoto.
Kointegrasi berarti beberapa deret yang masing-masing tidak stasioner
memiliki kombinasi linear yang stasioner, sehingga terdapat hubungan
keseimbangan jangka panjang. Dua pendekatan dipakai. Pertama, uji
Johansen pada variabel I(1) (LIHSG, LEMAS, LWTI, LKURS)
yang menguji rank matriks \(\Pi\)
dengan statistik trace (H0: rank \(\le r\)) dan maximum eigenvalue
(H0: rank \(= r\)), dimulai dari \(r = 0\) dan berhenti pada kegagalan menolak
H0 yang pertama. Kedua, ARDL Bounds Test (Pesaran,
Shin, dan Smith, 2001) yang boleh dipakai pada campuran I(0) dan I(1),
dengan H0 tidak ada hubungan jangka panjang. Lag VAR level dipilih
dengan kriteria SC (minimal 2 karena ca.jo mensyaratkan
\(K \ge 2\)), dan lag ARDL dipilih
otomatis dengan BIC.
Sintaks.
Y4 <- ts_all[, VAR_I1]
pilih_lag <- VARselect(Y4, lag.max = 8, type = "const")
cat("===== Pemilihan lag VAR (level) =====\n"); print(pilih_lag$selection)
## ===== Pemilihan lag VAR (level) =====
## AIC(n) HQ(n) SC(n) FPE(n)
## 2 1 1 2
K <- max(2L, as.integer(pilih_lag$selection["SC(n)"]))
cat("Lag K (VAR level) yang dipakai:", K, " -> lag selisih VECM =", K - 1, "\n")
## Lag K (VAR level) yang dipakai: 2 -> lag selisih VECM = 1
jo_tr <- ca.jo(Y4, type = "trace", ecdet = "const", K = K, spec = "transitory")
jo_ei <- ca.jo(Y4, type = "eigen", ecdet = "const", K = K, spec = "transitory")
summary(jo_tr)
##
## ######################
## # Johansen-Procedure #
## ######################
##
## Test type: trace statistic , without linear trend and constant in cointegration
##
## Eigenvalues (lambda):
## [1] 0.3114262008533750792 0.1947969505129204526 0.0659098348371753434
## [4] 0.0402402355698875946 -0.0000000000000003763
##
## Values of teststatistic and critical values of test:
##
## test 10pct 5pct 1pct
## r <= 3 | 4.68 7.52 9.24 12.97
## r <= 2 | 12.46 17.85 19.96 24.60
## r <= 1 | 37.15 32.00 34.91 41.07
## r = 0 | 79.69 49.65 53.12 60.16
##
## Eigenvectors, normalised to first column:
## (These are the cointegration relations)
##
## LIHSG.l1 LEMAS.l1 LWTI.l1 LKURS.l1 constant
## LIHSG.l1 1.0000 1.00000 1.00000 1.0000 1.0000
## LEMAS.l1 -0.2784 1.00640 0.04994 -0.5680 -0.6123
## LWTI.l1 -0.5224 0.01438 -0.32979 0.2626 -0.3440
## LKURS.l1 1.7233 -6.10972 -0.67594 1.9557 -0.2776
## constant -20.9934 42.40024 -1.37992 -24.3584 -0.0220
##
## Weights W:
## (This is the loading matrix)
##
## LIHSG.l1 LEMAS.l1 LWTI.l1 LKURS.l1 constant
## LIHSG.d 0.03402 -0.032235 -0.060825 -0.02642 0.000000000000022811
## LEMAS.d 0.16224 -0.017253 -0.032291 0.01952 -0.000000000000032059
## LWTI.d 0.29608 0.009218 0.059549 -0.12476 -0.000000000000054055
## LKURS.d -0.01578 0.034780 -0.004481 0.01027 0.000000000000004539
summary(jo_ei)
##
## ######################
## # Johansen-Procedure #
## ######################
##
## Test type: maximal eigenvalue statistic (lambda max) , without linear trend and constant in cointegration
##
## Eigenvalues (lambda):
## [1] 0.3114262008533750792 0.1947969505129204526 0.0659098348371753434
## [4] 0.0402402355698875946 -0.0000000000000003763
##
## Values of teststatistic and critical values of test:
##
## test 10pct 5pct 1pct
## r <= 3 | 4.68 7.52 9.24 12.97
## r <= 2 | 7.77 13.75 15.67 20.20
## r <= 1 | 24.70 19.77 22.00 26.81
## r = 0 | 42.54 25.56 28.14 33.24
##
## Eigenvectors, normalised to first column:
## (These are the cointegration relations)
##
## LIHSG.l1 LEMAS.l1 LWTI.l1 LKURS.l1 constant
## LIHSG.l1 1.0000 1.00000 1.00000 1.0000 1.0000
## LEMAS.l1 -0.2784 1.00640 0.04994 -0.5680 -0.6123
## LWTI.l1 -0.5224 0.01438 -0.32979 0.2626 -0.3440
## LKURS.l1 1.7233 -6.10972 -0.67594 1.9557 -0.2776
## constant -20.9934 42.40024 -1.37992 -24.3584 -0.0220
##
## Weights W:
## (This is the loading matrix)
##
## LIHSG.l1 LEMAS.l1 LWTI.l1 LKURS.l1 constant
## LIHSG.d 0.03402 -0.032235 -0.060825 -0.02642 0.000000000000022811
## LEMAS.d 0.16224 -0.017253 -0.032291 0.01952 -0.000000000000032059
## LWTI.d 0.29608 0.009218 0.059549 -0.12476 -0.000000000000054055
## LKURS.d -0.01578 0.034780 -0.004481 0.01027 0.000000000000004539
tabel_rank <- function(jo, nama_stat) {
tb <- data.frame(H0 = rownames(jo@cval), Stat = jo@teststat,
CV5 = jo@cval[, "5pct"], row.names = NULL)
tb <- tb[nrow(tb):1, ] # urutan r = 0, r <= 1, ...
tb$Keputusan <- ifelse(tb$Stat > tb$CV5, "Tolak H0", "Gagal tolak H0")
names(tb)[2] <- nama_stat
tb
}
tb_tr <- tabel_rank(jo_tr, "Trace")
tb_ei <- tabel_rank(jo_ei, "MaxEigen")
kable(tb_tr, row.names = FALSE, digits = 3, caption = "Ringkasan Rank Johansen (Trace)")
| H0 | Trace | CV5 | Keputusan |
|---|---|---|---|
| r = 0 | | 79.691 | 53.12 | Tolak H0 |
| r <= 1 | | 37.154 | 34.91 | Tolak H0 |
| r <= 2 | | 12.455 | 19.96 | Gagal tolak H0 |
| r <= 3 | | 4.682 | 9.24 | Gagal tolak H0 |
kable(tb_ei, row.names = FALSE, digits = 3, caption = "Ringkasan Rank Johansen (Maximum Eigenvalue)")
| H0 | MaxEigen | CV5 | Keputusan |
|---|---|---|---|
| r = 0 | | 42.537 | 28.14 | Tolak H0 |
| r <= 1 | | 24.699 | 22.00 | Tolak H0 |
| r <= 2 | | 7.773 | 15.67 | Gagal tolak H0 |
| r <= 3 | | 4.682 | 9.24 | Gagal tolak H0 |
# jumlah penolakan berturut-turut mulai dari r = 0 = rank kointegrasi
r_trace <- sum(cumsum(tb_tr$Keputusan != "Tolak H0") == 0)
r_eigen <- sum(cumsum(tb_ei$Keputusan != "Tolak H0") == 0)
cat("Rank kointegrasi: Trace =", r_trace, "| MaxEigen =", r_eigen, "\n")
## Rank kointegrasi: Trace = 2 | MaxEigen = 2
r <- r_trace
cat("Rank (r) yang dipakai:", r, "\n")
## Rank (r) yang dipakai: 2
Interpretasi Johansen. Kriteria pemilihan lag
menghasilkan AIC = 2, HQ = 1, SC = 1, dan FPE = 2. Dipilih lag
berdasarkan SC (satu) namun dinaikkan menjadi \(K = 2\) karena persyaratan minimum
ca.jo, sehingga VECM memiliki satu lag selisih. Pada uji
trace, statistik untuk \(r =
0\) sebesar 79,69 melebihi nilai kritis 5 persen (53,12) sehingga
H0 ditolak; untuk \(r \le 1\) sebesar
37,15 juga melebihi 34,91 sehingga ditolak (dengan selisih yang tipis);
untuk \(r \le 2\) sebesar 12,46 lebih
kecil daripada 19,96 sehingga H0 tidak ditolak dan prosedur berhenti.
Uji maximum eigenvalue memberi kesimpulan yang sama: 42,54 >
28,14 dan 24,70 > 22,00 ditolak, sedangkan 7,77 < 15,67 tidak
ditolak. Kedua uji sepakat bahwa terdapat dua vektor
kointegrasi (\(r = 2\)) pada
sistem empat variabel I(1), artinya ada dua hubungan keseimbangan jangka
panjang. Karena penolakan pada \(r \le
1\) relatif tipis, rank ini dikonfirmasi kembali melalui uji
stabilitas pada subbab 3.9.4.
Sintaks.
formula_ardl <- LIHSG ~ LEMAS + LWTI + LKURS + INF
sel_ardl <- auto_ardl(formula_ardl, data = ts_all,
max_order = c(4, 4, 4, 4, 4), selection = "BIC")
kable(head(sel_ardl$top_orders, 5), digits = 1,
caption = "Lima kandidat orde ARDL terbaik (BIC)")
| LIHSG | LEMAS | LWTI | LKURS | INF | BIC |
|---|---|---|---|---|---|
| 1 | 1 | 0 | 1 | 0 | -407.1 |
| 1 | 1 | 0 | 1 | 1 | -405.0 |
| 1 | 1 | 1 | 1 | 1 | -402.9 |
| 1 | 2 | 0 | 1 | 0 | -401.4 |
| 2 | 2 | 0 | 1 | 0 | -400.1 |
orde_ardl <- sel_ardl$best_order
mod_ardl <- sel_ardl$best_model
cat("Orde ARDL terpilih (LIHSG, LEMAS, LWTI, LKURS, INF):", orde_ardl, "\n")
## Orde ARDL terpilih (LIHSG, LEMAS, LWTI, LKURS, INF): 1 1 0 1 0
# Case 3 = intercept tak terbatas, tanpa tren
bt_f <- bounds_f_test(mod_ardl, case = 3)
bt_t <- bounds_t_test(mod_ardl, case = 3)
cat("\n===== Bounds F-test =====\n"); print(bt_f); print(bt_f$tab)
##
## ===== Bounds F-test =====
##
## Bounds F-test (Wald) for no cointegration
##
## data: d(LIHSG) ~ L(LIHSG, 1) + L(LEMAS, 1) + LWTI + L(LKURS, 1) + INF + d(LEMAS) + d(LKURS)
## F = 3.2, p-value = 0.2
## alternative hypothesis: Possible cointegration
## null values:
## k T
## 4 1000
## statistic p.value
## F 3.194 0.1547
cat("\n===== Bounds t-test =====\n"); print(bt_t)
##
## ===== Bounds t-test =====
##
## Bounds t-test for no cointegration
##
## data: d(LIHSG) ~ L(LIHSG, 1) + L(LEMAS, 1) + LWTI + L(LKURS, 1) + INF + d(LEMAS) + d(LKURS)
## t = -3.3, p-value = 0.2
## alternative hypothesis: Possible cointegration
## null values:
## k T
## 4 1000
Interpretasi ARDL Bounds Test. Orde ARDL terbaik menurut BIC (-407,1) adalah ARDL(1,1,0,1,0), yang berarti LIHSG memakai satu lag, LEMAS satu lag, LWTI tanpa lag (hanya efek bersamaan), LKURS satu lag, dan INF tanpa lag. Statistik uji F bounds sebesar 3,194 dengan p-value 0,155, dan statistik uji t bounds sebesar -3,3 dengan p-value 0,2. Karena p-value jauh di atas 0,05, H0 tidak adanya hubungan jangka panjang tidak ditolak, sehingga ARDL tidak menemukan kointegrasi. Hasil ini bertentangan dengan Johansen. Perbedaannya dapat dijelaskan oleh asumsi masing-masing metode: ARDL satu persamaan mengasumsikan variabel bebas weakly exogenous terhadap parameter jangka panjang, sedangkan hasil VECM pada subbab 3.8.2 menunjukkan bahwa penyesuaian terhadap vektor kointegrasi pertama justru terjadi pada LEMAS dan LWTI, bukan pada LIHSG. Penjelasan ini masih berupa dugaan yang dapat dibuktikan lebih lanjut dengan uji weak exogeneity. Akibat konflik ini, VECM diposisikan sebagai model utama hubungan jangka panjang, sedangkan ARDL dipakai untuk dinamika jangka pendek.
Pemilihan model mengikuti kaidah berikut: semua variabel I(0) memakai VAR level; semua I(1) dan tidak terkointegrasi memakai VAR pada selisih pertama; semua I(1) dan terkointegrasi memakai VECM; dan campuran I(0) dan I(1) memakai ARDL.
Sintaks.
cat("Variabel I(0):", ifelse(length(VAR_I0) > 0, paste(VAR_I0, collapse = ", "), "-"), "\n")
## Variabel I(0): INF
cat("Variabel I(1):", ifelse(length(VAR_I1) > 0, paste(VAR_I1, collapse = ", "), "-"), "\n")
## Variabel I(1): LIHSG, LEMAS, LWTI, LKURS
if (length(VAR_I0) > 0 && length(VAR_I1) > 0) {
cat("-> Orde integrasi CAMPURAN: ARDL (bounds test) layak sebagai model utama.\n")
}
## -> Orde integrasi CAMPURAN: ARDL (bounds test) layak sebagai model utama.
if (length(VAR_I1) >= 2) {
if (r == 0) {
cat("-> Johansen: TIDAK ada kointegrasi -> gunakan VAR pada selisih pertama.\n")
} else if (r < length(VAR_I1)) {
cat("-> Johansen: ada", r, "vektor kointegrasi -> gunakan VECM (rank =", r, ").\n")
} else {
cat("-> Rank penuh: seluruh variabel stasioner -> gunakan VAR pada level.\n")
}
}
## -> Johansen: ada 2 vektor kointegrasi -> gunakan VECM (rank = 2 ).
stopifnot(r >= 1)
Interpretasi. Keluaran menegaskan bahwa orde integrasi bersifat campuran (INF I(0), empat variabel lain I(1)) sehingga ARDL secara metodologis layak dipakai, dan bahwa Johansen menemukan dua vektor kointegrasi sehingga VECM dengan rank dua diterapkan pada empat variabel I(1). Pernyataan “ARDL layak sebagai model utama” pada keluaran hanya berdasarkan orde integrasi; karena bounds test pada subbab 3.7.3 tidak signifikan, ARDL ditempatkan sebagai model pelengkap jangka pendek dan VECM sebagai model hubungan jangka panjang.
Model ARDL(1,1,0,1,0) diestimasi dengan OLS pada bentuk level (UECM). Dari model ini diturunkan koefisien jangka panjang (long-run multipliers) dan model koreksi kesalahan terbatas (ECM) yang memuat koefisien error correction term (ECT).
Sintaks.
summary(mod_ardl)
##
## Time series regression with "ts" data:
## Start = 2017(2), End = 2026(8)
##
## Call:
## dynlm::dynlm(formula = full_formula, data = data, start = start,
## end = end)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.10593 -0.01949 -0.00039 0.02137 0.08985
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.93306 0.87479 2.21 0.02925 *
## L(LIHSG, 1) 0.85965 0.04237 20.29 < 0.0000000000000002 ***
## LEMAS 0.30548 0.08647 3.53 0.00061 ***
## L(LEMAS, 1) -0.28454 0.08497 -3.35 0.00112 **
## LWTI 0.05359 0.01623 3.30 0.00130 **
## LKURS -0.91333 0.15893 -5.75 0.000000087 ***
## L(LKURS, 1) 0.80057 0.16369 4.89 0.000003560 ***
## INF 0.00293 0.01028 0.29 0.77594
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.0355 on 107 degrees of freedom
## Multiple R-squared: 0.924, Adjusted R-squared: 0.919
## F-statistic: 185 on 7 and 107 DF, p-value: <0.0000000000000002
# Koefisien jangka panjang (long-run multipliers)
lr_ardl <- multipliers(mod_ardl, type = "lr")
kable(lr_ardl, digits = 4, caption = "Koefisien Jangka Panjang ARDL")
| Term | Estimate | Std. Error | t value | Pr(>|t|) |
|---|---|---|---|---|
| (Intercept) | 13.7729 | 6.1367 | 2.2444 | 0.0269 |
| LEMAS | 0.1492 | 0.1363 | 1.0945 | 0.2762 |
| LWTI | 0.3818 | 0.0989 | 3.8611 | 0.0002 |
| LKURS | -0.8034 | 0.7360 | -1.0915 | 0.2775 |
| INF | 0.0209 | 0.0732 | 0.2854 | 0.7759 |
# Model koreksi kesalahan (ECM) terbatas
mod_recm <- recm(mod_ardl, case = 3)
summary(mod_recm)
##
## Time series regression with "zooreg" data:
## Start = Feb 2017, End = Aug 2026
##
## Call:
## dynlm::dynlm(formula = full_formula, data = data, start = start,
## end = end)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.10593 -0.01949 -0.00039 0.02137 0.08985
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.9331 0.4744 4.07 0.000086741 ***
## d(LEMAS) 0.3055 0.0839 3.64 0.00041 ***
## d(LKURS) -0.9133 0.1479 -6.18 0.000000011 ***
## ect -0.1404 0.0345 -4.07 0.000088150 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.0348 on 111 degrees of freedom
## (0 observations deleted due to missingness)
## Multiple R-squared: 0.402, Adjusted R-squared: 0.385
## F-statistic: 24.8 on 3 and 111 DF, p-value: 0.00000000000229
Interpretasi. Model memiliki \(R^2\) sebesar 0,924 dan \(R^2\) terkoreksi 0,919 dengan uji F yang sangat signifikan, artinya model secara keseluruhan menjelaskan sebagian besar variasi LIHSG; namun \(R^2\) yang tinggi pada bentuk level sebagian besar berasal dari lag LIHSG sendiri (koefisien 0,860). Koefisien LEMAS bersamaan (0,305) positif dan signifikan sedangkan lag LEMAS (-0,285) negatif dan signifikan, sehingga efek bersih emas pada level hampir saling meniadakan. Koefisien LKURS bersamaan (-0,913) negatif sedangkan lag-nya (0,801) positif, keduanya signifikan, sehingga pelemahan rupiah menekan IHSG pada bulan yang sama. LWTI (0,054) signifikan positif, dan INF (0,003; p = 0,776) tidak signifikan.
Koefisien jangka panjang menunjukkan hanya LWTI yang signifikan (0,382; p = 0,0002): kenaikan harga minyak 1 persen berasosiasi dengan kenaikan IHSG sekitar 0,38 persen. LEMAS (0,149; p = 0,276), LKURS (-0,803; p = 0,278), dan INF (0,021; p = 0,776) tidak signifikan, terutama karena galat baku jangka panjang yang besar. Model ECM menunjukkan bentuk jangka pendek yang lebih ringkas: kenaikan emas 1 persen menaikkan IHSG sekitar 0,31 persen pada bulan yang sama (p = 0,0004), depresiasi rupiah 1 persen menurunkan IHSG sekitar 0,91 persen (p < 0,001), dan koefisien ECT sebesar -0,1404 bertanda negatif serta signifikan. Namun, karena bounds test tidak menolak H0 (subbab 3.7.3), koefisien ECT ini tidak boleh ditafsirkan sebagai kecepatan koreksi menuju keseimbangan jangka panjang; keabsahan ECT mensyaratkan adanya kointegrasi.
Karena ditemukan dua vektor kointegrasi, VECM diestimasi dengan
prosedur Johansen (cajorls). Matriks \(\beta\) memuat vektor kointegrasi, dan
koefisien error correction pada setiap persamaan menunjukkan
kecepatan penyesuaian. Dengan \(r =
2\), vektor pertama dinormalisasi pada LIHSG dan vektor kedua
pada LEMAS.
Sintaks.
vecm_ls <- cajorls(jo_tr, r = r)
cat("===== VECM: vektor kointegrasi (beta) =====\n")
## ===== VECM: vektor kointegrasi (beta) =====
print(vecm_ls$beta)
## ect1 ect2
## LIHSG.l1 1.00000000000000000000 0.0000
## LEMAS.l1 0.00000000000000002776 1.0000
## LWTI.l1 -0.40603854416083501322 0.4177
## LKURS.l1 0.02585947382167508302 -6.0966
## constant -7.25558914242352948065 49.3400
cat("\n----- Koefisien jangka pendek & ECT per persamaan -----\n")
##
## ----- Koefisien jangka pendek & ECT per persamaan -----
ringkas_vecm <- summary(vecm_ls$rlm)
for (i in seq_along(ringkas_vecm)) {
cat("\n>>", names(ringkas_vecm)[i], "\n")
print(round(ringkas_vecm[[i]]$coefficients, 4))
}
##
## >> Response LIHSG.d
## Estimate Std. Error t value Pr(>|t|)
## ect1 0.0018 0.0380 0.0471 0.9625
## ect2 -0.0419 0.0189 -2.2166 0.0287
## LIHSG.dl1 0.2183 0.1139 1.9174 0.0578
## LEMAS.dl1 -0.1923 0.1108 -1.7354 0.0855
## LWTI.dl1 -0.0211 0.0359 -0.5860 0.5591
## LKURS.dl1 -0.1838 0.2163 -0.8499 0.3973
##
## >> Response LEMAS.d
## Estimate Std. Error t value Pr(>|t|)
## ect1 0.1450 0.0342 4.2335 0.0000
## ect2 -0.0625 0.0171 -3.6665 0.0004
## LIHSG.dl1 0.1224 0.1027 1.1915 0.2361
## LEMAS.dl1 -0.0850 0.1000 -0.8498 0.3973
## LWTI.dl1 0.0656 0.0324 2.0238 0.0455
## LKURS.dl1 0.1240 0.1951 0.6358 0.5262
##
## >> Response LWTI.d
## Estimate Std. Error t value Pr(>|t|)
## ect1 0.3053 0.1124 2.7151 0.0077
## ect2 -0.0732 0.0560 -1.3065 0.1942
## LIHSG.dl1 -0.0699 0.3372 -0.2074 0.8361
## LEMAS.dl1 -0.4240 0.3282 -1.2918 0.1992
## LWTI.dl1 0.0913 0.1064 0.8577 0.3930
## LKURS.dl1 -1.8394 0.6404 -2.8721 0.0049
##
## >> Response LKURS.d
## Estimate Std. Error t value Pr(>|t|)
## ect1 0.0190 0.0182 1.0459 0.2979
## ect2 0.0394 0.0090 4.3539 0.0000
## LIHSG.dl1 -0.0835 0.0545 -1.5329 0.1282
## LEMAS.dl1 -0.0911 0.0530 -1.7171 0.0888
## LWTI.dl1 0.0074 0.0172 0.4285 0.6692
## LKURS.dl1 -0.0220 0.1035 -0.2123 0.8323
# Representasi VAR level dari VECM (dipakai untuk diagnostik, Granger, IRF, FEVD)
vec_est <- vec2var(jo_tr, r = r)
Interpretasi vektor kointegrasi. Vektor pertama dapat ditulis sebagai ECT1 = LIHSG - 0,406 LWTI + 0,026 LKURS - 7,256, yang berarti dalam keseimbangan jangka panjang LIHSG = 0,406 LWTI - 0,026 LKURS + 7,256. Dengan kata lain, hubungan jangka panjang IHSG terutama dikaitkan dengan harga minyak (elastisitas positif sekitar 0,41), sedangkan pengaruh kurs hampir nol. Nilai tersebut searah dengan koefisien jangka panjang ARDL untuk LWTI (0,38). Koefisien LEMAS pada vektor ini bernilai nol karena normalisasi by construction ketika \(r = 2\) (matriks identitas pada dua variabel pertama), sehingga nol tersebut bukan bukti bahwa emas tidak berpengaruh. Vektor kedua, ECT2 = LEMAS + 0,418 LWTI - 6,097 LKURS + 49,34, tidak memuat LIHSG dan merupakan hubungan keseimbangan antarvariabel penjelas (emas, minyak, dan kurs).
Interpretasi koefisien penyesuaian. Pada persamaan LIHSG, ECT1 tidak signifikan (0,0018; p = 0,9625) sedangkan ECT2 negatif dan signifikan (-0,0419; p = 0,0287). Artinya IHSG tidak menyesuaikan diri terhadap hubungan jangka panjang pertama, tetapi merespons penyimpangan dari hubungan kedua. Pada persamaan LEMAS kedua ECT signifikan (ECT1 = 0,1450 dengan p < 0,001; ECT2 = -0,0625 dengan p = 0,0004), pada persamaan LWTI hanya ECT1 yang signifikan (0,3053; p = 0,0077), dan pada persamaan LKURS hanya ECT2 yang signifikan (0,0394; p < 0,001). Dengan demikian penyesuaian terhadap hubungan pertama dilakukan oleh LEMAS dan LWTI, bukan oleh LIHSG. Pada koefisien jangka pendek, LIHSG dipengaruhi lag-nya sendiri secara marginal (0,2183; p = 0,058) dan lag LEMAS secara marginal negatif (-0,1923; p = 0,086), sementara pengaruh lag LWTI dan LKURS tidak signifikan; pada persamaan LWTI, lag LKURS berpengaruh negatif signifikan (-1,8394; p = 0,0049).
Pada ARDL, signifikansi diuji dengan uji t (H0: koefisien = 0; tolak bila p-value < 0,05). Karena data deret waktu rentan terhadap autokorelasi dan heteroskedastisitas sisa, ditambahkan galat baku robust Newey-West (HAC) sebagai pembanding. Pada VECM, signifikansi dibaca dari t-value dan p-value setiap koefisien, dengan perhatian khusus pada ECT persamaan LIHSG.
Sintaks.
cat("===== Signifikansi parameter ARDL (OLS) =====\n")
## ===== Signifikansi parameter ARDL (OLS) =====
print(coeftest(mod_ardl))
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.93306 0.87479 2.21 0.02925 *
## L(LIHSG, 1) 0.85965 0.04237 20.29 < 0.0000000000000002 ***
## LEMAS 0.30548 0.08647 3.53 0.00061 ***
## L(LEMAS, 1) -0.28454 0.08497 -3.35 0.00112 **
## LWTI 0.05359 0.01623 3.30 0.00130 **
## LKURS -0.91333 0.15893 -5.75 0.000000087 ***
## L(LKURS, 1) 0.80057 0.16369 4.89 0.000003560 ***
## INF 0.00293 0.01028 0.29 0.77594
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
cat("\n----- ARDL dengan galat baku HAC Newey-West -----\n")
##
## ----- ARDL dengan galat baku HAC Newey-West -----
coba(print(coeftest(mod_ardl, vcov. = NeweyWest(mod_ardl, lag = 4, prewhite = FALSE))))
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.93306 0.60385 3.20 0.0018 **
## L(LIHSG, 1) 0.85965 0.04199 20.48 < 0.0000000000000002 ***
## LEMAS 0.30548 0.12180 2.51 0.0136 *
## L(LEMAS, 1) -0.28454 0.13356 -2.13 0.0354 *
## LWTI 0.05359 0.01784 3.00 0.0033 **
## LKURS -0.91333 0.11447 -7.98 0.0000000000018 ***
## L(LKURS, 1) 0.80057 0.12133 6.60 0.0000000016378 ***
## INF 0.00293 0.00975 0.30 0.7641
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# VECM: ECT pada persamaan LIHSG
idx_ihsg <- grep("LIHSG", names(ringkas_vecm))[1]
cat("\nECT pada persamaan LIHSG:\n")
##
## ECT pada persamaan LIHSG:
print(round(ringkas_vecm[[idx_ihsg]]$coefficients[grep("^ect",
rownames(ringkas_vecm[[idx_ihsg]]$coefficients)), , drop = FALSE], 4))
## Estimate Std. Error t value Pr(>|t|)
## ect1 0.0018 0.0380 0.0471 0.9625
## ect2 -0.0419 0.0189 -2.2166 0.0287
Interpretasi. Pada uji t biasa, kecuali INF (p = 0,776), seluruh koefisien ARDL signifikan pada taraf 5 persen, bahkan L(LIHSG), LKURS, dan L(LKURS) signifikan pada taraf 0,1 persen. Dengan galat baku HAC Newey-West kesimpulan tidak berubah: LEMAS (p = 0,0136), L(LEMAS) (p = 0,0354), LWTI (p = 0,0033), LKURS, dan L(LKURS) tetap signifikan, sedangkan INF tetap tidak signifikan (p = 0,764). Konsistensi kedua versi menunjukkan bahwa signifikansi koefisien tidak bergantung pada asumsi homoskedastisitas dan bebas autokorelasi, sehingga kesimpulan tentang parameter cukup kokoh. Pada VECM, ECT persamaan LIHSG hanya ECT2 yang signifikan (-0,0419; p = 0,0287), sedangkan ECT1 tidak signifikan (p = 0,9625).
Residual yang baik tidak berautokorelasi. Pada ARDL digunakan uji Breusch-Godfrey (orde 12) dan Ljung-Box (lag 12); pada VECM digunakan uji Portmanteau yang disesuaikan dan Breusch-Godfrey multivariat. Hipotesisnya H0: tidak ada autokorelasi, dan model dianggap baik bila p-value > 0,05.
Sintaks.
res_a <- as.numeric(residuals(mod_ardl))
cat("[ARDL] Breusch-Godfrey LM (orde 12):\n"); coba(print(bgtest(mod_ardl, order = 12)))
## [ARDL] Breusch-Godfrey LM (orde 12):
##
## Breusch-Godfrey test for serial correlation of order up to 12
##
## data: mod_ardl
## LM test = 23, df = 12, p-value = 0.03
cat("\n[ARDL] Ljung-Box (lag 12):\n"); print(Box.test(res_a, lag = 12, type = "Ljung-Box"))
##
## [ARDL] Ljung-Box (lag 12):
##
## Box-Ljung test
##
## data: res_a
## X-squared = 22, df = 12, p-value = 0.03
cat("\n[VECM] Portmanteau (adjusted, lag 12):\n")
##
## [VECM] Portmanteau (adjusted, lag 12):
coba(print(serial.test(vec_est, lags.pt = 12, type = "PT.adjusted")))
##
## Portmanteau Test (adjusted)
##
## data: Residuals of VAR object vec_est
## Chi-squared = 167, df = 164, p-value = 0.4
## $serial
##
## Portmanteau Test (adjusted)
##
## data: Residuals of VAR object vec_est
## Chi-squared = 167, df = 164, p-value = 0.4
cat("\n[VECM] Breusch-Godfrey LM (lag 6):\n")
##
## [VECM] Breusch-Godfrey LM (lag 6):
coba(print(serial.test(vec_est, lags.bg = 6, type = "BG")))
##
## Breusch-Godfrey LM test
##
## data: Residuals of VAR object vec_est
## Chi-squared = 94, df = 96, p-value = 0.5
## $serial
##
## Breusch-Godfrey LM test
##
## data: Residuals of VAR object vec_est
## Chi-squared = 94, df = 96, p-value = 0.5
Interpretasi. Pada ARDL, uji Breusch-Godfrey (LM = 23; p = 0,03) dan Ljung-Box (p = 0,03) sama-sama menolak H0, sehingga terdapat autokorelasi pada residual. Dampaknya, galat baku OLS dapat bias, yang telah dikompensasi dengan galat baku HAC pada subbab 3.9.1. Sebaliknya, VECM lolos uji: Portmanteau (statistik 167 dengan derajat bebas 164; p = 0,4) dan Breusch-Godfrey (statistik 94 dengan derajat bebas 96; p = 0,5) tidak menolak H0, sehingga residual VECM bebas autokorelasi. Hasil ini menjadi salah satu alasan VECM lebih layak sebagai model utama.
Pada ARDL digunakan uji Breusch-Pagan, uji White (regresi kuadrat residual pada nilai fitted dan kuadratnya), dan ARCH-LM yang dilihat melalui uji Ljung-Box residual kuadrat; pada VECM digunakan ARCH-LM multivariat. Hipotesisnya H0: varians galat konstan (homoskedastis). Sebagai pelengkap dijalankan uji normalitas Jarque-Bera, normalitas multivariat pada VECM, dan Ramsey RESET.
Sintaks.
cat("[ARDL] Breusch-Pagan:\n"); coba(print(bptest(mod_ardl)))
## [ARDL] Breusch-Pagan:
##
## studentized Breusch-Pagan test
##
## data: mod_ardl
## BP = 26, df = 7, p-value = 0.0006
cat("\n[ARDL] White (fitted & fitted^2):\n")
##
## [ARDL] White (fitted & fitted^2):
e2 <- res_a^2
f <- as.numeric(fitted(mod_ardl))
aux <- lm(e2 ~ f + I(f^2))
LM <- length(e2) * summary(aux)$r.squared
cat("White LM =", round(LM, 3), "| p =", round(pchisq(LM, df = 2, lower.tail = FALSE), 4), "\n")
## White LM = 2.394 | p = 0.3021
cat("\n[ARDL] ARCH-LM (lag 12, via Ljung-Box residual kuadrat):\n")
##
## [ARDL] ARCH-LM (lag 12, via Ljung-Box residual kuadrat):
print(Box.test(res_a^2, lag = 12, type = "Ljung-Box"))
##
## Box-Ljung test
##
## data: res_a^2
## X-squared = 28, df = 12, p-value = 0.006
cat("\n[VECM] ARCH-LM multivariat (lag 12):\n")
##
## [VECM] ARCH-LM multivariat (lag 12):
coba(print(arch.test(vec_est, lags.multi = 12, multivariate.only = TRUE)))
##
## ARCH (multivariate)
##
## data: Residuals of VAR object vec_est
## Chi-squared = 1020, df = 1200, p-value = 1
## $arch.mul
##
## ARCH (multivariate)
##
## data: Residuals of VAR object vec_est
## Chi-squared = 1020, df = 1200, p-value = 1
# Uji normalitas residual & spesifikasi (pelengkap)
cat("\n[ARDL] Jarque-Bera:\n"); print(jarque.bera.test(res_a))
##
## [ARDL] Jarque-Bera:
##
## Jarque Bera Test
##
## data: res_a
## X-squared = 12, df = 2, p-value = 0.003
cat("\n[ARDL] Ramsey RESET:\n"); coba(print(resettest(mod_ardl, power = 2:3, type = "fitted")))
##
## [ARDL] Ramsey RESET:
##
## RESET test
##
## data: mod_ardl
## RESET = 0.45, df1 = 1, df2 = 106, p-value = 0.5
cat("\n[VECM] Normalitas residual multivariat:\n")
##
## [VECM] Normalitas residual multivariat:
coba(print(normality.test(vec_est, multivariate.only = TRUE)))
## $JB
##
## JB-Test (multivariate)
##
## data: Residuals of VAR object vec_est
## Chi-squared = 139, df = 8, p-value <0.0000000000000002
##
##
## $Skewness
##
## Skewness only (multivariate)
##
## data: Residuals of VAR object vec_est
## Chi-squared = 25, df = 4, p-value = 0.00005
##
##
## $Kurtosis
##
## Kurtosis only (multivariate)
##
## data: Residuals of VAR object vec_est
## Chi-squared = 113, df = 4, p-value <0.0000000000000002
## $jb.mul
## $jb.mul$JB
##
## JB-Test (multivariate)
##
## data: Residuals of VAR object vec_est
## Chi-squared = 139, df = 8, p-value <0.0000000000000002
##
##
## $jb.mul$Skewness
##
## Skewness only (multivariate)
##
## data: Residuals of VAR object vec_est
## Chi-squared = 25, df = 4, p-value = 0.00005
##
##
## $jb.mul$Kurtosis
##
## Kurtosis only (multivariate)
##
## data: Residuals of VAR object vec_est
## Chi-squared = 113, df = 4, p-value <0.0000000000000002
Interpretasi. Hasil uji heteroskedastisitas pada ARDL bersifat campuran. Breusch-Pagan (BP = 26; p = 0,0006) dan ARCH-LM (p = 0,006) menolak H0 sehingga terdapat indikasi heteroskedastisitas dan efek ARCH, sedangkan uji White (LM = 2,394; p = 0,302) tidak menolak H0. Perbedaan ini wajar karena uji White versi ini hanya memakai nilai fitted sebagai regresor sehingga dayanya lebih rendah daripada Breusch-Pagan yang memakai seluruh regresor. Kesimpulan yang aman adalah heteroskedastisitas terdeteksi pada dua dari tiga uji dan telah ditangani dengan galat baku HAC. Pada VECM, ARCH-LM multivariat (statistik 1.020 dengan derajat bebas 1.200; p = 1) tidak menolak H0 sehingga tidak ada masalah heteroskedastisitas.
Normalitas dan spesifikasi. Uji Jarque-Bera pada
ARDL (p = 0,003) menolak normalitas, dan pada VECM uji normalitas
multivariat menolak H0 (JB p < 0,001) dengan penyumbang terbesar
kurtosis (p < 0,001; skewness p = 0,00005), yang menandakan ekor
distribusi residual lebih tebal daripada normal, wajar pada data
keuangan. Ketidaknormalan ini tidak merusak konsistensi estimasi tetapi
membatasi ketepatan inferensi sampel kecil dan sebaiknya dituliskan
sebagai keterbatasan. Uji RESET (p = 0,5) tidak menolak kebenaran bentuk
fungsional, namun dapat muncul peringatan panjang objek akibat objek
dynlm, sehingga hasil ini tidak dijadikan dasar utama
kesimpulan.
Pada ARDL stabilitas dilihat dari CUSUM dan CUSUMSQ residual rekursif: model stabil bila kurva berada di dalam pita kepercayaan 5 persen. Pada VECM dihitung modulus akar karakteristik matriks pendamping: dari \(n\) variabel dan rank \(r\) harus ada tepat \((n - r)\) akar bernilai satu, dan akar lainnya harus berada di dalam lingkaran satuan.
Sintaks.
# (a) ARDL: CUSUM dan CUSUMSQ
coba({
Xm <- model.matrix(mod_ardl)
yv <- as.numeric(model.response(model.frame(mod_ardl)))
dfc <- data.frame(y = yv, Xm[, -1, drop = FALSE])
colnames(dfc) <- c("y", make.names(colnames(Xm)[-1]))
cus <- efp(y ~ ., data = dfc, type = "Rec-CUSUM")
cat("[ARDL] Uji CUSUM:\n"); print(sctest(cus))
# CUSUMSQ (pita 5% pendekatan Durbin, 1969)
w <- recresid(y ~ ., data = dfc)
m <- length(w)
csq <- cumsum(w^2) / sum(w^2)
c0 <- 1.358 / sqrt(m / 2 - 1)
tt <- (1:m) / m
keluar <- any(csq > tt + c0 | csq < tt - c0)
cat("[ARDL] CUSUMSQ keluar dari pita 5%? ", ifelse(keluar, "YA (tidak stabil)", "TIDAK (stabil)"), "\n")
par(mfrow = c(1, 2))
plot(cus, main = "CUSUM ARDL")
plot(tt, csq, type = "l", lwd = 2, ylim = c(-0.2, 1.2), xlab = "Proporsi sampel",
ylab = "CUSUMSQ", main = "CUSUMSQ ARDL")
lines(tt, tt + c0, col = "red", lty = 2); lines(tt, tt - c0, col = "red", lty = 2)
par(mfrow = c(1, 1))
})
## [ARDL] Uji CUSUM:
##
## Recursive CUSUM test
##
## data: cus
## S = 0.81, p-value = 0.1
##
## [ARDL] CUSUMSQ keluar dari pita 5%? YA (tidak stabil)
# (b) VECM: akar karakteristik matriks pendamping
akar_modulus <- function(Alist) {
n <- nrow(Alist[[1]]); p <- length(Alist)
top <- do.call(cbind, Alist)
M <- if (p > 1) rbind(top, cbind(diag(n * (p - 1)), matrix(0, n * (p - 1), n))) else top
sort(Mod(eigen(M)$values), decreasing = TRUE)
}
akar <- akar_modulus(vec_est$A)
cat("[VECM] Modulus akar karakteristik (terbesar -> terkecil):\n"); print(round(akar, 4))
## [VECM] Modulus akar karakteristik (terbesar -> terkecil):
## [1] 1.0000 1.0000 0.8630 0.4600 0.3827 0.3827 0.2986 0.2986
cat("Jumlah akar ~ 1 (|z| > 0.999):", sum(akar > 0.999),
"| diharapkan n - r =", length(VAR_I1) - r, "\n")
## Jumlah akar ~ 1 (|z| > 0.999): 2 | diharapkan n - r = 2
cat("Akar terbesar di luar unit root:", round(akar[akar < 0.999][1], 4), "(harus < 1)\n")
## Akar terbesar di luar unit root: 0.863 (harus < 1)
# CUSUM pada VAR level (spesifikasi tak terbatas dari sistem yang sama)
var_lvl <- VAR(Y4, p = K, type = "const")
# Mengatur margin grafik agar tidak terlalu besar dibanding area plot
par(mar = c(3.5, 3.5, 2.5, 1), oma = c(0, 0, 1, 0))
stab_var <- stability(var_lvl, type = "OLS-CUSUM")
plot(stab_var)
Interpretasi. Uji CUSUM pada ARDL menghasilkan S = 0,81 dengan p = 0,1 sehingga H0 kestabilan parameter tidak ditolak pada taraf 5 persen, tetapi kurva CUSUMSQ keluar dari pita kepercayaan sehingga model dinyatakan tidak stabil menurut CUSUMSQ. CUSUMSQ lebih sensitif terhadap perubahan varians residual (misalnya guncangan pandemi), sehingga hasil ini sejalan dengan temuan heteroskedastisitas dan perlu dilaporkan sebagai keterbatasan ARDL. Pada VECM, modulus akar karakteristik adalah 1,000; 1,000; 0,863; 0,460; 0,383; 0,383; 0,299; dan 0,299. Terdapat dua akar bernilai satu, sama dengan \(n - r = 4 - 2 = 2\), dan akar terbesar berikutnya (0,863) berada di dalam lingkaran satuan. Kondisi ini sesuai teori untuk sistem dengan dua vektor kointegrasi, sehingga VECM stabil dan sekaligus mendukung pemilihan rank dua. Pada grafik CUSUM VAR level, proses empiris yang berada di dalam pita 5 persen menandakan parameter konstan.
Variabel X dikatakan menyebabkan Y secara Granger apabila nilai lampau X memperbaiki prediksi Y setelah nilai lampau Y dimasukkan (H0: X tidak menyebabkan Y; tolak bila p-value < 0,05). Karena data berorde integrasi campuran dan terkointegrasi, uji utama yang dipakai adalah Toda-Yamamoto: VAR level diestimasi dengan lag \((K + d_{max})\) dan uji Wald chi-kuadrat hanya dikenakan pada \(K\) lag pertama, sehingga valid tanpa memedulikan orde integrasi dan memungkinkan inflasi ikut diuji. Sebagai pembanding dijalankan uji Granger klasik berpasangan pada seri stasioner (selisih log dan inflasi level).
Sintaks.
# (a) Toda-Yamamoto
Y5 <- ts_all[, vars_lvl]
pil5 <- VARselect(Y5, lag.max = 8, type = "const")
K5 <- max(1L, as.integer(pil5$selection["SC(n)"]))
dmax <- 1
var_ty <- VAR(Y5, p = K5 + dmax, type = "const")
cat("Granger (Toda-Yamamoto) | K =", K5, "dmax =", dmax, "\n")
## Granger (Toda-Yamamoto) | K = 1 dmax = 1
hasil_ty <- NULL
for (akibat in vars_lvl) {
for (sebab in setdiff(vars_lvl, akibat)) {
hip <- paste0(sebab, ".l", 1:K5, " = 0")
w <- linearHypothesis(var_ty$varresult[[akibat]], hip, test = "Chisq")
hasil_ty <- rbind(hasil_ty, data.frame(
Penyebab = sebab, Akibat = akibat,
Chisq = round(w$Chisq[2], 4), df = w$Df[2], p_value = round(w[["Pr(>Chisq)"]][2], 4),
Keputusan = ifelse(w[["Pr(>Chisq)"]][2] < 0.05, "Ada kausalitas", "Tidak ada")))
}
}
kable(hasil_ty, row.names = FALSE, caption = "Uji Kausalitas Granger Toda-Yamamoto")
| Penyebab | Akibat | Chisq | df | p_value | Keputusan |
|---|---|---|---|---|---|
| LEMAS | LIHSG | 4.5366 | 1 | 0.0332 | Ada kausalitas |
| LWTI | LIHSG | 0.8414 | 1 | 0.3590 | Tidak ada |
| LKURS | LIHSG | 0.0519 | 1 | 0.8199 | Tidak ada |
| INF | LIHSG | 2.0815 | 1 | 0.1491 | Tidak ada |
| LIHSG | LEMAS | 5.4987 | 1 | 0.0190 | Ada kausalitas |
| LWTI | LEMAS | 0.1133 | 1 | 0.7364 | Tidak ada |
| LKURS | LEMAS | 5.1032 | 1 | 0.0239 | Ada kausalitas |
| INF | LEMAS | 0.1550 | 1 | 0.6938 | Tidak ada |
| LIHSG | LWTI | 0.4032 | 1 | 0.5254 | Tidak ada |
| LEMAS | LWTI | 1.7759 | 1 | 0.1827 | Tidak ada |
| LKURS | LWTI | 3.6203 | 1 | 0.0571 | Tidak ada |
| INF | LWTI | 0.4292 | 1 | 0.5124 | Tidak ada |
| LIHSG | LKURS | 1.4239 | 1 | 0.2328 | Tidak ada |
| LEMAS | LKURS | 0.9375 | 1 | 0.3329 | Tidak ada |
| LWTI | LKURS | 1.1828 | 1 | 0.2768 | Tidak ada |
| INF | LKURS | 0.0019 | 1 | 0.9648 | Tidak ada |
| LIHSG | INF | 1.3830 | 1 | 0.2396 | Tidak ada |
| LEMAS | INF | 1.5155 | 1 | 0.2183 | Tidak ada |
| LWTI | INF | 0.3941 | 1 | 0.5302 | Tidak ada |
| LKURS | INF | 1.2382 | 1 | 0.2658 | Tidak ada |
# (b) Granger klasik pasangan (seri stasioner)
st <- ts.intersect(diff(ts_all[, "LIHSG"]), diff(ts_all[, "LEMAS"]),
diff(ts_all[, "LWTI"]), diff(ts_all[, "LKURS"]), ts_all[, "INF"])
colnames(st) <- c("dLIHSG", "dLEMAS", "dLWTI", "dLKURS", "INF")
nm <- colnames(st)
hasil_gc <- NULL
for (akibat in nm) for (sebab in setdiff(nm, akibat)) {
g <- grangertest(st[, akibat], st[, sebab], order = K5)
hasil_gc <- rbind(hasil_gc, data.frame(
Penyebab = sebab, Akibat = akibat, F = round(g$F[2], 4),
p_value = round(g[["Pr(>F)"]][2], 4),
Keputusan = ifelse(g[["Pr(>F)"]][2] < 0.05, "Ada kausalitas", "Tidak ada")))
}
kable(hasil_gc, row.names = FALSE, caption = "Uji Granger Klasik Berpasangan (seri stasioner)")
| Penyebab | Akibat | F | p_value | Keputusan |
|---|---|---|---|---|
| dLEMAS | dLIHSG | 1.1005 | 0.2964 | Tidak ada |
| dLWTI | dLIHSG | 1.3825 | 0.2422 | Tidak ada |
| dLKURS | dLIHSG | 1.3821 | 0.2423 | Tidak ada |
| INF | dLIHSG | 0.7574 | 0.3860 | Tidak ada |
| dLIHSG | dLEMAS | 3.4682 | 0.0652 | Tidak ada |
| dLWTI | dLEMAS | 0.0674 | 0.7957 | Tidak ada |
| dLKURS | dLEMAS | 4.6355 | 0.0335 | Ada kausalitas |
| INF | dLEMAS | 0.5852 | 0.4459 | Tidak ada |
| dLIHSG | dLWTI | 1.0799 | 0.3010 | Tidak ada |
| dLEMAS | dLWTI | 0.0837 | 0.7729 | Tidak ada |
| dLKURS | dLWTI | 2.7620 | 0.0993 | Tidak ada |
| INF | dLWTI | 0.0012 | 0.9720 | Tidak ada |
| dLIHSG | dLKURS | 0.1247 | 0.7247 | Tidak ada |
| dLEMAS | dLKURS | 0.0085 | 0.9267 | Tidak ada |
| dLWTI | dLKURS | 8.3264 | 0.0047 | Ada kausalitas |
| INF | dLKURS | 0.1153 | 0.7348 | Tidak ada |
| dLIHSG | INF | 0.7749 | 0.3806 | Tidak ada |
| dLEMAS | INF | 0.8278 | 0.3649 | Tidak ada |
| dLWTI | INF | 0.0642 | 0.8005 | Tidak ada |
| dLKURS | INF | 0.2088 | 0.6486 | Tidak ada |
Interpretasi Toda-Yamamoto. Kriteria SC memilih \(K = 1\) dan \(d_{max} = 1\), sehingga VAR diestimasi dengan dua lag. Dari 20 pasangan, hanya tiga yang signifikan. LEMAS menyebabkan LIHSG secara Granger (\(\chi^2\) = 4,54; p = 0,033), dan sebaliknya LIHSG menyebabkan LEMAS (\(\chi^2\) = 5,50; p = 0,019), sehingga hubungan emas dan IHSG bersifat dua arah. LKURS menyebabkan LEMAS (\(\chi^2\) = 5,10; p = 0,024). Variabel LWTI (p = 0,359), LKURS (p = 0,820), dan INF (p = 0,149) tidak memiliki daya prediksi terhadap LIHSG. Pasangan lain tidak signifikan; LKURS terhadap LWTI mendekati signifikan (p = 0,057).
Interpretasi Granger klasik. Pada seri stasioner (selisih), tidak ada variabel yang menyebabkan IHSG secara Granger (seluruh p > 0,24). Hanya dua hubungan yang signifikan: dLKURS menyebabkan dLEMAS (p = 0,0335) dan dLWTI menyebabkan dLKURS (p = 0,0047). Perbedaan dengan Toda-Yamamoto (yang menemukan emas menyebabkan IHSG) timbul karena uji pada selisih membuang informasi hubungan jangka panjang, sedangkan Toda-Yamamoto bekerja pada level. Kedua hasil dilaporkan apa adanya, dan kausalitas Granger adalah kausalitas prediktif, bukan kausalitas struktural.
IRF menggambarkan respons IHSG pada periode-periode berikutnya terhadap kejutan satu simpangan baku pada variabel lain. Digunakan dekomposisi Cholesky sehingga urutan variabel berpengaruh. Urutan dari yang paling eksogen ke yang paling endogen dipilih: LWTI, LEMAS, LKURS, lalu LIHSG, dengan asumsi harga komoditas global ditentukan di luar pasar saham domestik dan IHSG merespons semuanya dalam periode yang sama. Horizon 24 bulan dengan selang kepercayaan 95 persen hasil bootstrap 500 replikasi.
Sintaks.
Y4_ord <- Y4[, c("LWTI", "LEMAS", "LKURS", "LIHSG")]
jo_ord <- ca.jo(Y4_ord, type = "trace", ecdet = "const", K = K, spec = "transitory")
vec_irf <- vec2var(jo_ord, r = r)
set.seed(123)
shock <- c("LWTI", "LEMAS", "LKURS")
irf_list <- lapply(shock, function(s)
irf(vec_irf, impulse = s, response = "LIHSG", n.ahead = 24,
ortho = TRUE, cumulative = FALSE, boot = TRUE, ci = 0.95, runs = 500))
names(irf_list) <- shock
# Tabel respons IHSG pada horizon 1, 3, 6, 12, 24 bulan
irf_tab <- sapply(shock, function(s) irf_list[[s]]$irf[[1]][c(2, 4, 7, 13, 25), 1])
rownames(irf_tab) <- paste("Bulan", c(1, 3, 6, 12, 24))
kable(irf_tab, digits = 5, caption = "Respons LIHSG terhadap kejutan satu simpangan baku")
| LWTI | LEMAS | LKURS | |
|---|---|---|---|
| Bulan 1 | 0.01423 | 0.00817 | -0.01735 |
| Bulan 3 | 0.00923 | 0.00347 | -0.00995 |
| Bulan 6 | 0.01260 | 0.00020 | -0.00607 |
| Bulan 12 | 0.01805 | -0.00213 | -0.00390 |
| Bulan 24 | 0.02123 | -0.00348 | -0.00267 |
# Grafik IRF
for (s in shock) plot(irf_list[[s]], main = paste("Respon IHSG terhadap shock", s))
Interpretasi. Respons IHSG terhadap kejutan LWTI bernilai positif sepanjang horizon dan cenderung membesar: 0,0142 pada bulan pertama, turun ke 0,0092 pada bulan ketiga, lalu naik kembali menjadi 0,0126 (bulan ke-6), 0,0181 (bulan ke-12), dan 0,0212 (bulan ke-24). Artinya kejutan kenaikan harga minyak sebesar satu simpangan baku meningkatkan IHSG sekitar 1,4 sampai 2,1 persen dan efeknya bersifat persisten (tidak meluruh), sesuai dengan sifat VECM di mana kejutan dapat berdampak permanen. Respons terhadap kejutan LEMAS positif di awal (0,0082) tetapi cepat meluruh ke nol pada bulan ke-6 (0,0002) dan berbalik tipis negatif (-0,0021 pada bulan ke-12 dan -0,0035 pada bulan ke-24). Respons terhadap kejutan LKURS negatif sejak awal (-0,0174) dan makin kecil secara absolut (-0,0100; -0,0061; -0,0039; -0,0027), yang berarti pelemahan rupiah menekan IHSG terutama dalam jangka pendek, dan efeknya mereda seiring waktu. Pada grafik, respons dianggap signifikan hanya jika selang kepercayaan 95 persen (garis putus-putus) tidak memuat nol. Karena urutan Cholesky merupakan asumsi, sebaiknya dilakukan uji kepekaan dengan mengubah urutan variabel dan melaporkan apakah arah respons berubah.
FEVD menguraikan proporsi varians galat peramalan LIHSG pada tiap horizon ke dalam kontribusi kejutan masing-masing variabel, termasuk kejutan LIHSG sendiri.
Sintaks.
fevd_out <- fevd(vec_irf, n.ahead = 24)
fevd_tab <- round(100 * fevd_out$LIHSG[c(1, 3, 6, 12, 24), ], 2)
rownames(fevd_tab) <- paste("Bulan", c(1, 3, 6, 12, 24))
kable(fevd_tab, caption = "FEVD LIHSG (dalam persen)")
| LWTI | LEMAS | LKURS | LIHSG | |
|---|---|---|---|---|
| Bulan 1 | 12.36 | 11.09 | 13.16 | 63.39 |
| Bulan 3 | 8.84 | 4.97 | 12.12 | 74.07 |
| Bulan 6 | 8.24 | 3.07 | 9.15 | 79.55 |
| Bulan 12 | 13.76 | 1.96 | 6.61 | 77.67 |
| Bulan 24 | 25.73 | 1.55 | 4.40 | 68.32 |
plot(fevd_out)
Interpretasi. Pada bulan pertama, kejutan LIHSG sendiri menjelaskan 63,39 persen varians galat peramalan IHSG, sedangkan LWTI, LEMAS, dan LKURS masing-masing menyumbang 12,36; 11,09; dan 13,16 persen. Kontribusi LIHSG sendiri naik hingga 79,55 persen pada bulan ke-6, kemudian turun menjadi 77,67 persen (bulan ke-12) dan 68,32 persen (bulan ke-24). Kontribusi LWTI turun di awal (8,84 persen pada bulan ke-3 dan 8,24 persen pada bulan ke-6) lalu naik tajam menjadi 13,76 persen (bulan ke-12) dan 25,73 persen (bulan ke-24), sehingga minyak menjadi sumber ketidakpastian eksternal yang paling penting dalam jangka panjang. Sebaliknya, kontribusi LEMAS menyusut dari 11,09 persen menjadi 1,55 persen, dan LKURS dari 13,16 persen menjadi 4,40 persen, yang berarti emas dan kurs lebih berperan pada jangka pendek. Temuan ini konsisten dengan IRF dan dengan elastisitas jangka panjang LWTI pada vektor kointegrasi.
Subbab ini merangkum angka-angka utama yang menjadi dasar pembahasan: elastisitas jangka panjang dari vektor kointegrasi pertama (negatif dari koefisien \(\beta\) karena persamaannya dinormalisasi pada LIHSG), kecepatan penyesuaian terhadap keseimbangan, serta ringkasan ARDL.
Sintaks.
# (1) Hubungan jangka panjang (VECM)
beta1 <- vecm_ls$beta[, 1]
elast_jp <- -beta1[!grepl("^LIHSG|constant", names(beta1))]
if (r >= 2) elast_jp <- elast_jp[!grepl("^LEMAS", names(elast_jp))] # LEMAS dipaksa 0 oleh normalisasi
cat("Elastisitas jangka panjang terhadap LIHSG (VECM, vektor 1):\n"); print(round(elast_jp, 4))
## Elastisitas jangka panjang terhadap LIHSG (VECM, vektor 1):
## LWTI.l1 LKURS.l1
## 0.4060 -0.0259
cat("Pembacaan: kenaikan 1% variabel X -> IHSG berubah sebesar koefisien (%), ceteris paribus.\n")
## Pembacaan: kenaikan 1% variabel X -> IHSG berubah sebesar koefisien (%), ceteris paribus.
# (2) Kecepatan penyesuaian ke keseimbangan (ECT)
koef_ihsg <- coef(vecm_ls$rlm)[, grep("LIHSG", colnames(coef(vecm_ls$rlm)))[1]]
alpha_ihsg <- koef_ihsg[grep("^ect", names(koef_ihsg))]
cat("\nKoefisien ECT persamaan LIHSG:", round(alpha_ihsg, 4), "\n")
##
## Koefisien ECT persamaan LIHSG: 0.0018 -0.0419
alpha_ok <- alpha_ihsg[alpha_ihsg < 0 & alpha_ihsg > -1]
if (length(alpha_ok)) {
cat("Waktu paruh (bulan) untuk", names(alpha_ok), ":",
round(log(0.5) / log(1 + alpha_ok), 2), "\n")
}
## Waktu paruh (bulan) untuk ect2 : 16.19
# (3) ARDL: koefisien jangka panjang & ECT
cat("\nKoefisien jangka panjang ARDL:\n"); print(lr_ardl)
##
## Koefisien jangka panjang ARDL:
## Term Estimate Std. Error t value Pr(>|t|)
## 1 (Intercept) 13.7729 6.13667 2.2444 0.0268674
## 2 LEMAS 0.1492 0.13629 1.0945 0.2762001
## 3 LWTI 0.3818 0.09889 3.8611 0.0001936
## 4 LKURS -0.8034 0.73604 -1.0915 0.2775230
## 5 INF 0.0209 0.07324 0.2854 0.7759155
ect_ardl <- coef(mod_recm)[grep("ect", names(coef(mod_recm)))]
cat("Koefisien ECT ARDL:", round(ect_ardl, 4),
"| waktu paruh (bulan):", round(log(0.5) / log(1 + ect_ardl), 2), "\n")
## Koefisien ECT ARDL: -0.1404 | waktu paruh (bulan): 4.58
Interpretasi. Elastisitas jangka panjang pada vektor kointegrasi pertama adalah +0,4060 untuk LWTI dan -0,0259 untuk LKURS: kenaikan harga minyak 1 persen berasosiasi dengan kenaikan IHSG sekitar 0,41 persen dalam jangka panjang, sedangkan pengaruh kurs praktis nol. Elastisitas LEMAS sengaja tidak ditampilkan karena pada \(r = 2\) koefisiennya dipaksa nol oleh normalisasi, bukan karena emas tidak berpengaruh. Koefisien ECT pada persamaan LIHSG adalah 0,0018 dan -0,0419; hanya yang kedua bernilai negatif dan berada di antara -1 dan 0 sehingga waktu paruh dihitung untuk ECT2 saja, yaitu 16,19 bulan. Artinya penyimpangan IHSG dari hubungan keseimbangan kedua terkoreksi setengahnya dalam sekitar 16 bulan, atau penyesuaian berlangsung lambat (sekitar 4,2 persen per bulan). Koefisien jangka panjang ARDL memberi gambaran yang searah untuk LWTI (0,38) tetapi lainnya tidak signifikan, dan waktu paruh ECT ARDL (4,58 bulan) tidak digunakan dalam kesimpulan karena bounds test tidak menolak H0 sehingga ECT tersebut tidak valid.
Kesimpulan interpretasi.
Seluruh variabel I(1) kecuali inflasi yang I(0).
Johansen menemukan dua vektor kointegrasi sedangkan ARDL bounds test tidak menemukan kointegrasi, sehingga VECM dijadikan model hubungan jangka panjang.
Harga minyak WTI merupakan penentu jangka panjang IHSG yang paling konsisten (elastisitas sekitar 0,4; kontribusi FEVD 25,7 persen pada bulan ke-24), sementara emas dan kurs berperan terutama dalam jangka pendek.
Inflasi tidak signifikan pada seluruh spesifikasi.
VECM lolos diagnostik autokorelasi, heteroskedastisitas, dan stabilitas, sedangkan ARDL memiliki masalah autokorelasi, heteroskedastisitas, normalitas, dan CUSUMSQ sehingga hanya dijadikan pelengkap jangka pendek.
Keterbatasan yang perlu dicatat meliputi ketidaknormalan residual, urutan Cholesky yang bersifat asumsi, serta konflik antara Johansen dan bounds test.
Bab ini menyajikan hasil analisis dan pembahasannya sesuai tahapan yang dirancang pada Bab III. Data yang dianalisis adalah 116 observasi bulanan (Januari 2017 sampai Agustus 2026) untuk lima variabel: IHSG, emas futures, minyak WTI futures, kurs JISDOR, dan inflasi M-to-M. Urutan penyajian mengikuti logika keputusan bertahap: karakteristik data, eksplorasi, pra-pemrosesan, uji stasioneritas, uji kointegrasi, estimasi model, diagnostik, analisis hubungan dinamis, dan interpretasi akhir. Setiap subbab terdiri atas sintaks R, keluaran, dan interpretasi.
Karakteristik data diperiksa melalui struktur data, rentang periode, dan statistik deskriptif untuk mengetahui skala, pusat, dan penyebaran setiap variabel sebelum dianalisis lebih lanjut.
Sintaks.
# Struktur dan dimensi dataset
str(data)
## 'data.frame': 116 obs. of 6 variables:
## $ Periode : Date, format: "2017-01-01" "2017-02-01" ...
## $ IHSG : num 5294 5387 5568 5685 5738 ...
## $ Emas : num 1211 1254 1251 1268 1270 ...
## $ Minyak_WTI : num 52.8 54 50.6 49.3 48.3 ...
## $ Kurs_JISDOR: num 13343 13347 13321 13327 13321 ...
## $ Inflasi : num 0.97 0.23 -0.02 0.09 0.39 0.69 0.22 -0.07 0.13 0.01 ...
dim(data)
## [1] 116 6
names(data)
## [1] "Periode" "IHSG" "Emas" "Minyak_WTI" "Kurs_JISDOR"
## [6] "Inflasi"
# Periode awal dan akhir
range(data$Periode)
## [1] "2017-01-01" "2026-08-01"
# Ringkasan statistik awal
summary(data)
## Periode IHSG Emas Minyak_WTI
## Min. :2017-01-01 Min. :4539 Min. :1196 Min. : 18.8
## 1st Qu.:2019-05-24 1st Qu.:5982 1st Qu.:1397 1st Qu.: 54.9
## Median :2021-10-16 Median :6490 Median :1818 Median : 67.0
## Mean :2021-10-16 Mean :6496 Mean :2096 Mean : 66.9
## 3rd Qu.:2024-03-08 3rd Qu.:7052 3rd Qu.:2227 3rd Qu.: 77.0
## Max. :2026-08-01 Max. :8647 Max. :5248 Max. :114.7
## Kurs_JISDOR Inflasi
## Min. :13319 Min. :-0.7600
## 1st Qu.:14173 1st Qu.: 0.0375
## Median :14676 Median : 0.1950
## Mean :14994 Mean : 0.2347
## 3rd Qu.:15816 3rd Qu.: 0.3900
## Max. :18058 Max. : 1.6500
statistik_deskriptif <- data %>%
summarise(
across(
c(IHSG, Emas, Minyak_WTI, Kurs_JISDOR, Inflasi),
list(
Minimum = ~ min(.x, na.rm = TRUE),
Maksimum = ~ max(.x, na.rm = TRUE),
Mean = ~ mean(.x, na.rm = TRUE),
Median = ~ median(.x, na.rm = TRUE),
Standar_Deviasi = ~ sd(.x, na.rm = TRUE)
),
.names = "{.col}_{.fn}"
)
) %>%
pivot_longer(
cols = everything(),
names_to = c("Variabel", "Ukuran"),
names_pattern = "(.+)_(Minimum|Maksimum|Mean|Median|Standar_Deviasi)",
values_to = "Nilai"
) %>%
pivot_wider(names_from = Ukuran, values_from = Nilai)
kable(statistik_deskriptif, digits = 3,
caption = "Statistik Deskriptif Variabel Penelitian")
| Variabel | Minimum | Maksimum | Mean | Median | Standar_Deviasi |
|---|---|---|---|---|---|
| IHSG | 4538.93 | 8646.94 | 6496.471 | 6489.685 | 802.625 |
| Emas | 1196.20 | 5247.90 | 2095.833 | 1817.650 | 954.614 |
| Minyak_WTI | 18.84 | 114.67 | 66.864 | 67.030 | 17.030 |
| Kurs_JISDOR | 13319.00 | 18058.00 | 14993.983 | 14675.500 | 1165.391 |
| Inflasi | -0.76 | 1.65 | 0.235 | 0.195 | 0.334 |
# Koefisien variasi (sd / mean x 100). Inflasi dikecualikan karena rata-ratanya
# mendekati nol sehingga rasio tidak bermakna.
cv_tab <- statistik_deskriptif %>%
filter(Variabel != "Inflasi") %>%
transmute(Variabel, CV_persen = Standar_Deviasi / Mean * 100)
kable(cv_tab, digits = 1, caption = "Koefisien Variasi (persen)")
| Variabel | CV_persen |
|---|---|
| IHSG | 12.4 |
| Emas | 45.5 |
| Minyak_WTI | 25.5 |
| Kurs_JISDOR | 7.8 |
Interpretasi. Data terdiri atas 116 baris dan 6 kolom: satu kolom periode bertipe tanggal dan lima kolom numerik. Rentang periode adalah 1 Januari 2017 sampai 1 Agustus 2026, sesuai dengan periode penelitian, sehingga data layak dianalisis sebagai deret waktu bulanan.
IHSG berkisar dari 4.538,93 (Maret 2020, saat awal pandemi) sampai 8.646,94 (Desember 2025) dengan rata-rata 6.496,47 dan median 6.489,69. Kedua ukuran pusat yang hampir sama menunjukkan distribusi yang relatif simetris. Emas berkisar dari USD 1.196,2 (September 2018) sampai USD 5.247,9 (Februari 2026); rata-rata (2.095,83) yang lebih besar daripada median (1.817,65) menunjukkan kemencengan ke kanan akibat harga yang tinggi pada periode akhir. Minyak WTI berkisar dari USD 18,84 (April 2020) sampai USD 114,67 (Mei 2022) dengan rata-rata 66,86 dan median 67,03. Kurs JISDOR berkisar dari Rp13.319 (Juni 2017) sampai Rp18.058 (Juli 2026) dengan rata-rata 14.993,98 dan median 14.675,50, yang mengindikasikan pelemahan rupiah pada periode akhir. Inflasi bulanan berkisar dari -0,76 persen (Januari 2025) sampai 1,65 persen (Maret 2025) dengan rata-rata 0,235 persen; nilai minimum negatif menunjukkan adanya deflasi bulanan.
Berdasarkan koefisien variasi, emas paling bervariasi relatif terhadap rata-ratanya (sekitar 46 persen), diikuti WTI (sekitar 25 persen), IHSG (sekitar 12 persen), dan kurs (sekitar 8 persen). Standar deviasi yang besar hanya menunjukkan fluktuasi yang lebar dan tidak berarti variabel tersebut lebih berpengaruh terhadap IHSG.
EDA dilakukan untuk melihat pola pergerakan dan hubungan awal antarvariabel. Hasilnya bersifat eksploratif dan belum digunakan untuk menyimpulkan pengaruh atau sebab-akibat.
Sintaks.
data_long <- data %>%
pivot_longer(
cols = c(IHSG, Emas, Minyak_WTI, Kurs_JISDOR, Inflasi),
names_to = "Variabel",
values_to = "Nilai"
)
ggplot(data_long, aes(x = Periode, y = Nilai)) +
geom_line(color = "steelblue", linewidth = 0.7) +
facet_wrap(~ Variabel, scales = "free_y", ncol = 2) +
labs(title = "Perkembangan Variabel Penelitian", x = "Periode", y = "Nilai") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold"))
Perkembangan Variabel Penelitian
data_korelasi <- data %>%
dplyr::select(IHSG, Emas, Minyak_WTI, Kurs_JISDOR, Inflasi)
matriks_korelasi <- cor(data_korelasi, method = "pearson",
use = "pairwise.complete.obs")
kable(round(matriks_korelasi, 3), caption = "Matriks Korelasi Pearson")
| IHSG | Emas | Minyak_WTI | Kurs_JISDOR | Inflasi | |
|---|---|---|---|---|---|
| IHSG | 1.000 | 0.561 | 0.579 | 0.506 | 0.071 |
| Emas | 0.561 | 1.000 | 0.266 | 0.861 | -0.005 |
| Minyak_WTI | 0.579 | 0.266 | 1.000 | 0.351 | 0.111 |
| Kurs_JISDOR | 0.506 | 0.861 | 0.351 | 1.000 | -0.060 |
| Inflasi | 0.071 | -0.005 | 0.111 | -0.060 | 1.000 |
corrplot(
matriks_korelasi,
method = "color", type = "upper",
addCoef.col = "black", tl.col = "black", tl.srt = 45,
number.cex = 0.7, title = "Matriks Korelasi Antarvariabel",
mar = c(0, 0, 2, 0)
)
Matriks Korelasi Antarvariabel
Interpretasi. Pada grafik deret waktu, IHSG naik dari sekitar 5.300 pada awal 2017, jatuh tajam ke titik terendah pada Maret 2020, pulih hingga puncak Desember 2025, lalu turun tajam pada paruh pertama 2026 (5.643,19 pada Juni 2026) dan mulai pulih pada Juli sampai Agustus 2026. Emas bergerak naik secara umum dengan percepatan sejak 2024 hingga puncak Februari 2026, kemudian terkoreksi. WTI turun sangat tajam pada awal 2020, naik hingga puncak Mei 2022, bergerak mendatar, lalu melonjak kembali pada Maret sampai April 2026. Kurs cenderung melemah dari sekitar Rp13.300 menjadi sekitar Rp18.000 dengan lonjakan sesaat pada Maret 2020. Inflasi berfluktuasi di sekitar nol tanpa tren jangka panjang yang jelas, dengan lonjakan dan penurunan tajam pada awal 2025.
IHSG, WTI, dan kurs sama-sama mengalami perubahan tajam pada waktu yang berdekatan, yaitu sekitar Maret sampai April 2020 dan paruh pertama 2026. Hal ini menjadi indikasi awal adanya guncangan ekonomi yang terjadi bersamaan, tetapi kesamaan waktu belum membuktikan hubungan sebab-akibat. Tren pada emas dan kurs serta lebar fluktuasi yang berubah sepanjang waktu mengindikasikan data level kemungkinan tidak stasioner dan varians tidak konstan, yang perlu dibuktikan melalui uji formal.
Pada matriks korelasi, IHSG berkorelasi positif dengan kekuatan sedang terhadap WTI (0,579), emas (0,561), dan kurs (0,506), sedangkan korelasi dengan inflasi sangat lemah (0,071). Korelasi emas dan kurs sangat tinggi (0,861), yang mencerminkan kedua variabel sama-sama bertren naik. Korelasi lainnya lemah: emas–WTI 0,266, WTI–kurs 0,351, dan inflasi dengan variabel lain berkisar antara -0,060 dan 0,111. Karena data berbentuk deret waktu, korelasi pada level dapat tinggi semata-mata akibat tren bersama sehingga tidak boleh ditafsirkan sebagai pengaruh. Korelasi positif IHSG dengan kurs, misalnya, tidak dapat dibaca bahwa pelemahan rupiah menaikkan IHSG; keduanya sama-sama bertren naik pada periode pengamatan.
Pra-pemrosesan menyiapkan data agar sesuai untuk pengujian deret waktu. Hasil tahap ini tidak dengan sendirinya membuktikan kestasioneran; hal tersebut ditentukan pada subbab 4.4.
Sintaks.
jumlah_missing <- colSums(is.na(data))
persentase_missing <- colMeans(is.na(data)) * 100
tabel_missing <- data.frame(
Variabel = names(jumlah_missing),
Jumlah_Missing = as.integer(jumlah_missing),
Persentase_Missing = as.numeric(persentase_missing)
)
kable(tabel_missing, digits = 2, caption = "Pemeriksaan Missing Value")
| Variabel | Jumlah_Missing | Persentase_Missing |
|---|---|---|
| Periode | 0 | 0 |
| IHSG | 0 | 0 |
| Emas | 0 | 0 |
| Minyak_WTI | 0 | 0 |
| Kurs_JISDOR | 0 | 0 |
| Inflasi | 0 | 0 |
# Fungsi penanganan missing value (interpolasi linear + carry nearest)
isi_missing <- function(x) {
if (all(is.na(x))) return(x)
if (anyNA(x)) {
x <- zoo::na.approx(x, na.rm = FALSE)
x <- zoo::na.locf(x, na.rm = FALSE)
x <- zoo::na.locf(x, fromLast = TRUE, na.rm = FALSE)
}
x
}
data_bersih <- data %>%
mutate(across(c(IHSG, Emas, Minyak_WTI, Kurs_JISDOR, Inflasi), isi_missing))
# Pemeriksaan ulang
colSums(is.na(data_bersih))
## Periode IHSG Emas Minyak_WTI Kurs_JISDOR Inflasi
## 0 0 0 0 0 0
Interpretasi. Jumlah dan persentase missing value adalah nol pada seluruh variabel, dan pemeriksaan ulang setelah penanganan tetap nol. Tidak ada nilai yang perlu diinterpolasi sehingga seluruh 116 observasi dipertahankan sebagaimana data aslinya. Hal ini menguntungkan karena interpolasi hanya pengganti nilai yang tidak tersedia dan dapat menambah keteraturan semu pada data.
Sintaks.
data_bersih <- data_bersih %>% arrange(Periode)
periode_lengkap <- seq(from = min(data_bersih$Periode),
to = max(data_bersih$Periode), by = "month")
data_bersih <- data_bersih %>%
complete(Periode = periode_lengkap) %>%
arrange(Periode)
nrow(data_bersih)
## [1] 116
range(data_bersih$Periode)
## [1] "2017-01-01" "2026-08-01"
colSums(is.na(data_bersih))
## Periode IHSG Emas Minyak_WTI Kurs_JISDOR Inflasi
## 0 0 0 0 0 0
ts_data <- ts(
data_bersih %>% dplyr::select(IHSG, Emas, Minyak_WTI, Kurs_JISDOR, Inflasi),
start = c(2017, 1), frequency = 12
)
start(ts_data)
## [1] 2017 1
end(ts_data)
## [1] 2026 8
frequency(ts_data)
## [1] 12
Interpretasi. Setelah pengurutan dan pelengkapan periode, jumlah baris tetap 116, rentang tetap Januari 2017 sampai Agustus 2026, dan tidak ada nilai kosong. Artinya tidak ada bulan yang hilang dan tidak diperlukan agregasi atau perubahan frekuensi. Objek deret waktu dimulai pada 2017 bulan ke-1, berakhir pada 2026 bulan ke-8, dan berfrekuensi 12 (satu siklus tahunan terdiri atas 12 pengamatan bulanan). Data siap ditransformasi.
Transformasi logaritma natural \(Z_t = \ln X_t\) diterapkan pada IHSG, emas, WTI, dan kurs yang bernilai positif. Inflasi tidak ditransformasi karena dapat bernilai nol atau negatif.
Sintaks.
data_log <- data_bersih %>%
mutate(
log_IHSG = log(IHSG),
log_Emas = log(Emas),
log_Minyak_WTI = log(Minyak_WTI),
log_Kurs_JISDOR = log(Kurs_JISDOR)
)
head(data_log %>%
dplyr::select(Periode, log_IHSG, log_Emas, log_Minyak_WTI, log_Kurs_JISDOR, Inflasi))
data_log_long <- data_log %>%
dplyr::select(Periode, log_IHSG, log_Emas, log_Minyak_WTI, log_Kurs_JISDOR) %>%
pivot_longer(cols = -Periode, names_to = "Variabel", values_to = "Nilai")
ggplot(data_log_long, aes(x = Periode, y = Nilai)) +
geom_line(color = "darkgreen", linewidth = 0.7) +
facet_wrap(~ Variabel, scales = "free_y", ncol = 2) +
labs(title = "Data Setelah Transformasi Logaritmik",
x = "Periode", y = "Nilai Logaritmik") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold"))
Data Setelah Transformasi Logaritmik
# Jumlah bulan inflasi negatif (alasan inflasi tidak dilogaritmakan)
sum(data_bersih$Inflasi < 0)
## [1] 26
Interpretasi. Pada observasi pertama, nilai logaritmik IHSG sebesar 8,5743, emas 7,0995, WTI 3,9667, dan kurs 9,4987, sedangkan inflasi tetap pada skala aslinya (0,97). Nilai tersebut bukan lagi poin, USD per troy ounce, USD per barel, atau rupiah per dolar. Grafik memperlihatkan bahwa bentuk pola tidak berubah drastis: tren dan guncangan 2020 masih tampak, tetapi skala fluktuasi pada level yang tinggi menjadi lebih terkendali. Dengan demikian transformasi logaritmik membantu menstabilkan varians tetapi belum menghilangkan tren. Inflasi tidak dilogaritmakan karena terdapat 26 bulan dengan inflasi negatif, sedangkan logaritma natural hanya terdefinisi untuk nilai positif. Keempat variabel logaritmik tidak boleh dibandingkan langsung dengan inflasi dalam satuan maupun besarnya.
Diferensiasi pertama \(\Delta Z_t = Z_t - Z_{t-1}\) dihitung untuk mengurangi tren.
Sintaks.
data_diff <- data_log %>%
mutate(
d_IHSG = c(NA, diff(log_IHSG)),
d_Emas = c(NA, diff(log_Emas)),
d_Minyak_WTI = c(NA, diff(log_Minyak_WTI)),
d_Kurs_JISDOR = c(NA, diff(log_Kurs_JISDOR)),
d_Inflasi = c(NA, diff(Inflasi))
)
head(data_diff %>%
dplyr::select(Periode, d_IHSG, d_Emas, d_Minyak_WTI, d_Kurs_JISDOR, d_Inflasi))
data_diff_long <- data_diff %>%
dplyr::select(Periode, d_IHSG, d_Emas, d_Minyak_WTI, d_Kurs_JISDOR, d_Inflasi) %>%
pivot_longer(cols = -Periode, names_to = "Variabel", values_to = "Nilai") %>%
filter(!is.na(Nilai))
ggplot(data_diff_long, aes(x = Periode, y = Nilai)) +
geom_line(color = "firebrick", linewidth = 0.7) +
facet_wrap(~ Variabel, scales = "free_y", ncol = 2) +
labs(title = "Data Setelah Diferensiasi Pertama",
x = "Periode", y = "Nilai Diferensiasi") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold"))
Data Setelah Diferensiasi Pertama
# Pemeriksaan akhir hasil pra-pemrosesan
hasil_akhir <- data_diff %>%
dplyr::select(Periode, d_IHSG, d_Emas, d_Minyak_WTI, d_Kurs_JISDOR, d_Inflasi)
dim(hasil_akhir)
## [1] 116 6
summary(hasil_akhir)
## Periode d_IHSG d_Emas d_Minyak_WTI
## Min. :2017-01-01 Min. :-0.1834 Min. :-0.1287 Min. :-0.7819
## 1st Qu.:2019-05-24 1st Qu.:-0.0122 1st Qu.:-0.0161 1st Qu.:-0.0594
## Median :2021-10-16 Median : 0.0061 Median : 0.0131 Median : 0.0150
## Mean :2021-10-16 Mean : 0.0018 Mean : 0.0114 Mean : 0.0042
## 3rd Qu.:2024-03-08 3rd Qu.: 0.0268 3rd Qu.: 0.0383 3rd Qu.: 0.0648
## Max. :2026-08-01 Max. : 0.0999 Max. : 0.1007 Max. : 0.6333
## NA's :1 NA's :1 NA's :1
## d_Kurs_JISDOR d_Inflasi
## Min. :-0.0768 Min. :-1.5400
## 1st Qu.:-0.0056 1st Qu.:-0.2400
## Median : 0.0010 Median : 0.0300
## Mean : 0.0025 Mean :-0.0066
## 3rd Qu.: 0.0129 3rd Qu.: 0.2000
## Max. : 0.1396 Max. : 2.1300
## NA's :1 NA's :1
colSums(is.na(hasil_akhir))
## Periode d_IHSG d_Emas d_Minyak_WTI d_Kurs_JISDOR
## 0 1 1 1 1
## d_Inflasi
## 1
sapply(hasil_akhir[-1], function(x) sum(!is.na(x)))
## d_IHSG d_Emas d_Minyak_WTI d_Kurs_JISDOR d_Inflasi
## 115 115 115 115 115
Interpretasi. Pengamatan pertama bernilai NA karena tidak memiliki periode sebelumnya sehingga diperoleh 115 observasi valid per variabel; NA ini konsekuensi perhitungan, bukan data yang hilang. Untuk empat variabel logaritmik, hasil diferensiasi dibaca sebagai perubahan relatif bulanan (misalnya 0,0173 pada IHSG Februari 2017 berarti naik sekitar 1,7 persen), sedangkan d_Inflasi dibaca dalam poin persentase. Rata-rata perubahan bulanan adalah sekitar 0,0018 untuk IHSG (simpangan baku 0,0444), 0,0114 untuk emas (0,0420), 0,0042 untuk WTI (0,1348), 0,0025 untuk kurs (0,0226), dan -0,0066 poin untuk inflasi (0,4414). WTI memiliki fluktuasi perubahan terbesar.
Setelah diferensiasi, seluruh variabel berfluktuasi di sekitar nol dan tren jangka panjang tidak lagi tampak. Perubahan terbesar terjadi pada Maret sampai Mei 2020: IHSG turun sekitar 18,3 persen (Maret 2020), WTI turun sekitar 78,2 persen (Maret 2020) lalu naik sekitar 63,3 persen (Mei 2020), dan kurs naik sekitar 14,0 persen (Maret 2020). Pada inflasi, perubahan terbesar terjadi pada Maret 2025 (+2,13 poin) dan Mei 2025 (-1,54 poin). Amplitudo yang besar pada periode tersebut menunjukkan varians belum sepenuhnya konstan. Grafik saja belum cukup menyatakan stasioneritas sehingga pengujian formal dilakukan pada subbab berikut.
Pengujian memakai ADF dan PP (H0: terdapat akar unit) serta KPSS (H0: stasioner). Seri dinyatakan stasioner pada ADF/PP bila statistik uji lebih negatif daripada nilai kritis 5 persen, dan pada KPSS bila statistik tidak melebihi nilai kritis. Spesifikasi pada level memakai intercept dan tren, sedangkan pada selisih pertama cukup intercept.
Sintaks.
# Data untuk pemodelan (diambil dari objek `data` yang sudah diinput manual)
df <- data.frame(
Periode = data$Periode,
IHSG = data$IHSG,
EMAS = data$Emas,
WTI = data$Minyak_WTI,
KURS = data$Kurs_JISDOR,
INF = data$Inflasi
)
stopifnot(!anyNA(df))
df$LIHSG <- log(df$IHSG)
df$LEMAS <- log(df$EMAS)
df$LWTI <- log(df$WTI)
df$LKURS <- log(df$KURS)
vars_lvl <- c("LIHSG", "LEMAS", "LWTI", "LKURS", "INF")
ts_all <- ts(df[, vars_lvl], start = c(2017, 1), frequency = 12)
uji_adf <- function(x, nama, tingkat, tipe) {
m <- ur.df(x, type = tipe, selectlags = "AIC", lags = 12)
tn <- c(none = "tau1", drift = "tau2", trend = "tau3")[[tipe]]
stat <- m@teststat[1, tn]
cv5 <- m@cval[tn, "5pct"]
lagp <- length(grep("z.diff.lag", rownames(m@testreg$coefficients)))
data.frame(Variabel = nama, Tingkat = tingkat, Spesifikasi = tipe, Lag = lagp,
Statistik = round(stat, 4), CV_5persen = cv5,
Keputusan = ifelse(stat < cv5, "Stasioner", "Tidak stasioner"))
}
uji_pp <- function(x, nama, tingkat, model) {
m <- ur.pp(x, type = "Z-tau", model = model, lags = "short")
stat <- as.numeric(m@teststat)
cv5 <- m@cval[1, "5pct"]
data.frame(Variabel = nama, Tingkat = tingkat, Spesifikasi = model,
Statistik = round(stat, 4), CV_5persen = cv5,
Keputusan = ifelse(stat < cv5, "Stasioner", "Tidak stasioner"))
}
uji_kpss <- function(x, nama, tingkat, tipe) {
m <- ur.kpss(x, type = tipe, lags = "short")
stat <- as.numeric(m@teststat)
cv5 <- m@cval[1, "5pct"]
data.frame(Variabel = nama, Tingkat = tingkat, Spesifikasi = tipe,
Statistik = round(stat, 4), CV_5persen = cv5,
Keputusan = ifelse(stat > cv5, "Tidak stasioner", "Stasioner"))
}
d1 <- diff(ts_all) # selisih pertama
hasil_adf <- rbind(
do.call(rbind, lapply(vars_lvl, function(v) uji_adf(ts_all[, v], v, "Level", "trend"))),
do.call(rbind, lapply(vars_lvl, function(v) uji_adf(d1[, v], v, "Diff-1", "drift")))
)
hasil_pp <- rbind(
do.call(rbind, lapply(vars_lvl, function(v) uji_pp(ts_all[, v], v, "Level", "trend"))),
do.call(rbind, lapply(vars_lvl, function(v) uji_pp(d1[, v], v, "Diff-1", "constant")))
)
hasil_kpss <- rbind(
do.call(rbind, lapply(vars_lvl, function(v) uji_kpss(ts_all[, v], v, "Level", "tau"))),
do.call(rbind, lapply(vars_lvl, function(v) uji_kpss(d1[, v], v, "Diff-1", "mu")))
)
p_adf <- data.frame(
Variabel = vars_lvl,
p_Level = sapply(vars_lvl, function(v) adf.test(ts_all[, v])$p.value),
p_Diff1 = sapply(vars_lvl, function(v) adf.test(d1[, v])$p.value)
)
kable(hasil_adf, row.names = FALSE, caption = "Uji ADF")
| Variabel | Tingkat | Spesifikasi | Lag | Statistik | CV_5persen | Keputusan |
|---|---|---|---|---|---|---|
| LIHSG | Level | trend | 2 | -3.408 | -3.43 | Tidak stasioner |
| LEMAS | Level | trend | 1 | -1.483 | -3.43 | Tidak stasioner |
| LWTI | Level | trend | 2 | -2.539 | -3.43 | Tidak stasioner |
| LKURS | Level | trend | 1 | -3.522 | -3.43 | Stasioner |
| INF | Level | trend | 2 | -5.741 | -3.43 | Stasioner |
| LIHSG | Diff-1 | drift | 1 | -6.075 | -2.88 | Stasioner |
| LEMAS | Diff-1 | drift | 1 | -6.910 | -2.88 | Stasioner |
| LWTI | Diff-1 | drift | 3 | -6.834 | -2.88 | Stasioner |
| LKURS | Diff-1 | drift | 2 | -7.689 | -2.88 | Stasioner |
| INF | Diff-1 | drift | 10 | -5.632 | -2.88 | Stasioner |
kable(hasil_pp, row.names = FALSE, caption = "Uji Phillips-Perron")
| Variabel | Tingkat | Spesifikasi | Statistik | CV_5persen | Keputusan |
|---|---|---|---|---|---|
| LIHSG | Level | trend | -2.885 | -3.449 | Tidak stasioner |
| LEMAS | Level | trend | -1.267 | -3.449 | Tidak stasioner |
| LWTI | Level | trend | -2.897 | -3.449 | Tidak stasioner |
| LKURS | Level | trend | -3.676 | -3.449 | Stasioner |
| INF | Level | trend | -9.617 | -3.449 | Stasioner |
| LIHSG | Diff-1 | constant | -9.189 | -2.887 | Stasioner |
| LEMAS | Diff-1 | constant | -9.886 | -2.887 | Stasioner |
| LWTI | Diff-1 | constant | -9.443 | -2.887 | Stasioner |
| LKURS | Diff-1 | constant | -11.694 | -2.887 | Stasioner |
| INF | Diff-1 | constant | -20.273 | -2.887 | Stasioner |
kable(hasil_kpss, row.names = FALSE, caption = "Uji KPSS")
| Variabel | Tingkat | Spesifikasi | Statistik | CV_5persen | Keputusan |
|---|---|---|---|---|---|
| LIHSG | Level | tau | 0.1263 | 0.146 | Stasioner |
| LEMAS | Level | tau | 0.3545 | 0.146 | Tidak stasioner |
| LWTI | Level | tau | 0.1460 | 0.146 | Stasioner |
| LKURS | Level | tau | 0.2817 | 0.146 | Tidak stasioner |
| INF | Level | tau | 0.0595 | 0.146 | Stasioner |
| LIHSG | Diff-1 | mu | 0.0637 | 0.463 | Stasioner |
| LEMAS | Diff-1 | mu | 0.2669 | 0.463 | Stasioner |
| LWTI | Diff-1 | mu | 0.0424 | 0.463 | Stasioner |
| LKURS | Diff-1 | mu | 0.0625 | 0.463 | Stasioner |
| INF | Diff-1 | mu | 0.0535 | 0.463 | Stasioner |
kable(p_adf, row.names = FALSE, digits = 4, caption = "p-value ADF (tseries::adf.test)")
| Variabel | p_Level | p_Diff1 |
|---|---|---|
| LIHSG | 0.0825 | 0.01 |
| LEMAS | 0.8881 | 0.01 |
| LWTI | 0.5124 | 0.01 |
| LKURS | 0.3855 | 0.01 |
| INF | 0.0100 | 0.01 |
orde <- data.frame(
Variabel = vars_lvl,
ADF = sapply(vars_lvl, function(v) ndiffs(ts_all[, v], alpha = 0.05, test = "adf", type = "trend", max.d = 2)),
PP = sapply(vars_lvl, function(v) ndiffs(ts_all[, v], alpha = 0.05, test = "pp", type = "trend", max.d = 2)),
KPSS = sapply(vars_lvl, function(v) ndiffs(ts_all[, v], alpha = 0.05, test = "kpss", type = "trend", max.d = 2))
)
orde$Kesimpulan <- paste0("I(", orde$ADF, ")")
rownames(orde) <- NULL
kable(orde, caption = "Orde Integrasi")
| Variabel | ADF | PP | KPSS | Kesimpulan |
|---|---|---|---|---|
| LIHSG | 1 | 1 | 1 | I(1) |
| LEMAS | 1 | 1 | 1 | I(1) |
| LWTI | 1 | 1 | 1 | I(1) |
| LKURS | 0 | 0 | 1 | I(0) |
| INF | 0 | 0 | 0 | I(0) |
# Pemeriksaan tambahan LKURS tanpa tren
kable(rbind(
uji_adf(ts_all[, "LKURS"], "LKURS", "Level", "drift"),
data.frame(uji_pp(ts_all[, "LKURS"], "LKURS", "Level", "constant"), Lag = NA)[, c(1:3, 7, 4:6)]
), row.names = FALSE, caption = "Pemeriksaan tambahan LKURS tanpa tren (ADF drift dan PP constant)")
| Variabel | Tingkat | Spesifikasi | Lag | Statistik | CV_5persen | Keputusan |
|---|---|---|---|---|---|---|
| LKURS | Level | drift | 3 | -0.5813 | -2.880 | Tidak stasioner |
| LKURS | Level | constant | NA | -0.7652 | -2.886 | Tidak stasioner |
# Penetapan himpunan variabel
VAR_I1 <- c("LIHSG", "LEMAS", "LWTI", "LKURS") # terintegrasi orde 1
VAR_I0 <- c("INF") # stasioner di level
cat("Variabel I(1):", VAR_I1, "\nVariabel I(0):", VAR_I0, "\n")
## Variabel I(1): LIHSG LEMAS LWTI LKURS
## Variabel I(0): INF
Interpretasi. Pada ADF level (nilai kritis 5 persen -3,43), LIHSG (-3,408), LEMAS (-1,483), dan LWTI (-2,539) tidak menolak H0 sehingga tidak stasioner; LIHSG berada sangat dekat dengan batas penolakan. LKURS (-3,522) dan INF (-5,741) menolak H0 pada spesifikasi bertren. Pada selisih pertama, seluruh variabel menolak H0 (statistik -5,63 sampai -7,69 terhadap nilai kritis -2,88) sehingga semuanya stasioner setelah satu kali diferensiasi. Uji PP memberi pola yang sama (LIHSG -2,885, LEMAS -1,267, LWTI -2,897 tidak stasioner terhadap nilai kritis -3,449; LKURS -3,676 dan INF -9,617 stasioner; semua stasioner pada selisih pertama). KPSS pada level menolak kestasioneran untuk LEMAS (0,3545) dan LKURS (0,2817) karena melebihi nilai kritis 0,146, sedangkan LIHSG (0,1263), LWTI (0,1460), dan INF (0,0595) tidak menolak, dengan LWTI tepat berada di batas. Pada selisih pertama KPSS tidak menolak kestasioneran untuk semua variabel. P-value ADF dari paket tseries mendukung temuan tersebut: pada level LIHSG (0,083), LEMAS (0,888), dan LWTI (0,512) tidak signifikan, sedangkan INF dan seluruh selisih pertama bernilai 0,01 (batas bawah tabel).
Hasil terhadap LKURS bertentangan antaruji pada spesifikasi bertren
(ADF dan PP menolak akar unit, KPSS menolak kestasioneran). Pemeriksaan
tanpa tren menyelesaikan keraguan ini: ADF dengan drift
(-0,5813 terhadap nilai kritis -2,88) dan PP dengan constant
(-0,7652 terhadap nilai kritis -2,887) tidak menolak akar unit. Kesan
stasioner pada spesifikasi bertren dengan demikian hanya berasal dari
tren deterministik, sehingga LKURS ditetapkan I(1). Fungsi
ndiffs memperkuat hasil ini untuk variabel lain: LIHSG,
LEMAS, dan LWTI bernilai 1 pada ketiga uji (I(1)) dan INF bernilai 0
(I(0)).
Orde integrasi yang campuran, yaitu empat variabel I(1) dan satu variabel I(0), memiliki dua konsekuensi. Pertama, metode Johansen hanya sah untuk variabel yang seluruhnya I(1), sehingga inflasi dikeluarkan dari sistem VECM. Kedua, ARDL dengan bounds test dapat memuat campuran I(0) dan I(1) sehingga inflasi tetap diikutsertakan pada ARDL dan uji Toda-Yamamoto.
Kointegrasi diuji dengan dua pendekatan: uji Johansen pada variabel I(1) dan ARDL bounds test pada seluruh variabel.
Sintaks.
Y4 <- ts_all[, VAR_I1]
pilih_lag <- VARselect(Y4, lag.max = 8, type = "const")
pilih_lag$selection
## AIC(n) HQ(n) SC(n) FPE(n)
## 2 1 1 2
K <- max(2L, as.integer(pilih_lag$selection["SC(n)"]))
cat("Lag K (VAR level) yang dipakai:", K, " -> lag selisih VECM =", K - 1, "\n")
## Lag K (VAR level) yang dipakai: 2 -> lag selisih VECM = 1
jo_tr <- ca.jo(Y4, type = "trace", ecdet = "const", K = K, spec = "transitory")
jo_ei <- ca.jo(Y4, type = "eigen", ecdet = "const", K = K, spec = "transitory")
tabel_rank <- function(jo, nama_stat) {
tb <- data.frame(H0 = rownames(jo@cval), Stat = jo@teststat,
CV5 = jo@cval[, "5pct"], row.names = NULL)
tb <- tb[nrow(tb):1, ] # urutan r = 0, r <= 1, ...
tb$Keputusan <- ifelse(tb$Stat > tb$CV5, "Tolak H0", "Gagal tolak H0")
names(tb)[2] <- nama_stat
tb
}
tb_tr <- tabel_rank(jo_tr, "Trace")
tb_ei <- tabel_rank(jo_ei, "MaxEigen")
kable(tb_tr, row.names = FALSE, digits = 3, caption = "Ringkasan Rank Johansen (Trace)")
| H0 | Trace | CV5 | Keputusan |
|---|---|---|---|
| r = 0 | | 79.691 | 53.12 | Tolak H0 |
| r <= 1 | | 37.154 | 34.91 | Tolak H0 |
| r <= 2 | | 12.455 | 19.96 | Gagal tolak H0 |
| r <= 3 | | 4.682 | 9.24 | Gagal tolak H0 |
kable(tb_ei, row.names = FALSE, digits = 3, caption = "Ringkasan Rank Johansen (Maximum Eigenvalue)")
| H0 | MaxEigen | CV5 | Keputusan |
|---|---|---|---|
| r = 0 | | 42.537 | 28.14 | Tolak H0 |
| r <= 1 | | 24.699 | 22.00 | Tolak H0 |
| r <= 2 | | 7.773 | 15.67 | Gagal tolak H0 |
| r <= 3 | | 4.682 | 9.24 | Gagal tolak H0 |
# jumlah penolakan berturut-turut mulai dari r = 0 = rank kointegrasi
r_trace <- sum(cumsum(tb_tr$Keputusan != "Tolak H0") == 0)
r_eigen <- sum(cumsum(tb_ei$Keputusan != "Tolak H0") == 0)
cat("Rank kointegrasi: Trace =", r_trace, "| MaxEigen =", r_eigen, "\n")
## Rank kointegrasi: Trace = 2 | MaxEigen = 2
r <- r_trace
cat("Rank (r) yang dipakai:", r, "\n")
## Rank (r) yang dipakai: 2
Interpretasi. Kriteria pemilihan lag menghasilkan
AIC = 2, HQ = 1, SC = 1, dan FPE = 2. Lag dipilih berdasarkan SC (satu)
tetapi dinaikkan menjadi K = 2 karena persyaratan minimum
ca.jo, sehingga VECM memiliki satu lag selisih. Pada uji
trace, statistik untuk r = 0 (79,69) melebihi nilai kritis 5
persen (53,12) sehingga H0 ditolak; untuk r ≤ 1 (37,15) juga melebihi
34,91 sehingga ditolak dengan selisih yang tipis; untuk r ≤ 2 (12,46)
lebih kecil daripada 19,96 sehingga H0 tidak ditolak dan prosedur
berhenti. Uji maximum eigenvalue memberi kesimpulan yang sama
(42,54 > 28,14 dan 24,70 > 22,00 ditolak; 7,77 < 15,67 tidak
ditolak). Kedua uji sepakat bahwa terdapat dua vektor kointegrasi (r =
2), artinya ada dua hubungan keseimbangan jangka panjang antara LIHSG,
LEMAS, LWTI, dan LKURS. Karena penolakan pada r ≤ 1 relatif tipis, hasil
ini perlu dibaca bersama uji stabilitas pada subbab 4.7.4 dan dilaporkan
sebagai kesimpulan yang sensitif terhadap spesifikasi.
Sintaks.
formula_ardl <- LIHSG ~ LEMAS + LWTI + LKURS + INF
sel_ardl <- auto_ardl(formula_ardl, data = ts_all,
max_order = c(4, 4, 4, 4, 4), selection = "BIC")
kable(head(sel_ardl$top_orders, 5), digits = 1,
caption = "Lima kandidat orde ARDL terbaik (BIC)")
| LIHSG | LEMAS | LWTI | LKURS | INF | BIC |
|---|---|---|---|---|---|
| 1 | 1 | 0 | 1 | 0 | -407.1 |
| 1 | 1 | 0 | 1 | 1 | -405.0 |
| 1 | 1 | 1 | 1 | 1 | -402.9 |
| 1 | 2 | 0 | 1 | 0 | -401.4 |
| 2 | 2 | 0 | 1 | 0 | -400.1 |
orde_ardl <- sel_ardl$best_order
mod_ardl <- sel_ardl$best_model
cat("Orde ARDL terpilih (LIHSG, LEMAS, LWTI, LKURS, INF):", orde_ardl, "\n")
## Orde ARDL terpilih (LIHSG, LEMAS, LWTI, LKURS, INF): 1 1 0 1 0
# Case 3 = intercept tak terbatas, tanpa tren
bt_f <- bounds_f_test(mod_ardl, case = 3)
bt_t <- bounds_t_test(mod_ardl, case = 3)
print(bt_f)
##
## Bounds F-test (Wald) for no cointegration
##
## data: d(LIHSG) ~ L(LIHSG, 1) + L(LEMAS, 1) + LWTI + L(LKURS, 1) + INF + d(LEMAS) + d(LKURS)
## F = 3.2, p-value = 0.2
## alternative hypothesis: Possible cointegration
## null values:
## k T
## 4 1000
print(bt_f$tab)
## statistic p.value
## F 3.194 0.1547
print(bt_t)
##
## Bounds t-test for no cointegration
##
## data: d(LIHSG) ~ L(LIHSG, 1) + L(LEMAS, 1) + LWTI + L(LKURS, 1) + INF + d(LEMAS) + d(LKURS)
## t = -3.3, p-value = 0.2
## alternative hypothesis: Possible cointegration
## null values:
## k T
## 4 1000
Interpretasi. Orde ARDL terbaik menurut BIC (-407,1) adalah ARDL(1,1,0,1,0): LIHSG memakai satu lag, LEMAS satu lag, LWTI tanpa lag (hanya efek bersamaan), LKURS satu lag, dan INF tanpa lag. Statistik F bounds sebesar 3,194 (p-value 0,155) dan statistik t bounds sebesar -3,3 (p-value 0,2) berada jauh di atas 0,05, sehingga H0 tidak adanya hubungan jangka panjang tidak ditolak. ARDL dengan demikian tidak menemukan kointegrasi, berbeda dengan Johansen.
Perbedaan ini dapat dijelaskan oleh asumsi masing-masing metode. ARDL satu persamaan mengasumsikan variabel bebas weakly exogenous terhadap parameter jangka panjang, sedangkan VECM pada subbab 4.6.2 menunjukkan bahwa penyesuaian terhadap vektor kointegrasi pertama justru terjadi pada LEMAS dan LWTI, bukan pada LIHSG. Penjelasan ini masih merupakan dugaan karena uji weak exogeneity belum dilakukan. Karena konflik tersebut, VECM diposisikan sebagai model utama hubungan jangka panjang, sedangkan ARDL dipakai untuk dinamika jangka pendek.
Pemilihan model mengikuti kaidah: seluruh variabel I(0) memakai VAR level; seluruh I(1) dan tidak terkointegrasi memakai VAR pada selisih; seluruh I(1) dan terkointegrasi memakai VECM; campuran I(0) dan I(1) memakai ARDL.
Sintaks.
cat("Variabel I(0):", ifelse(length(VAR_I0) > 0, paste(VAR_I0, collapse = ", "), "-"), "\n")
## Variabel I(0): INF
cat("Variabel I(1):", ifelse(length(VAR_I1) > 0, paste(VAR_I1, collapse = ", "), "-"), "\n")
## Variabel I(1): LIHSG, LEMAS, LWTI, LKURS
if (length(VAR_I0) > 0 && length(VAR_I1) > 0) {
cat("-> Orde integrasi CAMPURAN: ARDL (bounds test) layak sebagai model utama.\n")
}
## -> Orde integrasi CAMPURAN: ARDL (bounds test) layak sebagai model utama.
if (length(VAR_I1) >= 2) {
if (r == 0) {
cat("-> Johansen: TIDAK ada kointegrasi -> gunakan VAR pada selisih pertama.\n")
} else if (r < length(VAR_I1)) {
cat("-> Johansen: ada", r, "vektor kointegrasi -> gunakan VECM (rank =", r, ").\n")
} else {
cat("-> Rank penuh: seluruh variabel stasioner -> gunakan VAR pada level.\n")
}
}
## -> Johansen: ada 2 vektor kointegrasi -> gunakan VECM (rank = 2 ).
stopifnot(r >= 1)
Interpretasi. Orde integrasi bersifat campuran sehingga ARDL secara metodologis layak dipakai, dan Johansen menemukan dua vektor kointegrasi sehingga VECM dengan rank dua diterapkan pada empat variabel I(1). Pernyataan bahwa ARDL layak sebagai model utama pada keluaran hanya didasarkan pada orde integrasi. Karena bounds test tidak signifikan, ARDL ditempatkan sebagai model pelengkap jangka pendek dan VECM sebagai model hubungan jangka panjang.
Model ARDL(1,1,0,1,0) diestimasi dengan OLS pada bentuk level (UECM), kemudian diturunkan koefisien jangka panjang dan model koreksi kesalahan terbatas (ECM).
Sintaks.
summary(mod_ardl)
##
## Time series regression with "ts" data:
## Start = 2017(2), End = 2026(8)
##
## Call:
## dynlm::dynlm(formula = full_formula, data = data, start = start,
## end = end)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.10593 -0.01949 -0.00039 0.02137 0.08985
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.93306 0.87479 2.21 0.02925 *
## L(LIHSG, 1) 0.85965 0.04237 20.29 < 0.0000000000000002 ***
## LEMAS 0.30548 0.08647 3.53 0.00061 ***
## L(LEMAS, 1) -0.28454 0.08497 -3.35 0.00112 **
## LWTI 0.05359 0.01623 3.30 0.00130 **
## LKURS -0.91333 0.15893 -5.75 0.000000087 ***
## L(LKURS, 1) 0.80057 0.16369 4.89 0.000003560 ***
## INF 0.00293 0.01028 0.29 0.77594
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.0355 on 107 degrees of freedom
## Multiple R-squared: 0.924, Adjusted R-squared: 0.919
## F-statistic: 185 on 7 and 107 DF, p-value: <0.0000000000000002
# Koefisien jangka panjang (long-run multipliers)
lr_ardl <- multipliers(mod_ardl, type = "lr")
kable(lr_ardl, digits = 4, caption = "Koefisien Jangka Panjang ARDL")
| Term | Estimate | Std. Error | t value | Pr(>|t|) |
|---|---|---|---|---|
| (Intercept) | 13.7729 | 6.1367 | 2.2444 | 0.0269 |
| LEMAS | 0.1492 | 0.1363 | 1.0945 | 0.2762 |
| LWTI | 0.3818 | 0.0989 | 3.8611 | 0.0002 |
| LKURS | -0.8034 | 0.7360 | -1.0915 | 0.2775 |
| INF | 0.0209 | 0.0732 | 0.2854 | 0.7759 |
# Model koreksi kesalahan (ECM) terbatas
mod_recm <- recm(mod_ardl, case = 3)
summary(mod_recm)
##
## Time series regression with "zooreg" data:
## Start = Feb 2017, End = Aug 2026
##
## Call:
## dynlm::dynlm(formula = full_formula, data = data, start = start,
## end = end)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.10593 -0.01949 -0.00039 0.02137 0.08985
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.9331 0.4744 4.07 0.000086741 ***
## d(LEMAS) 0.3055 0.0839 3.64 0.00041 ***
## d(LKURS) -0.9133 0.1479 -6.18 0.000000011 ***
## ect -0.1404 0.0345 -4.07 0.000088150 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.0348 on 111 degrees of freedom
## (0 observations deleted due to missingness)
## Multiple R-squared: 0.402, Adjusted R-squared: 0.385
## F-statistic: 24.8 on 3 and 111 DF, p-value: 0.00000000000229
Interpretasi. Model memiliki \(R^2\) = 0,924 dan \(R^2\) terkoreksi = 0,919 dengan uji F yang sangat signifikan. Namun \(R^2\) yang tinggi pada bentuk level sebagian besar berasal dari lag LIHSG sendiri (koefisien 0,860), sehingga tidak boleh dibaca sebagai bukti kuatnya pengaruh variabel lain. Koefisien LEMAS bersamaan (0,305) positif dan signifikan, sedangkan lag LEMAS (-0,285) negatif dan signifikan, sehingga efek bersih emas pada level hampir saling meniadakan. Koefisien LKURS bersamaan (-0,913) negatif dan lag-nya (0,801) positif, keduanya signifikan, yang berarti pelemahan rupiah menekan IHSG pada bulan yang sama dan sebagian besar tekanan itu berbalik pada bulan berikutnya. LWTI (0,054) signifikan positif, sedangkan INF (0,003; p = 0,776) tidak signifikan.
Koefisien jangka panjang hanya signifikan untuk LWTI (0,382; p = 0,0002): kenaikan harga minyak 1 persen berasosiasi dengan kenaikan IHSG sekitar 0,38 persen. LEMAS (0,149; p = 0,276), LKURS (-0,803; p = 0,278), dan INF (0,021; p = 0,776) tidak signifikan terutama karena galat baku jangka panjang yang besar. Pada ECM, kenaikan emas 1 persen menaikkan IHSG sekitar 0,31 persen pada bulan yang sama (p = 0,0004) dan depresiasi rupiah 1 persen menurunkan IHSG sekitar 0,91 persen (p < 0,001). Koefisien ECT bernilai -0,1404 dan signifikan, tetapi karena bounds test tidak menolak H0 (subbab 4.5), koefisien ini tidak boleh ditafsirkan sebagai kecepatan koreksi menuju keseimbangan jangka panjang.
Karena Johansen menemukan dua vektor kointegrasi, model yang dipakai adalah VECM dengan rank dua (bukan VAR pada selisih). Vektor pertama dinormalisasi pada LIHSG dan vektor kedua pada LEMAS.
Sintaks.
vecm_ls <- cajorls(jo_tr, r = r)
cat("===== VECM: vektor kointegrasi (beta) =====\n")
## ===== VECM: vektor kointegrasi (beta) =====
print(vecm_ls$beta)
## ect1 ect2
## LIHSG.l1 1.00000000000000000000 0.0000
## LEMAS.l1 0.00000000000000002776 1.0000
## LWTI.l1 -0.40603854416083501322 0.4177
## LKURS.l1 0.02585947382167508302 -6.0966
## constant -7.25558914242352948065 49.3400
cat("\n----- Koefisien jangka pendek & ECT per persamaan -----\n")
##
## ----- Koefisien jangka pendek & ECT per persamaan -----
ringkas_vecm <- summary(vecm_ls$rlm)
for (i in seq_along(ringkas_vecm)) {
cat("\n>>", names(ringkas_vecm)[i], "\n")
print(round(ringkas_vecm[[i]]$coefficients, 4))
}
##
## >> Response LIHSG.d
## Estimate Std. Error t value Pr(>|t|)
## ect1 0.0018 0.0380 0.0471 0.9625
## ect2 -0.0419 0.0189 -2.2166 0.0287
## LIHSG.dl1 0.2183 0.1139 1.9174 0.0578
## LEMAS.dl1 -0.1923 0.1108 -1.7354 0.0855
## LWTI.dl1 -0.0211 0.0359 -0.5860 0.5591
## LKURS.dl1 -0.1838 0.2163 -0.8499 0.3973
##
## >> Response LEMAS.d
## Estimate Std. Error t value Pr(>|t|)
## ect1 0.1450 0.0342 4.2335 0.0000
## ect2 -0.0625 0.0171 -3.6665 0.0004
## LIHSG.dl1 0.1224 0.1027 1.1915 0.2361
## LEMAS.dl1 -0.0850 0.1000 -0.8498 0.3973
## LWTI.dl1 0.0656 0.0324 2.0238 0.0455
## LKURS.dl1 0.1240 0.1951 0.6358 0.5262
##
## >> Response LWTI.d
## Estimate Std. Error t value Pr(>|t|)
## ect1 0.3053 0.1124 2.7151 0.0077
## ect2 -0.0732 0.0560 -1.3065 0.1942
## LIHSG.dl1 -0.0699 0.3372 -0.2074 0.8361
## LEMAS.dl1 -0.4240 0.3282 -1.2918 0.1992
## LWTI.dl1 0.0913 0.1064 0.8577 0.3930
## LKURS.dl1 -1.8394 0.6404 -2.8721 0.0049
##
## >> Response LKURS.d
## Estimate Std. Error t value Pr(>|t|)
## ect1 0.0190 0.0182 1.0459 0.2979
## ect2 0.0394 0.0090 4.3539 0.0000
## LIHSG.dl1 -0.0835 0.0545 -1.5329 0.1282
## LEMAS.dl1 -0.0911 0.0530 -1.7171 0.0888
## LWTI.dl1 0.0074 0.0172 0.4285 0.6692
## LKURS.dl1 -0.0220 0.1035 -0.2123 0.8323
# Representasi VAR level dari VECM (dipakai untuk diagnostik, Granger, IRF, FEVD)
vec_est <- vec2var(jo_tr, r = r)
Interpretasi vektor kointegrasi. Vektor pertama dapat ditulis ECT1 = LIHSG - 0,406 LWTI + 0,026 LKURS - 7,256, sehingga dalam keseimbangan jangka panjang LIHSG = 0,406 LWTI - 0,026 LKURS + 7,256. Hubungan jangka panjang IHSG terutama dikaitkan dengan harga minyak (elastisitas positif sekitar 0,41), sedangkan pengaruh kurs hampir nol. Nilai ini searah dengan koefisien jangka panjang ARDL untuk LWTI (0,38). Koefisien LEMAS pada vektor ini nol karena normalisasi by construction ketika r = 2, sehingga nol tersebut bukan bukti bahwa emas tidak berpengaruh. Vektor kedua, ECT2 = LEMAS + 0,418 LWTI - 6,097 LKURS + 49,34, tidak memuat LIHSG dan merupakan hubungan keseimbangan antarvariabel penjelas (emas, minyak, dan kurs).
Interpretasi koefisien penyesuaian. Pada persamaan LIHSG, ECT1 tidak signifikan (0,0018; p = 0,9625), sedangkan ECT2 negatif dan signifikan (-0,0419; p = 0,0287). IHSG tidak menyesuaikan diri terhadap hubungan jangka panjang pertama tetapi merespons penyimpangan dari hubungan kedua. Pada persamaan LEMAS kedua ECT signifikan (ECT1 = 0,1450; ECT2 = -0,0625), pada persamaan LWTI hanya ECT1 yang signifikan (0,3053; p = 0,0077), dan pada persamaan LKURS hanya ECT2 yang signifikan (0,0394; p < 0,001). Penyesuaian terhadap hubungan pertama dengan demikian dilakukan oleh LEMAS dan LWTI, bukan oleh LIHSG. Pada koefisien jangka pendek, lag LIHSG (0,2183; p = 0,058) dan lag LEMAS (-0,1923; p = 0,086) berpengaruh marginal pada IHSG, sedangkan lag LWTI dan LKURS tidak signifikan; pada persamaan LWTI, lag LKURS berpengaruh negatif signifikan (-1,8394; p = 0,0049).
Diagnostik dilakukan pada kedua model untuk menilai kelayakan inferensi: signifikansi parameter, autokorelasi, heteroskedastisitas, normalitas, spesifikasi, dan stabilitas.
Sintaks.
cat("===== Signifikansi parameter ARDL (OLS) =====\n")
## ===== Signifikansi parameter ARDL (OLS) =====
print(coeftest(mod_ardl))
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.93306 0.87479 2.21 0.02925 *
## L(LIHSG, 1) 0.85965 0.04237 20.29 < 0.0000000000000002 ***
## LEMAS 0.30548 0.08647 3.53 0.00061 ***
## L(LEMAS, 1) -0.28454 0.08497 -3.35 0.00112 **
## LWTI 0.05359 0.01623 3.30 0.00130 **
## LKURS -0.91333 0.15893 -5.75 0.000000087 ***
## L(LKURS, 1) 0.80057 0.16369 4.89 0.000003560 ***
## INF 0.00293 0.01028 0.29 0.77594
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
cat("\n----- ARDL dengan galat baku HAC Newey-West -----\n")
##
## ----- ARDL dengan galat baku HAC Newey-West -----
coba(print(coeftest(mod_ardl, vcov. = NeweyWest(mod_ardl, lag = 4, prewhite = FALSE))))
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.93306 0.60385 3.20 0.0018 **
## L(LIHSG, 1) 0.85965 0.04199 20.48 < 0.0000000000000002 ***
## LEMAS 0.30548 0.12180 2.51 0.0136 *
## L(LEMAS, 1) -0.28454 0.13356 -2.13 0.0354 *
## LWTI 0.05359 0.01784 3.00 0.0033 **
## LKURS -0.91333 0.11447 -7.98 0.0000000000018 ***
## L(LKURS, 1) 0.80057 0.12133 6.60 0.0000000016378 ***
## INF 0.00293 0.00975 0.30 0.7641
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# VECM: ECT pada persamaan LIHSG
idx_ihsg <- grep("LIHSG", names(ringkas_vecm))[1]
cat("\nECT pada persamaan LIHSG:\n")
##
## ECT pada persamaan LIHSG:
print(round(ringkas_vecm[[idx_ihsg]]$coefficients[grep("^ect",
rownames(ringkas_vecm[[idx_ihsg]]$coefficients)), , drop = FALSE], 4))
## Estimate Std. Error t value Pr(>|t|)
## ect1 0.0018 0.0380 0.0471 0.9625
## ect2 -0.0419 0.0189 -2.2166 0.0287
Interpretasi. Pada uji t biasa, seluruh koefisien ARDL signifikan pada taraf 5 persen kecuali INF (p = 0,776); L(LIHSG), LKURS, dan L(LKURS) bahkan signifikan pada taraf 0,1 persen. Dengan galat baku HAC Newey-West kesimpulan tidak berubah: LEMAS (p = 0,0136), L(LEMAS) (p = 0,0354), LWTI (p = 0,0033), LKURS, dan L(LKURS) tetap signifikan, sedangkan INF tetap tidak signifikan (p = 0,764). Konsistensi kedua versi menunjukkan bahwa kesimpulan tentang parameter tidak bergantung pada asumsi homoskedastisitas dan bebas autokorelasi. Pada VECM, ECT persamaan LIHSG hanya ECT2 yang signifikan (-0,0419; p = 0,0287).
Sintaks.
res_a <- as.numeric(residuals(mod_ardl))
cat("[ARDL] Breusch-Godfrey LM (orde 12):\n"); coba(print(bgtest(mod_ardl, order = 12)))
## [ARDL] Breusch-Godfrey LM (orde 12):
##
## Breusch-Godfrey test for serial correlation of order up to 12
##
## data: mod_ardl
## LM test = 23, df = 12, p-value = 0.03
cat("\n[ARDL] Ljung-Box (lag 12):\n"); print(Box.test(res_a, lag = 12, type = "Ljung-Box"))
##
## [ARDL] Ljung-Box (lag 12):
##
## Box-Ljung test
##
## data: res_a
## X-squared = 22, df = 12, p-value = 0.03
cat("\n[VECM] Portmanteau (adjusted, lag 12):\n")
##
## [VECM] Portmanteau (adjusted, lag 12):
coba(print(serial.test(vec_est, lags.pt = 12, type = "PT.adjusted")))
##
## Portmanteau Test (adjusted)
##
## data: Residuals of VAR object vec_est
## Chi-squared = 167, df = 164, p-value = 0.4
## $serial
##
## Portmanteau Test (adjusted)
##
## data: Residuals of VAR object vec_est
## Chi-squared = 167, df = 164, p-value = 0.4
cat("\n[VECM] Breusch-Godfrey LM (lag 6):\n")
##
## [VECM] Breusch-Godfrey LM (lag 6):
coba(print(serial.test(vec_est, lags.bg = 6, type = "BG")))
##
## Breusch-Godfrey LM test
##
## data: Residuals of VAR object vec_est
## Chi-squared = 94, df = 96, p-value = 0.5
## $serial
##
## Breusch-Godfrey LM test
##
## data: Residuals of VAR object vec_est
## Chi-squared = 94, df = 96, p-value = 0.5
Interpretasi. Pada ARDL, uji Breusch-Godfrey (LM = 23; p = 0,03) dan Ljung-Box (p = 0,03) sama-sama menolak H0 sehingga residual berautokorelasi. Dampaknya galat baku OLS dapat bias, yang telah dikompensasi dengan galat baku HAC pada subbab 4.7.1. Sebaliknya, VECM lolos uji: Portmanteau (statistik 167, derajat bebas 164; p = 0,4) dan Breusch-Godfrey (statistik 94, derajat bebas 96; p = 0,5) tidak menolak H0 sehingga residual VECM bebas autokorelasi.
Sintaks.
cat("[ARDL] Breusch-Pagan:\n"); coba(print(bptest(mod_ardl)))
## [ARDL] Breusch-Pagan:
##
## studentized Breusch-Pagan test
##
## data: mod_ardl
## BP = 26, df = 7, p-value = 0.0006
cat("\n[ARDL] White (fitted & fitted^2):\n")
##
## [ARDL] White (fitted & fitted^2):
e2 <- res_a^2
f <- as.numeric(fitted(mod_ardl))
aux <- lm(e2 ~ f + I(f^2))
LM <- length(e2) * summary(aux)$r.squared
cat("White LM =", round(LM, 3), "| p =", round(pchisq(LM, df = 2, lower.tail = FALSE), 4), "\n")
## White LM = 2.394 | p = 0.3021
cat("\n[ARDL] ARCH-LM (lag 12, via Ljung-Box residual kuadrat):\n")
##
## [ARDL] ARCH-LM (lag 12, via Ljung-Box residual kuadrat):
print(Box.test(res_a^2, lag = 12, type = "Ljung-Box"))
##
## Box-Ljung test
##
## data: res_a^2
## X-squared = 28, df = 12, p-value = 0.006
cat("\n[VECM] ARCH-LM multivariat (lag 12):\n")
##
## [VECM] ARCH-LM multivariat (lag 12):
coba(print(arch.test(vec_est, lags.multi = 12, multivariate.only = TRUE)))
##
## ARCH (multivariate)
##
## data: Residuals of VAR object vec_est
## Chi-squared = 1020, df = 1200, p-value = 1
## $arch.mul
##
## ARCH (multivariate)
##
## data: Residuals of VAR object vec_est
## Chi-squared = 1020, df = 1200, p-value = 1
# Uji normalitas residual & spesifikasi
cat("\n[ARDL] Jarque-Bera:\n"); print(jarque.bera.test(res_a))
##
## [ARDL] Jarque-Bera:
##
## Jarque Bera Test
##
## data: res_a
## X-squared = 12, df = 2, p-value = 0.003
cat("\n[ARDL] Ramsey RESET:\n"); coba(print(resettest(mod_ardl, power = 2:3, type = "fitted")))
##
## [ARDL] Ramsey RESET:
##
## RESET test
##
## data: mod_ardl
## RESET = 0.45, df1 = 1, df2 = 106, p-value = 0.5
cat("\n[VECM] Normalitas residual multivariat:\n")
##
## [VECM] Normalitas residual multivariat:
coba(print(normality.test(vec_est, multivariate.only = TRUE)))
## $JB
##
## JB-Test (multivariate)
##
## data: Residuals of VAR object vec_est
## Chi-squared = 139, df = 8, p-value <0.0000000000000002
##
##
## $Skewness
##
## Skewness only (multivariate)
##
## data: Residuals of VAR object vec_est
## Chi-squared = 25, df = 4, p-value = 0.00005
##
##
## $Kurtosis
##
## Kurtosis only (multivariate)
##
## data: Residuals of VAR object vec_est
## Chi-squared = 113, df = 4, p-value <0.0000000000000002
## $jb.mul
## $jb.mul$JB
##
## JB-Test (multivariate)
##
## data: Residuals of VAR object vec_est
## Chi-squared = 139, df = 8, p-value <0.0000000000000002
##
##
## $jb.mul$Skewness
##
## Skewness only (multivariate)
##
## data: Residuals of VAR object vec_est
## Chi-squared = 25, df = 4, p-value = 0.00005
##
##
## $jb.mul$Kurtosis
##
## Kurtosis only (multivariate)
##
## data: Residuals of VAR object vec_est
## Chi-squared = 113, df = 4, p-value <0.0000000000000002
Interpretasi. Pada ARDL, Breusch-Pagan (p = 0,0006) dan ARCH-LM (p = 0,006) menolak H0 sehingga terdapat indikasi heteroskedastisitas dan efek ARCH, sedangkan uji White (LM = 2,394; p = 0,302) tidak menolak. Perbedaan ini wajar karena uji White versi ini hanya memakai nilai fitted sehingga dayanya lebih rendah daripada Breusch-Pagan. Kesimpulan yang aman adalah heteroskedastisitas terdeteksi pada dua dari tiga uji dan telah ditangani dengan galat baku HAC. Pada VECM, ARCH-LM multivariat (statistik 1.020, derajat bebas 1.200; p = 1) tidak menolak H0 sehingga tidak ada masalah heteroskedastisitas.
Uji Jarque-Bera pada ARDL (p = 0,003) menolak normalitas, dan pada VECM uji normalitas multivariat juga menolak H0 (p < 0,001) dengan penyumbang terbesar kurtosis (p < 0,001; skewness p = 0,00005). Ekor distribusi residual lebih tebal daripada normal, yang wajar pada data keuangan. Ketidaknormalan tidak merusak konsistensi estimasi tetapi membatasi ketepatan inferensi pada sampel kecil dan dicatat sebagai keterbatasan. Uji RESET (p = 0,5) tidak menolak kebenaran bentuk fungsional, tetapi hasil ini tidak dijadikan dasar utama kesimpulan.
Sintaks.
# (a) ARDL: CUSUM dan CUSUMSQ
coba({
Xm <- model.matrix(mod_ardl)
yv <- as.numeric(model.response(model.frame(mod_ardl)))
dfc <- data.frame(y = yv, Xm[, -1, drop = FALSE])
colnames(dfc) <- c("y", make.names(colnames(Xm)[-1]))
cus <- efp(y ~ ., data = dfc, type = "Rec-CUSUM")
cat("[ARDL] Uji CUSUM:\n"); print(sctest(cus))
# CUSUMSQ (pita 5% pendekatan Durbin, 1969)
w <- recresid(y ~ ., data = dfc)
m <- length(w)
csq <- cumsum(w^2) / sum(w^2)
c0 <- 1.358 / sqrt(m / 2 - 1)
tt <- (1:m) / m
keluar <- any(csq > tt + c0 | csq < tt - c0)
cat("[ARDL] CUSUMSQ keluar dari pita 5%? ", ifelse(keluar, "YA (tidak stabil)", "TIDAK (stabil)"), "\n")
par(mfrow = c(1, 2))
plot(cus, main = "CUSUM ARDL")
plot(tt, csq, type = "l", lwd = 2, ylim = c(-0.2, 1.2), xlab = "Proporsi sampel",
ylab = "CUSUMSQ", main = "CUSUMSQ ARDL")
lines(tt, tt + c0, col = "red", lty = 2); lines(tt, tt - c0, col = "red", lty = 2)
par(mfrow = c(1, 1))
})
## [ARDL] Uji CUSUM:
##
## Recursive CUSUM test
##
## data: cus
## S = 0.81, p-value = 0.1
##
## [ARDL] CUSUMSQ keluar dari pita 5%? YA (tidak stabil)
# (b) VECM: akar karakteristik matriks pendamping
akar_modulus <- function(Alist) {
n <- nrow(Alist[[1]]); p <- length(Alist)
top <- do.call(cbind, Alist)
M <- if (p > 1) rbind(top, cbind(diag(n * (p - 1)), matrix(0, n * (p - 1), n))) else top
sort(Mod(eigen(M)$values), decreasing = TRUE)
}
akar <- akar_modulus(vec_est$A)
cat("[VECM] Modulus akar karakteristik (terbesar -> terkecil):\n"); print(round(akar, 4))
## [VECM] Modulus akar karakteristik (terbesar -> terkecil):
## [1] 1.0000 1.0000 0.8630 0.4600 0.3827 0.3827 0.2986 0.2986
cat("Jumlah akar ~ 1 (|z| > 0.999):", sum(akar > 0.999),
"| diharapkan n - r =", length(VAR_I1) - r, "\n")
## Jumlah akar ~ 1 (|z| > 0.999): 2 | diharapkan n - r = 2
cat("Akar terbesar di luar unit root:", round(akar[akar < 0.999][1], 4), "(harus < 1)\n")
## Akar terbesar di luar unit root: 0.863 (harus < 1)
# CUSUM pada VAR level
var_lvl <- VAR(Y4, p = K, type = "const")
plot(stability(var_lvl, type = "OLS-CUSUM"))
Interpretasi. Uji CUSUM pada ARDL (S = 0,81; p = 0,1) tidak menolak kestabilan parameter pada taraf 5 persen, tetapi kurva CUSUMSQ keluar dari pita kepercayaan sehingga model dinyatakan tidak stabil menurut CUSUMSQ. CUSUMSQ lebih sensitif terhadap perubahan varians residual (misalnya guncangan pandemi), sejalan dengan temuan heteroskedastisitas, dan dilaporkan sebagai keterbatasan ARDL. Pada VECM, modulus akar karakteristik adalah 1,000; 1,000; 0,863; 0,460; 0,383; 0,383; 0,299; dan 0,299. Dua akar bernilai satu sesuai dengan n - r = 4 - 2 = 2, dan akar terbesar berikutnya (0,863) berada di dalam lingkaran satuan. Kondisi ini sesuai teori untuk sistem dengan dua vektor kointegrasi sehingga VECM stabil dan sekaligus mendukung pemilihan rank dua. Grafik CUSUM VAR level dibaca sebagai pelengkap: proses empiris yang berada di dalam pita 5 persen menandakan parameter konstan.
ringkasan_diag <- data.frame(
Aspek = c("Autokorelasi", "Autokorelasi", "Autokorelasi", "Autokorelasi",
"Heteroskedastisitas", "Heteroskedastisitas", "Heteroskedastisitas", "Heteroskedastisitas",
"Normalitas", "Normalitas", "Spesifikasi", "Stabilitas", "Stabilitas", "Stabilitas"),
Uji = c("Breusch-Godfrey (orde 12)", "Ljung-Box (lag 12)",
"Portmanteau (lag 12)", "Breusch-Godfrey multivariat (lag 6)",
"Breusch-Pagan", "White (fitted)", "ARCH-LM (via Ljung-Box kuadrat)", "ARCH-LM multivariat (lag 12)",
"Jarque-Bera", "Jarque-Bera multivariat", "Ramsey RESET",
"CUSUM", "CUSUMSQ", "Akar karakteristik"),
Model = c("ARDL", "ARDL", "VECM", "VECM",
"ARDL", "ARDL", "ARDL", "VECM",
"ARDL", "VECM", "ARDL",
"ARDL", "ARDL", "VECM"),
p_value = c("0,03", "0,03", "0,4", "0,5",
"0,0006", "0,302", "0,006", "1",
"0,003", "< 0,001", "0,5",
"0,1", "-", "-"),
Hasil = c("Ada autokorelasi", "Ada autokorelasi", "Bebas autokorelasi", "Bebas autokorelasi",
"Heteroskedastis", "Homoskedastis", "Ada efek ARCH", "Homoskedastis",
"Tidak normal", "Tidak normal", "Bentuk fungsional sesuai",
"Stabil", "Keluar pita (tidak stabil)", "Stabil (2 akar satu = n - r)")
)
kable(ringkasan_diag, row.names = FALSE, caption = "Ringkasan Hasil Diagnostik ARDL dan VECM")
| Aspek | Uji | Model | p_value | Hasil |
|---|---|---|---|---|
| Autokorelasi | Breusch-Godfrey (orde 12) | ARDL | 0,03 | Ada autokorelasi |
| Autokorelasi | Ljung-Box (lag 12) | ARDL | 0,03 | Ada autokorelasi |
| Autokorelasi | Portmanteau (lag 12) | VECM | 0,4 | Bebas autokorelasi |
| Autokorelasi | Breusch-Godfrey multivariat (lag 6) | VECM | 0,5 | Bebas autokorelasi |
| Heteroskedastisitas | Breusch-Pagan | ARDL | 0,0006 | Heteroskedastis |
| Heteroskedastisitas | White (fitted) | ARDL | 0,302 | Homoskedastis |
| Heteroskedastisitas | ARCH-LM (via Ljung-Box kuadrat) | ARDL | 0,006 | Ada efek ARCH |
| Heteroskedastisitas | ARCH-LM multivariat (lag 12) | VECM | 1 | Homoskedastis |
| Normalitas | Jarque-Bera | ARDL | 0,003 | Tidak normal |
| Normalitas | Jarque-Bera multivariat | VECM | < 0,001 | Tidak normal |
| Spesifikasi | Ramsey RESET | ARDL | 0,5 | Bentuk fungsional sesuai |
| Stabilitas | CUSUM | ARDL | 0,1 | Stabil |
| Stabilitas | CUSUMSQ | ARDL | - | Keluar pita (tidak stabil) |
| Stabilitas | Akar karakteristik | VECM | - | Stabil (2 akar satu = n - r) |
Interpretasi. VECM lolos uji autokorelasi, heteroskedastisitas, dan stabilitas (akar karakteristik), tetapi residualnya tidak berdistribusi normal. ARDL memiliki masalah autokorelasi, heteroskedastisitas, normalitas, dan CUSUMSQ. Hasil ini mendukung keputusan menjadikan VECM sebagai model utama dan ARDL sebagai model pelengkap jangka pendek dengan galat baku yang dikoreksi HAC.
Uji utama adalah Toda-Yamamoto (VAR level dengan lag K + dmax, uji Wald pada K lag pertama), karena valid untuk orde integrasi campuran dan memungkinkan inflasi diuji. Granger klasik pada seri stasioner dipakai sebagai pembanding.
Sintaks.
# (a) Toda-Yamamoto
Y5 <- ts_all[, vars_lvl]
pil5 <- VARselect(Y5, lag.max = 8, type = "const")
K5 <- max(1L, as.integer(pil5$selection["SC(n)"]))
dmax <- 1
var_ty <- VAR(Y5, p = K5 + dmax, type = "const")
cat("Granger (Toda-Yamamoto) | K =", K5, "dmax =", dmax, "\n")
## Granger (Toda-Yamamoto) | K = 1 dmax = 1
hasil_ty <- NULL
for (akibat in vars_lvl) {
for (sebab in setdiff(vars_lvl, akibat)) {
hip <- paste0(sebab, ".l", 1:K5, " = 0")
w <- linearHypothesis(var_ty$varresult[[akibat]], hip, test = "Chisq")
hasil_ty <- rbind(hasil_ty, data.frame(
Penyebab = sebab, Akibat = akibat,
Chisq = round(w$Chisq[2], 4), df = w$Df[2], p_value = round(w[["Pr(>Chisq)"]][2], 4),
Keputusan = ifelse(w[["Pr(>Chisq)"]][2] < 0.05, "Ada kausalitas", "Tidak ada")))
}
}
kable(hasil_ty, row.names = FALSE, caption = "Uji Kausalitas Granger Toda-Yamamoto")
| Penyebab | Akibat | Chisq | df | p_value | Keputusan |
|---|---|---|---|---|---|
| LEMAS | LIHSG | 4.5366 | 1 | 0.0332 | Ada kausalitas |
| LWTI | LIHSG | 0.8414 | 1 | 0.3590 | Tidak ada |
| LKURS | LIHSG | 0.0519 | 1 | 0.8199 | Tidak ada |
| INF | LIHSG | 2.0815 | 1 | 0.1491 | Tidak ada |
| LIHSG | LEMAS | 5.4987 | 1 | 0.0190 | Ada kausalitas |
| LWTI | LEMAS | 0.1133 | 1 | 0.7364 | Tidak ada |
| LKURS | LEMAS | 5.1032 | 1 | 0.0239 | Ada kausalitas |
| INF | LEMAS | 0.1550 | 1 | 0.6938 | Tidak ada |
| LIHSG | LWTI | 0.4032 | 1 | 0.5254 | Tidak ada |
| LEMAS | LWTI | 1.7759 | 1 | 0.1827 | Tidak ada |
| LKURS | LWTI | 3.6203 | 1 | 0.0571 | Tidak ada |
| INF | LWTI | 0.4292 | 1 | 0.5124 | Tidak ada |
| LIHSG | LKURS | 1.4239 | 1 | 0.2328 | Tidak ada |
| LEMAS | LKURS | 0.9375 | 1 | 0.3329 | Tidak ada |
| LWTI | LKURS | 1.1828 | 1 | 0.2768 | Tidak ada |
| INF | LKURS | 0.0019 | 1 | 0.9648 | Tidak ada |
| LIHSG | INF | 1.3830 | 1 | 0.2396 | Tidak ada |
| LEMAS | INF | 1.5155 | 1 | 0.2183 | Tidak ada |
| LWTI | INF | 0.3941 | 1 | 0.5302 | Tidak ada |
| LKURS | INF | 1.2382 | 1 | 0.2658 | Tidak ada |
# (b) Granger klasik pasangan (seri stasioner)
st <- ts.intersect(diff(ts_all[, "LIHSG"]), diff(ts_all[, "LEMAS"]),
diff(ts_all[, "LWTI"]), diff(ts_all[, "LKURS"]), ts_all[, "INF"])
colnames(st) <- c("dLIHSG", "dLEMAS", "dLWTI", "dLKURS", "INF")
nm <- colnames(st)
hasil_gc <- NULL
for (akibat in nm) for (sebab in setdiff(nm, akibat)) {
g <- grangertest(st[, akibat], st[, sebab], order = K5)
hasil_gc <- rbind(hasil_gc, data.frame(
Penyebab = sebab, Akibat = akibat, F = round(g$F[2], 4),
p_value = round(g[["Pr(>F)"]][2], 4),
Keputusan = ifelse(g[["Pr(>F)"]][2] < 0.05, "Ada kausalitas", "Tidak ada")))
}
kable(hasil_gc, row.names = FALSE, caption = "Uji Granger Klasik Berpasangan (seri stasioner)")
| Penyebab | Akibat | F | p_value | Keputusan |
|---|---|---|---|---|
| dLEMAS | dLIHSG | 1.1005 | 0.2964 | Tidak ada |
| dLWTI | dLIHSG | 1.3825 | 0.2422 | Tidak ada |
| dLKURS | dLIHSG | 1.3821 | 0.2423 | Tidak ada |
| INF | dLIHSG | 0.7574 | 0.3860 | Tidak ada |
| dLIHSG | dLEMAS | 3.4682 | 0.0652 | Tidak ada |
| dLWTI | dLEMAS | 0.0674 | 0.7957 | Tidak ada |
| dLKURS | dLEMAS | 4.6355 | 0.0335 | Ada kausalitas |
| INF | dLEMAS | 0.5852 | 0.4459 | Tidak ada |
| dLIHSG | dLWTI | 1.0799 | 0.3010 | Tidak ada |
| dLEMAS | dLWTI | 0.0837 | 0.7729 | Tidak ada |
| dLKURS | dLWTI | 2.7620 | 0.0993 | Tidak ada |
| INF | dLWTI | 0.0012 | 0.9720 | Tidak ada |
| dLIHSG | dLKURS | 0.1247 | 0.7247 | Tidak ada |
| dLEMAS | dLKURS | 0.0085 | 0.9267 | Tidak ada |
| dLWTI | dLKURS | 8.3264 | 0.0047 | Ada kausalitas |
| INF | dLKURS | 0.1153 | 0.7348 | Tidak ada |
| dLIHSG | INF | 0.7749 | 0.3806 | Tidak ada |
| dLEMAS | INF | 0.8278 | 0.3649 | Tidak ada |
| dLWTI | INF | 0.0642 | 0.8005 | Tidak ada |
| dLKURS | INF | 0.2088 | 0.6486 | Tidak ada |
Interpretasi. Kriteria SC memilih K = 1 dan dmax = 1 sehingga VAR diestimasi dengan dua lag. Pada Toda-Yamamoto, dari 20 pasangan hanya tiga yang signifikan. LEMAS menyebabkan LIHSG secara Granger (\(\chi^2\) = 4,54; p = 0,033) dan sebaliknya LIHSG menyebabkan LEMAS (\(\chi^2\) = 5,50; p = 0,019), sehingga hubungan emas dan IHSG bersifat dua arah. LKURS menyebabkan LEMAS (\(\chi^2\) = 5,10; p = 0,024). LWTI (p = 0,359), LKURS (p = 0,820), dan INF (p = 0,149) tidak memiliki daya prediksi terhadap LIHSG; LKURS terhadap LWTI mendekati signifikan (p = 0,057).
Pada Granger klasik dengan seri stasioner, tidak ada variabel yang menyebabkan IHSG secara Granger (seluruh p > 0,24). Hanya dua hubungan yang signifikan: dLKURS menyebabkan dLEMAS (p = 0,0335) dan dLWTI menyebabkan dLKURS (p = 0,0047). Perbedaan dengan Toda-Yamamoto timbul karena uji pada selisih membuang informasi hubungan jangka panjang, sedangkan Toda-Yamamoto bekerja pada level. Kedua hasil dilaporkan apa adanya.
Perlu dicatat bahwa kausalitas Granger menguji kemampuan prediktif nilai lampau, bukan hubungan struktural, dan tidak menangkap efek yang terjadi pada bulan yang sama. Hal ini menjelaskan mengapa kurs tidak menyebabkan IHSG secara Granger padahal koefisien LKURS bersamaan pada ARDL sangat signifikan (-0,913): efek kurs terhadap IHSG terjadi dalam bulan yang sama sehingga tidak tertangkap oleh uji berbasis lag.
IRF memakai dekomposisi Cholesky dengan urutan LWTI, LEMAS, LKURS, LIHSG (dari paling eksogen ke paling endogen), horizon 24 bulan, dan selang kepercayaan 95 persen hasil bootstrap 500 replikasi.
Sintaks.
Y4_ord <- Y4[, c("LWTI", "LEMAS", "LKURS", "LIHSG")]
jo_ord <- ca.jo(Y4_ord, type = "trace", ecdet = "const", K = K, spec = "transitory")
vec_irf <- vec2var(jo_ord, r = r)
set.seed(123)
shock <- c("LWTI", "LEMAS", "LKURS")
irf_list <- lapply(shock, function(s)
irf(vec_irf, impulse = s, response = "LIHSG", n.ahead = 24,
ortho = TRUE, cumulative = FALSE, boot = TRUE, ci = 0.95, runs = 500))
names(irf_list) <- shock
# Tabel respons IHSG pada horizon 1, 3, 6, 12, 24 bulan
irf_tab <- sapply(shock, function(s) irf_list[[s]]$irf[[1]][c(2, 4, 7, 13, 25), 1])
rownames(irf_tab) <- paste("Bulan", c(1, 3, 6, 12, 24))
kable(irf_tab, digits = 5, caption = "Respons LIHSG terhadap kejutan satu simpangan baku")
| LWTI | LEMAS | LKURS | |
|---|---|---|---|
| Bulan 1 | 0.01423 | 0.00817 | -0.01735 |
| Bulan 3 | 0.00923 | 0.00347 | -0.00995 |
| Bulan 6 | 0.01260 | 0.00020 | -0.00607 |
| Bulan 12 | 0.01805 | -0.00213 | -0.00390 |
| Bulan 24 | 0.02123 | -0.00348 | -0.00267 |
# Grafik IRF
for (s in shock) plot(irf_list[[s]], main = paste("Respon IHSG terhadap shock", s))
Interpretasi. Respons IHSG terhadap kejutan LWTI positif sepanjang horizon dan cenderung membesar: 0,0142 pada bulan pertama, 0,0092 (bulan ke-3), 0,0126 (bulan ke-6), 0,0181 (bulan ke-12), dan 0,0212 (bulan ke-24). Kejutan kenaikan harga minyak satu simpangan baku dengan demikian berasosiasi dengan kenaikan IHSG sekitar 1,4 sampai 2,1 persen yang persisten, sesuai dengan sifat VECM di mana kejutan dapat berdampak permanen. Respons terhadap kejutan LEMAS positif di awal (0,0082), meluruh ke nol pada bulan ke-6 (0,0002), dan berbalik tipis negatif (-0,0021 pada bulan ke-12 dan -0,0035 pada bulan ke-24). Respons terhadap kejutan LKURS negatif sejak awal (-0,0174) dan makin kecil secara absolut (-0,0100; -0,0061; -0,0039; -0,0027), yang berarti pelemahan rupiah menekan IHSG terutama dalam jangka pendek dan efeknya mereda seiring waktu.
Respons dinilai signifikan hanya jika selang kepercayaan 95 persen pada grafik tidak memuat nol, sehingga kesimpulan tentang arah dan besar respons perlu dibaca bersama grafik tersebut. Karena urutan Cholesky merupakan asumsi, hasil ini sebaiknya diuji kepekaannya dengan mengubah urutan variabel.
Sintaks.
fevd_out <- fevd(vec_irf, n.ahead = 24)
fevd_tab <- round(100 * fevd_out$LIHSG[c(1, 3, 6, 12, 24), ], 2)
rownames(fevd_tab) <- paste("Bulan", c(1, 3, 6, 12, 24))
kable(fevd_tab, caption = "FEVD LIHSG (dalam persen)")
| LWTI | LEMAS | LKURS | LIHSG | |
|---|---|---|---|---|
| Bulan 1 | 12.36 | 11.09 | 13.16 | 63.39 |
| Bulan 3 | 8.84 | 4.97 | 12.12 | 74.07 |
| Bulan 6 | 8.24 | 3.07 | 9.15 | 79.55 |
| Bulan 12 | 13.76 | 1.96 | 6.61 | 77.67 |
| Bulan 24 | 25.73 | 1.55 | 4.40 | 68.32 |
plot(fevd_out)
Interpretasi. Pada bulan pertama, kejutan LIHSG sendiri menjelaskan 63,39 persen varians galat peramalan IHSG, sedangkan LWTI, LEMAS, dan LKURS masing-masing menyumbang 12,36; 11,09; dan 13,16 persen. Kontribusi LIHSG sendiri naik hingga 79,55 persen pada bulan ke-6, lalu turun menjadi 77,67 persen (bulan ke-12) dan 68,32 persen (bulan ke-24). Kontribusi LWTI turun di awal (8,84 persen pada bulan ke-3 dan 8,24 persen pada bulan ke-6) lalu naik tajam menjadi 13,76 persen (bulan ke-12) dan 25,73 persen (bulan ke-24), sehingga minyak menjadi sumber ketidakpastian eksternal yang paling penting dalam jangka panjang. Sebaliknya, kontribusi LEMAS menyusut dari 11,09 persen menjadi 1,55 persen dan LKURS dari 13,16 persen menjadi 4,40 persen, yang berarti emas dan kurs lebih berperan pada jangka pendek. Temuan ini konsisten dengan IRF dan dengan elastisitas jangka panjang LWTI pada vektor kointegrasi.
Subbab ini merangkum seluruh hasil menjadi jawaban atas pengaruh faktor global (emas dan minyak WTI) dan domestik (kurs JISDOR dan inflasi) terhadap IHSG.
Sintaks.
# (1) Hubungan jangka panjang (VECM)
beta1 <- vecm_ls$beta[, 1]
elast_jp <- -beta1[!grepl("^LIHSG|constant", names(beta1))]
if (r >= 2) elast_jp <- elast_jp[!grepl("^LEMAS", names(elast_jp))] # LEMAS dipaksa 0 oleh normalisasi
cat("Elastisitas jangka panjang terhadap LIHSG (VECM, vektor 1):\n"); print(round(elast_jp, 4))
## Elastisitas jangka panjang terhadap LIHSG (VECM, vektor 1):
## LWTI.l1 LKURS.l1
## 0.4060 -0.0259
# (2) Kecepatan penyesuaian ke keseimbangan (ECT)
koef_ihsg <- coef(vecm_ls$rlm)[, grep("LIHSG", colnames(coef(vecm_ls$rlm)))[1]]
alpha_ihsg <- koef_ihsg[grep("^ect", names(koef_ihsg))]
cat("\nKoefisien ECT persamaan LIHSG:", round(alpha_ihsg, 4), "\n")
##
## Koefisien ECT persamaan LIHSG: 0.0018 -0.0419
alpha_ok <- alpha_ihsg[alpha_ihsg < 0 & alpha_ihsg > -1]
if (length(alpha_ok)) {
cat("Waktu paruh (bulan) untuk", names(alpha_ok), ":",
round(log(0.5) / log(1 + alpha_ok), 2), "\n")
}
## Waktu paruh (bulan) untuk ect2 : 16.19
# (3) ARDL: koefisien jangka panjang & ECT
cat("\nKoefisien jangka panjang ARDL:\n"); print(lr_ardl)
##
## Koefisien jangka panjang ARDL:
## Term Estimate Std. Error t value Pr(>|t|)
## 1 (Intercept) 13.7729 6.13667 2.2444 0.0268674
## 2 LEMAS 0.1492 0.13629 1.0945 0.2762001
## 3 LWTI 0.3818 0.09889 3.8611 0.0001936
## 4 LKURS -0.8034 0.73604 -1.0915 0.2775230
## 5 INF 0.0209 0.07324 0.2854 0.7759155
ect_ardl <- coef(mod_recm)[grep("ect", names(coef(mod_recm)))]
cat("Koefisien ECT ARDL:", round(ect_ardl, 4),
"| waktu paruh (bulan):", round(log(0.5) / log(1 + ect_ardl), 2), "\n")
## Koefisien ECT ARDL: -0.1404 | waktu paruh (bulan): 4.58
ringkasan_pengaruh <- data.frame(
Variabel = c("WTI (global)", "Emas (global)", "Kurs JISDOR (domestik)", "Inflasi (domestik)"),
Jangka_Panjang = c("VECM +0,41; ARDL +0,38 (p = 0,0002)",
"VECM tidak ditampilkan (normalisasi); ARDL 0,149 (p = 0,276)",
"VECM -0,026; ARDL -0,803 (p = 0,278)",
"ARDL 0,021 (p = 0,776); tidak ada di VECM"),
Jangka_Pendek_ARDL = c("+0,054 (signifikan)",
"+0,305 bersamaan, -0,285 lag (signifikan)",
"-0,913 bersamaan, +0,801 lag (signifikan)",
"+0,003 (tidak signifikan)"),
Granger_TY = c("Tidak (p = 0,359)", "Dua arah (p = 0,033 dan 0,019)",
"Tidak (p = 0,820)", "Tidak (p = 0,149)"),
IRF = c("Positif, membesar (0,0142 ke 0,0212)",
"Positif lalu tipis negatif (0,0082 ke -0,0035)",
"Negatif, meluruh (-0,0174 ke -0,0027)", "Tidak dihitung"),
FEVD_bulan_24 = c("25,73%", "1,55%", "4,40%", "Tidak dihitung")
)
kable(ringkasan_pengaruh, row.names = FALSE,
caption = "Ringkasan Pengaruh Variabel terhadap IHSG")
| Variabel | Jangka_Panjang | Jangka_Pendek_ARDL | Granger_TY | IRF | FEVD_bulan_24 |
|---|---|---|---|---|---|
| WTI (global) | VECM +0,41; ARDL +0,38 (p = 0,0002) | +0,054 (signifikan) | Tidak (p = 0,359) | Positif, membesar (0,0142 ke 0,0212) | 25,73% |
| Emas (global) | VECM tidak ditampilkan (normalisasi); ARDL 0,149 (p = 0,276) | +0,305 bersamaan, -0,285 lag (signifikan) | Dua arah (p = 0,033 dan 0,019) | Positif lalu tipis negatif (0,0082 ke -0,0035) | 1,55% |
| Kurs JISDOR (domestik) | VECM -0,026; ARDL -0,803 (p = 0,278) | -0,913 bersamaan, +0,801 lag (signifikan) | Tidak (p = 0,820) | Negatif, meluruh (-0,0174 ke -0,0027) | 4,40% |
| Inflasi (domestik) | ARDL 0,021 (p = 0,776); tidak ada di VECM | +0,003 (tidak signifikan) | Tidak (p = 0,149) | Tidak dihitung | Tidak dihitung |
Interpretasi hubungan jangka panjang. Hubungan jangka panjang IHSG paling konsisten dengan harga minyak WTI. Elastisitas VECM sebesar +0,406 dan koefisien jangka panjang ARDL sebesar +0,382 searah, FEVD pada bulan ke-24 memberi kontribusi 25,73 persen, dan IRF menunjukkan respons positif yang persisten. Pengaruh kurs pada vektor kointegrasi hampir nol (-0,0259) dan tidak signifikan pada ARDL. Emas tidak dapat dinilai dari vektor pertama karena normalisasi, dan koefisien jangka panjangnya pada ARDL tidak signifikan. Inflasi tidak signifikan pada seluruh spesifikasi.
Penyesuaian IHSG terhadap keseimbangan jangka panjang berlangsung lambat. Hanya ECT2 pada persamaan LIHSG yang valid (-0,0419), dengan waktu paruh sekitar 16,19 bulan atau koreksi sekitar 4,2 persen per bulan. Waktu paruh ECT ARDL (4,58 bulan) tidak digunakan karena bounds test tidak menolak H0.
Pembahasan menurut variabel.
Minyak WTI. Hasil yang positif dan persisten menunjukkan bahwa kenaikan harga minyak bergerak searah dengan IHSG, bukan menekannya. Beberapa penjelasan yang masuk akal, tetapi belum diuji pada penelitian ini, adalah keberadaan emiten sektor energi dan pertambangan dalam indeks yang diuntungkan harga komoditas, serta kenaikan harga minyak yang dapat mencerminkan membaiknya permintaan global. Karena Toda-Yamamoto menunjukkan WTI tidak mendahului IHSG secara prediktif, hubungan ini lebih tepat dibaca sebagai keseimbangan jangka panjang yang bergerak bersama daripada sebagai kemampuan WTI memprediksi IHSG pada bulan berikutnya.
Emas. Emas berperan terutama dalam jangka pendek dan dua arah. Kenaikan emas 1 persen berasosiasi dengan kenaikan IHSG sekitar 0,31 persen pada bulan yang sama, tetapi efek bersihnya pada level hampir hilang karena lag LEMAS bertanda negatif, dan respons IRF meluruh ke nol dalam enam bulan. Hubungan dua arah pada Toda-Yamamoto menunjukkan IHSG juga mendahului emas, sehingga emas tidak dapat dipandang semata-mata sebagai faktor eksternal yang memengaruhi IHSG.
Kurs JISDOR. Pelemahan rupiah menekan IHSG terutama pada bulan terjadinya (koefisien bersamaan -0,913; respons IRF awal -0,0174), tetapi pengaruh jangka panjangnya tidak signifikan dan kontribusi FEVD menyusut dari 13,16 persen menjadi 4,40 persen. Tekanan itu sebagian besar berbalik pada bulan berikutnya (koefisien lag +0,801). Pola ini lebih cocok dibaca sebagai reaksi jangka pendek terhadap guncangan kurs daripada hubungan struktural yang bertahan lama.
Inflasi. Inflasi bulanan tidak berpengaruh signifikan terhadap IHSG pada ARDL (p = 0,776) maupun pada Toda-Yamamoto (p = 0,149). Inflasi M-to-M bersifat berisik dan berfluktuasi di sekitar nol, sehingga informasi pada tingkat bulanan mungkin kurang memadai untuk memengaruhi pergerakan indeks; dugaan ini perlu diuji lebih lanjut, misalnya dengan inflasi tahunan atau ekspektasi inflasi.
Faktor global dan domestik. Dalam jangka panjang, faktor global (terutama minyak) lebih menonjol daripada faktor domestik yang diwakili kurs dan inflasi, sedangkan faktor domestik berupa kurs lebih berperan pada guncangan jangka pendek. Perlu diingat bahwa kesimpulan ini terbatas pada variabel yang dipakai dan tidak berarti faktor domestik lain, seperti suku bunga kebijakan, tidak berpengaruh.
Keterbatasan. Hasil perlu dibaca dengan memperhatikan: (1) residual yang tidak berdistribusi normal; (2) rank kointegrasi yang sensitif karena penolakan r ≤ 1 hanya tipis; (3) konflik antara Johansen dan bounds test; (4) urutan Cholesky pada IRF dan FEVD yang merupakan asumsi; (5) guncangan besar pada 2020 dan 2026 yang belum dimodelkan sebagai perubahan struktural; serta (6) kausalitas Granger yang bersifat prediktif, bukan struktural.
Berdasarkan hasil analisis data bulanan Januari 2017 sampai Agustus 2026 (116 observasi), diperoleh kesimpulan berikut.
Karakteristik dan pola data. IHSG, emas, WTI, kurs, dan inflasi memiliki karakteristik yang berbeda. Emas paling bervariasi secara relatif (koefisien variasi sekitar 46 persen). IHSG, WTI, dan kurs mengalami perubahan tajam yang berdekatan pada Maret sampai April 2020 dan paruh pertama 2026. Korelasi awal IHSG bersifat positif sedang terhadap WTI (0,579), emas (0,561), dan kurs (0,506), serta sangat lemah terhadap inflasi (0,071), namun korelasi level ini bersifat eksploratif dan tidak membuktikan pengaruh.
Pra-pemrosesan. Data tidak mengandung missing value dan periode bulanan lengkap. Transformasi logaritmik diterapkan pada IHSG, emas, WTI, dan kurs, sedangkan inflasi tidak ditransformasi karena terdapat 26 bulan inflasi negatif.
Stasioneritas. LIHSG, LEMAS, LWTI, dan LKURS terintegrasi orde satu, I(1), sedangkan inflasi stasioner pada level, I(0). Orde integrasi yang campuran ini menjadi dasar penggunaan ARDL dan mengeluarkan inflasi dari sistem VECM.
Kointegrasi. Uji Johansen menemukan dua vektor kointegrasi (r = 2) pada empat variabel I(1), sedangkan ARDL bounds test tidak menemukan kointegrasi (F = 3,194; p = 0,155). Karena konflik ini, VECM dijadikan model utama hubungan jangka panjang dan ARDL(1,1,0,1,0) dijadikan model pelengkap jangka pendek.
Model dan diagnostik. VECM lolos uji autokorelasi, heteroskedastisitas, dan stabilitas akar karakteristik, tetapi residualnya tidak normal. ARDL memiliki masalah autokorelasi, heteroskedastisitas, normalitas, dan CUSUMSQ sehingga inferensinya memakai galat baku HAC dan dibatasi pada dinamika jangka pendek.
Hubungan jangka panjang. Harga minyak WTI merupakan penentu jangka panjang IHSG yang paling konsisten, dengan elastisitas sekitar 0,41 pada VECM dan 0,38 pada ARDL. Pengaruh jangka panjang kurs dan inflasi tidak signifikan. Penyesuaian IHSG terhadap keseimbangan berlangsung lambat, dengan waktu paruh sekitar 16 bulan.
Hubungan jangka pendek. Kenaikan emas 1 persen berasosiasi dengan kenaikan IHSG sekitar 0,31 persen pada bulan yang sama, dan depresiasi rupiah 1 persen berasosiasi dengan penurunan IHSG sekitar 0,91 persen. Keduanya bersifat jangka pendek: efek emas meluruh ke nol dalam enam bulan dan tekanan kurs sebagian besar berbalik pada bulan berikutnya.
Kausalitas, IRF, dan FEVD. Toda-Yamamoto menemukan hubungan Granger dua arah antara emas dan IHSG serta dari kurs ke emas; WTI, kurs, dan inflasi tidak mendahului IHSG secara prediktif. IRF menunjukkan respons IHSG positif dan persisten terhadap kejutan WTI serta respons negatif yang meluruh terhadap kejutan kurs. FEVD menunjukkan kontribusi WTI meningkat menjadi 25,73 persen pada bulan ke-24, sedangkan emas (1,55 persen) dan kurs (4,40 persen) menyusut.
Faktor global dan domestik. Dalam jangka panjang faktor global, terutama minyak, lebih menonjol daripada faktor domestik berupa kurs dan inflasi, sedangkan kurs berperan pada guncangan jangka pendek dan inflasi tidak signifikan pada seluruh spesifikasi. Kesimpulan ini bersifat asosiatif dan prediktif, bukan sebab-akibat struktural, serta terbatas oleh ketidaknormalan residual, sensitivitas rank kointegrasi, dan asumsi urutan Cholesky.
Saran praktis.
Pelaku pasar dan analis yang memantau IHSG dapat memperhatikan pergerakan harga minyak sebagai indikator yang berhubungan dengan IHSG dalam jangka panjang, serta guncangan kurs sebagai sumber tekanan jangka pendek. Hasil ini bersifat deskriptif atas data historis dan bukan rekomendasi investasi.
Karena penyesuaian IHSG terhadap keseimbangan jangka panjang berlangsung lambat (waktu paruh sekitar 16 bulan), penyimpangan IHSG dari hubungan keseimbangannya dapat bertahan lama sehingga tidak tepat diperlakukan sebagai koreksi cepat.
Pengambil kebijakan dapat memperhatikan stabilitas kurs dalam jangka pendek karena pelemahan rupiah berasosiasi dengan tekanan pada IHSG pada bulan yang sama.
Saran untuk penelitian selanjutnya.
Melakukan uji weak exogeneity pada VECM untuk memeriksa dugaan bahwa konflik antara Johansen dan ARDL bounds test berasal dari asumsi eksogenitas ARDL.
Memodelkan perubahan struktural, misalnya dengan variabel dummy untuk pandemi 2020 dan guncangan 2026, atau dengan uji structural break dan model regime switching, karena CUSUMSQ ARDL menunjukkan ketidakstabilan varians.
Menangani heteroskedastisitas dan efek ARCH dengan model varians bersyarat (misalnya GARCH) serta mempertimbangkan sebaran residual yang berekor tebal.
Menguji kepekaan IRF dan FEVD terhadap urutan Cholesky atau menggunakan generalized IRF, serta menambahkan variabel domestik lain seperti suku bunga kebijakan dan aliran modal asing.
Menguji inflasi dalam bentuk lain (tahunan atau ekspektasi inflasi), menambah panjang sampel atau frekuensi data, dan mengevaluasi kemampuan peramalan di luar sampel (out-of-sample).