Hasil Pemodelan

Data dan statistik deskriptif

d <- read_excel(data_file); d$tanggal <- as.Date(d$tanggal); d <- d[order(d$tanggal), ]
d$inflasi_yoy <- as.numeric(100 * (exp(stats::filter(log(1 + d$inflasi/100), rep(1, 12), sides = 1)) - 1))
d$bunga   <- ifelse(d$tanggal < as.Date("2016-08-01"), d$suku_bunga - 1.25, d$suku_bunga)
d$kurs100 <- 100 * log(d$kurs)
x  <- na.omit(d[, c("tanggal", "inflasi_yoy", "bunga", "kurs100", "inflasi", "suku_bunga", "kurs")])
Y  <- as.matrix(x[, c("inflasi_yoy", "bunga", "kurs100")]); colnames(Y) <- c("inflasi", "bunga", "kurs")
tg <- x$tanggal; n <- nrow(Y)
cat("Data awal:", nrow(d), "bulan | sampel analisis:", n, "bulan (", format(min(tg)), "s.d.", format(max(tg)), ") | missing:", sum(is.na(d[, 2:4])), "\n")
## Data awal: 180 bulan | sampel analisis: 169 bulan ( 2011-12-01 s.d. 2025-12-01 ) | missing: 0
desk <- data.frame(Variabel = c("Inflasi y-o-y (%)", "Suku bunga acuan, disambung (%)", "Kurs (Rp/USD)"),
  Rata_rata = c(fmt(mean(Y[,1])), fmt(mean(Y[,2])), rb(mean(x$kurs))), SD = c(fmt(sd(Y[,1])), fmt(sd(Y[,2])), rb(sd(x$kurs))),
  Min = c(fmt(min(Y[,1])), fmt(min(Y[,2])), rb(min(x$kurs))), Max = c(fmt(max(Y[,1])), fmt(max(Y[,2])), rb(max(x$kurs))))
knitr::kable(desk, align = "lcccc", col.names = c("Variabel", "Rata-rata", "Simpangan baku", "Minimum", "Maksimum"),
             caption = "Tabel 1. Statistik deskriptif")
Tabel 1. Statistik deskriptif
Variabel Rata-rata Simpangan baku Minimum Maksimum
Inflasi y-o-y (%) 3,81 1,91 -0,10 8,79
Suku bunga acuan, disambung (%) 5,13 0,93 3,50 6,50
Kurs (Rp/USD) 13.650 1.973 9.026 16.820
par(mfrow = c(3, 1), mar = c(3, 4.5, 2.2, 1))
plot(tg, Y[,1], type = "l", lwd = 1.6, col = "firebrick", xlab = "", ylab = "%", main = "Inflasi Tahunan (y-o-y)")
plot(d$tanggal, d$suku_bunga, type = "l", col = "grey65", lwd = 1.4, xlab = "", ylab = "%",
     main = "Suku Bunga Acuan BI (abu-abu: data asli, biru: disambung ke skala BI7DRR)")
lines(tg, Y[,2], col = "navy", lwd = 1.6); abline(v = as.Date("2016-08-01"), lty = 2, col = "grey40")
plot(tg, x$kurs, type = "l", lwd = 1.6, col = "darkgreen", xlab = "", ylab = "Rp/USD", main = "Kurs Rupiah terhadap USD")
Gambar 1. Inflasi tahunan, suku bunga acuan BI, dan kurs rupiah terhadap USD

Gambar 1. Inflasi tahunan, suku bunga acuan BI, dan kurs rupiah terhadap USD

Uji stasioneritas

uji <- function(z, nm, tahap) { a <- ur.df(z, type = "drift", selectlags = "AIC", lags = 12)
  data.frame(Variabel = nm, Tahap = tahap, ADF = a@teststat[1], PP_p = suppressWarnings(pp.test(z)$p.value),
             KPSS_p = suppressWarnings(kpss.test(z)$p.value)) }
ur <- rbind(uji(Y[,1], "Inflasi", "Level"), uji(diff(Y[,1]), "Inflasi", "Diff 1"), uji(Y[,2], "Suku bunga", "Level"),
            uji(diff(Y[,2]), "Suku bunga", "Diff 1"), uji(Y[,3], "Kurs", "Level"), uji(diff(Y[,3]), "Kurs", "Diff 1"))
ur_mom <- uji(x$inflasi, "Inflasi m-o-m (asli)", "Level")
pfmt <- function(p, lo = 0.01, hi = 0.1) ifelse(p <= lo, "< 0,01", ifelse(p >= hi, "> 0,10", fmt(p, 3)))
knitr::kable(data.frame(ur[, 1:2], ADF = fmt(ur$ADF, 3), PP = pfmt(ur$PP_p), KPSS = pfmt(ur$KPSS_p)), align = "llccc",
             col.names = c("Variabel", "Tahap", "ADF (nilai kritis 5% = −2,88)", "PP (p-value)", "KPSS (p-value)"),
             caption = "Tabel 2. Hasil uji akar unit")
Tabel 2. Hasil uji akar unit
Variabel Tahap ADF (nilai kritis 5% = −2,88) PP (p-value) KPSS (p-value)
Inflasi Level -1,165 > 0,10 < 0,01
Inflasi Diff 1 -5,804 < 0,01 > 0,10
Suku bunga Level -2,495 > 0,10 > 0,10
Suku bunga Diff 1 -5,475 < 0,01 > 0,10
Kurs Level -2,734 > 0,10 < 0,01
Kurs Diff 1 -10,454 < 0,01 > 0,10

Panjang lag

vs <- VARselect(Y, lag.max = 12, type = "const")
lagdg <- do.call(rbind, lapply(2:4, function(K) { v <- VAR(Y, p = K, type = "const")
  data.frame(Lag = K, PT = serial.test(v, lags.pt = 12, type = "PT.adjusted")$serial$p.value,
             BG = serial.test(v, lags.bg = 6, type = "BG")$serial$p.value) }))
cr <- as.data.frame(t(vs$criteria[, 1:5])); cr$Lag <- 1:5; cr <- merge(cr, lagdg, all.x = TRUE)
knitr::kable(data.frame(Lag = cr$Lag, AIC = fmt(cr$`AIC(n)`, 3), HQ = fmt(cr$`HQ(n)`, 3), SC = fmt(cr$`SC(n)`, 3),
                        Portmanteau = ifelse(is.na(cr$PT), "–", fmt(cr$PT, 3)), BG = ifelse(is.na(cr$BG), "–", fmt(cr$BG, 3))),
             align = "cccccc", col.names = c("Lag", "AIC", "HQ", "SC", "Portmanteau (p)", "BG LM (p)"),
             caption = "Tabel 3. Kriteria pemilihan lag VAR level dan uji autokorelasi residual")
Tabel 3. Kriteria pemilihan lag VAR level dan uji autokorelasi residual
Lag AIC HQ SC Portmanteau (p) BG LM (p)
1 -3,755 -3,660 -3,521 – –
2 -4,084 -3,918 -3,675 0,014 0,006
3 -4,161 -3,923 -3,577 0,058 0,562
4 -4,097 -3,789 -3,338 0,023 0,322
5 -4,046 -3,667 -3,112 – –
vs$selection
## AIC(n)  HQ(n)  SC(n) FPE(n) 
##      3      3      2      3
K <- 3

Uji kointegrasi Johansen

jt <- ca.jo(Y, type = "trace", ecdet = "none", K = K, spec = "transitory")
je <- ca.jo(Y, type = "eigen", ecdet = "none", K = K, spec = "transitory")
Teff <- n - K; adj <- (Teff - 3 * K) / Teff
joh <- data.frame(H0 = c("r = 0", "r ≤ 1", "r ≤ 2"), Trace = rev(jt@teststat), Trace_adj = rev(jt@teststat) * adj,
                  cv5 = rev(jt@cval[, 2]), cv1 = rev(jt@cval[, 3]), Eigen = rev(je@teststat), ecv5 = rev(je@cval[, 2]))
knitr::kable(data.frame(joh[1], lapply(joh[-1], fmt)), align = "lcccccc",
             col.names = c("H0", "Trace", "Trace terkoreksi*", "Nilai kritis 5%", "Nilai kritis 1%", "Max-eigen", "Nilai kritis 5%"),
             caption = "Tabel 4. Uji kointegrasi Johansen (lag 3, konstanta tidak dibatasi). *Koreksi sampel kecil Reinsel-Ahn")
Tabel 4. Uji kointegrasi Johansen (lag 3, konstanta tidak dibatasi). *Koreksi sampel kecil Reinsel-Ahn
H0 Trace Trace terkoreksi* Nilai kritis 5% Nilai kritis 1% Max-eigen Nilai kritis 5%
r = 0 | r = 0 32,02 30,28 31,52 37,22 15,99 21,07
r <= 1 | r ≤ 1 16,03 15,16 17,95 23,52 10,41 14,90
r <= 2 | r ≤ 2 5,62 5,31 8,18 11,65 5,62 8,18
Yasli <- Y; Yasli[, "bunga"] <- x$suku_bunga
D <- matrix(as.numeric(tg == as.Date("2016-08-01")), ncol = 1, dimnames = list(NULL, "d1608"))
Ymom <- Y; Ymom[, "inflasi"] <- x$inflasi
spek <- list(list("Utama: y-o-y, bunga disambung", Y, 2, NULL), list("Utama: y-o-y, bunga disambung", Y, 3, NULL),
             list("Utama: y-o-y, bunga disambung", Y, 4, NULL), list("Bunga asli + dummy Agu 2016", Yasli, 3, D),
             list("Inflasi m-o-m (tanpa transformasi)", Ymom, 3, NULL))
jr <- do.call(rbind, lapply(spek, function(s) {
  a <- ca.jo(s[[2]], type = "trace", ecdet = "none", K = s[[3]], spec = "transitory", dumvar = s[[4]])
  b <- ca.jo(s[[2]], type = "eigen", ecdet = "none", K = s[[3]], spec = "transitory", dumvar = s[[4]])
  tr <- rev(a@teststat); ei <- rev(b@teststat)
  data.frame(Spesifikasi = s[[1]], Lag = s[[3]], Trace = fmt(tr[1]), Eigen = fmt(ei[1]),
             r_trace = sum(cumprod(tr > rev(a@cval[, 2]))), r_eigen = sum(cumprod(ei > rev(b@cval[, 2])))) }))
knitr::kable(jr, align = "lcccc", col.names = c("Spesifikasi", "Lag", "Trace (r = 0)", "Max-eigen (r = 0)", "r (trace)", "r (max-eigen)"),
             caption = "Tabel 5. Ketahanan hasil uji Johansen")
Tabel 5. Ketahanan hasil uji Johansen
Spesifikasi Lag Trace (r = 0) Max-eigen (r = 0) r (trace) r (max-eigen)
Utama: y-o-y, bunga disambung 2 33,97 21,23 1 1
Utama: y-o-y, bunga disambung 3 32,02 15,99 1 0
Utama: y-o-y, bunga disambung 4 30,90 13,97 0 0
Bunga asli + dummy Agu 2016 3 33,08 15,92 1 0
Inflasi m-o-m (tanpa transformasi) 3 85,64 73,03 1 1
crj <- cajorls(jt, r = 1); beta <- crj$beta[, 1]
al <- do.call(rbind, lapply(summary(crj$rlm), function(s) s$coefficients["ect1", ]))
knitr::kable(data.frame(Variabel = nmv, Beta = fmt(beta, 4), Alpha = fmt(al[, 1], 4), p = pv(al[, 4])), row.names = FALSE, align = "lccc",
             col.names = c("Variabel", "β (dinormalisasi ke inflasi)", "α (penyesuaian)", "p-value α"),
             caption = "Tabel 6. Vektor kointegrasi dan koefisien penyesuaian jika r = 1 dipaksakan")
Tabel 6. Vektor kointegrasi dan koefisien penyesuaian jika r = 1 dipaksakan
Variabel β (dinormalisasi ke inflasi) α (penyesuaian) p-value α
Inflasi 1,0000 -0,1072 < 0,001
Suku bunga -0,1974 0,0044 0,552
Kurs 0,0843 0,0064 0,949

Estimasi VAR(2) dalam first difference

dY <- diff(Y); VARselect(dY, lag.max = 12, type = "const")$selection
## AIC(n)  HQ(n)  SC(n) FPE(n) 
##      2      2      1      2
p <- 2; var_d <- VAR(dY, p = p, type = "const")
koef <- do.call(rbind, lapply(names(var_d$varresult), function(eq) { co <- summary(var_d$varresult[[eq]])$coefficients
  data.frame(Persamaan = paste0("Δ", nmv[eq]), Regresor = rownames(co), Koef = fmt(co[, 1], 4), SE = fmt(co[, 2], 4),
             t = fmt(co[, 3], 3), p = pv(co[, 4])) }))
knitr::kable(koef, row.names = FALSE, align = "llcccc", col.names = c("Persamaan", "Regresor", "Koefisien", "Std. Error", "t-hitung", "p-value"),
             caption = "Tabel 7. Koefisien VAR(2) dalam first difference")
Tabel 7. Koefisien VAR(2) dalam first difference
Persamaan Regresor Koefisien Std. Error t-hitung p-value
ΔInflasi inflasi.l1 0,2645 0,0776 3,409 < 0,001
ΔInflasi bunga.l1 0,6363 0,3188 1,996 0,048
ΔInflasi kurs.l1 -0,0095 0,0224 -0,423 0,673
ΔInflasi inflasi.l2 -0,2080 0,0784 -2,655 0,009
ΔInflasi bunga.l2 -0,5284 0,3116 -1,696 0,092
ΔInflasi kurs.l2 0,0128 0,0225 0,567 0,571
ΔInflasi const -0,0046 0,0417 -0,111 0,912
ΔSuku bunga inflasi.l1 0,0219 0,0194 1,130 0,260
ΔSuku bunga bunga.l1 0,4914 0,0796 6,174 < 0,001
ΔSuku bunga kurs.l1 0,0088 0,0056 1,578 0,117
ΔSuku bunga inflasi.l2 0,0061 0,0196 0,312 0,755
ΔSuku bunga bunga.l2 0,0456 0,0778 0,586 0,558
ΔSuku bunga kurs.l2 0,0017 0,0056 0,294 0,769
ΔSuku bunga const -0,0022 0,0104 -0,208 0,835
ΔKurs inflasi.l1 0,3225 0,2629 1,227 0,222
ΔKurs bunga.l1 0,5349 1,0800 0,495 0,621
ΔKurs kurs.l1 0,2339 0,0760 3,077 0,002
ΔKurs inflasi.l2 0,3256 0,2655 1,227 0,222
ΔKurs bunga.l2 1,3887 1,0557 1,315 0,190
ΔKurs kurs.l2 -0,3314 0,0763 -4,342 < 0,001
ΔKurs const 0,4091 0,1412 2,897 0,004
r2 <- sapply(var_d$varresult, function(m) summary(m)$adj.r.squared)
kb <- function(eq, rg, k = 1) summary(var_d$varresult[[eq]])$coefficients[rg, k]

Diagnostik model

dg <- c(serial.test(var_d, lags.pt = 12, type = "PT.adjusted")$serial$p.value, serial.test(var_d, lags.bg = 6, type = "BG")$serial$p.value,
        arch.test(var_d, lags.multi = 5)$arch.mul$p.value, normality.test(var_d)$jb.mul$JB$p.value, max(roots(var_d)))
knitr::kable(data.frame(Uji = c("Portmanteau (adjusted), lag 12", "Breusch-Godfrey LM, lag 6", "ARCH-LM multivariat, lag 5",
                                "Jarque-Bera multivariat", "Modulus akar karakteristik terbesar"),
                        Nilai = c(fmt(dg[1:3], 3), pv(dg[4]), fmt(dg[5], 3))), align = "lc",
             col.names = c("Uji", "p-value / nilai"), caption = "Tabel 8. Uji diagnostik VAR(2)")
Tabel 8. Uji diagnostik VAR(2)
Uji p-value / nilai
Portmanteau (adjusted), lag 12 0,176
Breusch-Godfrey LM, lag 6 0,726
ARCH-LM multivariat, lag 5 0,077
Jarque-Bera multivariat < 0,001
Modulus akar karakteristik terbesar 0,613
ak <- roots(var_d, modulus = FALSE); th <- seq(0, 2*pi, length.out = 300)
plot(Re(ak), Im(ak), xlim = c(-1.1, 1.1), ylim = c(-1.1, 1.1), asp = 1, pch = 19, col = "navy", xlab = "Real", ylab = "Imajiner",
     main = "Akar Karakteristik VAR"); lines(cos(th), sin(th), col = "grey50")
Gambar 2. Akar karakteristik VAR(2) terhadap lingkaran satuan

Gambar 2. Akar karakteristik VAR(2) terhadap lingkaran satuan

Uji kausalitas Granger

pw <- NULL
for (ca in colnames(dY)) for (ef in setdiff(colnames(dY), ca)) {
  m <- var_d$varresult[[ef]]; b <- coef(m); V <- vcov(m); idx <- grep(paste0("^", ca, "\\.l"), names(b))
  Fs <- as.numeric(t(b[idx]) %*% solve(V[idx, idx]) %*% b[idx]) / length(idx)
  pw <- rbind(pw, data.frame(Arah = paste(nmv[ca], "→", nmv[ef]), F = Fs, p = pf(Fs, length(idx), m$df.residual, lower.tail = FALSE))) }
gb <- sapply(colnames(dY), function(v) causality(var_d, cause = v)$Granger$p.value)
knitr::kable(data.frame(Arah = pw$Arah, F = fmt(pw$F, 3), p = fmt(pw$p, 3), Keputusan = ifelse(pw$p < 0.05, "Signifikan", "Tidak signifikan")),
             align = "lccc", col.names = c("Arah kausalitas", "F-hitung", "p-value", "Keputusan (5%)"), caption = "Tabel 9. Uji kausalitas Granger")
Tabel 9. Uji kausalitas Granger
Arah kausalitas F-hitung p-value Keputusan (5%)
Inflasi → Suku bunga 0,787 0,457 Tidak signifikan
Inflasi → Kurs 1,874 0,157 Tidak signifikan
Suku bunga → Inflasi 2,285 0,105 Tidak signifikan
Suku bunga → Kurs 1,829 0,164 Tidak signifikan
Kurs → Inflasi 0,216 0,806 Tidak signifikan
Kurs → Suku bunga 1,405 0,248 Tidak signifikan

Impulse Response Function (IRF)

H <- 24
sdres <- apply(residuals(var_d), 2, sd)
ir <- irf(var_d, n.ahead = H, ortho = TRUE, cumulative = TRUE, boot = TRUE, ci = 0.95, runs = RUNS)
irv <- function(g, r, b) ir$irf[[g]][b + 1, r]
sig_bulan <- function(g, r) { b <- which(ir$Lower[[g]][, r] > 0 | ir$Upper[[g]][, r] < 0) - 1
  if (length(b) == 0) "tidak ada" else if (length(b) == 1) as.character(b) else if (length(b) == max(b) - min(b) + 1) paste0(min(b), "-", max(b)) else paste(b, collapse = ",") }
lab <- c(inflasi = "Inflasi (poin %)", bunga = "Suku bunga (poin %)", kurs = "Kurs (%)")
par(mfrow = c(3, 3), mar = c(4.2, 4.2, 2.6, 0.8), mgp = c(2.4, 0.8, 0))
for (re in colnames(dY)) for (im in colnames(dY)) {
  lo <- ir$Lower[[im]][, re]; up <- ir$Upper[[im]][, re]; md <- ir$irf[[im]][, re]; hh <- 0:H
  plot(hh, md, type = "n", ylim = range(c(lo, up, 0)), xlab = "Bulan", ylab = lab[re], main = paste(nmv[im], "→", nmv[re]))
  polygon(c(hh, rev(hh)), c(lo, rev(up)), col = adjustcolor("steelblue", 0.25), border = NA)
  lines(hh, md, lwd = 2, col = "navy"); abline(h = 0, col = "red", lty = 2) }
Gambar 3. IRF kumulatif dengan selang kepercayaan bootstrap 95% (kolom = guncangan, baris = respons)

Gambar 3. IRF kumulatif dengan selang kepercayaan bootstrap 95% (kolom = guncangan, baris = respons)

pairs <- list(c("inflasi", "bunga"), c("inflasi", "kurs"), c("bunga", "inflasi"), c("bunga", "kurs"), c("kurs", "inflasi"), c("kurs", "bunga"))
knitr::kable(do.call(rbind, lapply(pairs, function(k) data.frame(Pasangan = paste(nmv[k[1]], "→", nmv[k[2]]),
  B0 = fmt(irv(k[1], k[2], 0), 3), B3 = fmt(irv(k[1], k[2], 3), 3), B6 = fmt(irv(k[1], k[2], 6), 3), B12 = fmt(irv(k[1], k[2], 12), 3),
  B24 = fmt(irv(k[1], k[2], 24), 3), Sig = sig_bulan(k[1], k[2])))), row.names = FALSE, align = "lcccccc",
  col.names = c("Guncangan → Respons", "Bulan 0", "Bulan 3", "Bulan 6", "Bulan 12", "Bulan 24", "Bulan signifikan (CI 95%)"),
  caption = "Tabel 10. Ringkasan IRF kumulatif (poin persen untuk inflasi dan suku bunga, persen untuk kurs)")
Tabel 10. Ringkasan IRF kumulatif (poin persen untuk inflasi dan suku bunga, persen untuk kurs)
Guncangan → Respons Bulan 0 Bulan 3 Bulan 6 Bulan 12 Bulan 24 Bulan signifikan (CI 95%)
Inflasi → Suku bunga 0,014 0,067 0,078 0,081 0,081 tidak ada
Inflasi → Kurs 0,287 0,770 0,719 0,735 0,735 0-24
Suku bunga → Inflasi 0,000 0,051 0,040 0,037 0,037 1
Suku bunga → Kurs 0,276 0,726 0,765 0,797 0,797 2-24
Kurs → Inflasi 0,000 0,027 0,006 0,010 0,010 tidak ada
Kurs → Suku bunga 0,000 0,033 0,036 0,038 0,038 tidak ada

Forecast Error Variance Decomposition (FEVD)

fe <- fevd(var_d, n.ahead = H)
fev <- do.call(rbind, lapply(names(fe), function(v) data.frame(Variabel = nmv[v], Bulan = c(1, 6, 12, 24),
  Inflasi = fmt(100 * fe[[v]][c(1, 6, 12, 24), "inflasi"]), Bunga = fmt(100 * fe[[v]][c(1, 6, 12, 24), "bunga"]),
  Kurs = fmt(100 * fe[[v]][c(1, 6, 12, 24), "kurs"]))))
knitr::kable(fev, row.names = FALSE, align = "lcccc", col.names = c("Variabel", "Bulan", "Kontribusi inflasi", "Kontribusi suku bunga", "Kontribusi kurs"),
             caption = "Tabel 11. Dekomposisi varians galat peramalan (%)")
Tabel 11. Dekomposisi varians galat peramalan (%)
Variabel Bulan Kontribusi inflasi Kontribusi suku bunga Kontribusi kurs
Inflasi 1 100,00 0,00 0,00
Inflasi 6 97,21 2,33 0,46
Inflasi 12 97,20 2,33 0,47
Inflasi 24 97,20 2,33 0,47
Suku bunga 1 1,16 98,84 0,00
Suku bunga 6 4,81 93,48 1,70
Suku bunga 12 4,82 93,46 1,71
Suku bunga 24 4,82 93,46 1,71
Kurs 1 2,65 2,46 94,88
Kurs 6 5,06 3,91 91,02
Kurs 12 5,09 3,92 90,98
Kurs 24 5,09 3,92 90,98
own24 <- sapply(names(fe), function(v) 100 * unname(fe[[v]][24, v]))

Uji ketahanan

var_alt <- VAR(dY[, c("kurs", "inflasi", "bunga")], p = p, type = "const")
ir_alt  <- irf(var_alt, n.ahead = H, ortho = TRUE, cumulative = TRUE, boot = TRUE, ci = 0.95, runs = RUNS)
vv <- vec2var(jt, r = 1); ir_vec <- irf(vv, n.ahead = H, ortho = TRUE, boot = FALSE)
sg <- function(o, g, r, b) (o$Lower[[g]][b + 1, r] > 0) | (o$Upper[[g]][b + 1, r] < 0)
tb <- do.call(rbind, lapply(list(c("kurs","inflasi"), c("kurs","bunga"), c("bunga","kurs"), c("bunga","inflasi"), c("inflasi","bunga")),
  function(k) do.call(rbind, lapply(c(0, 3, 12, 24), function(b) data.frame(Pasangan = paste(nmv[k[1]], "→", nmv[k[2]]), Bulan = b,
    Utama = paste0(fmt(ir$irf[[k[1]]][b + 1, k[2]], 3), ifelse(sg(ir, k[1], k[2], b), " *", "")),
    Alternatif = paste0(fmt(ir_alt$irf[[k[1]]][b + 1, k[2]], 3), ifelse(sg(ir_alt, k[1], k[2], b), " *", "")),
    VECM = fmt(ir_vec$irf[[k[1]]][b + 1, k[2]], 3))))))
knitr::kable(tb, row.names = FALSE, align = "lcccc", col.names = c("Guncangan → Respons", "Bulan", "Utama (inflasi → bunga → kurs)", "Alternatif (kurs → inflasi → bunga)", "VECM r = 1"),
             caption = "Tabel 12. Perbandingan IRF kumulatif (* signifikan, CI bootstrap 95%)")
Tabel 12. Perbandingan IRF kumulatif (* signifikan, CI bootstrap 95%)
Guncangan → Respons Bulan Utama (inflasi → bunga → kurs) Alternatif (kurs → inflasi → bunga) VECM r = 1
Kurs → Inflasi 0 0,000 0,085 * 0,000
Kurs → Inflasi 3 0,027 0,125 0,025
Kurs → Inflasi 12 0,010 0,107 -0,082
Kurs → Inflasi 24 0,010 0,107 -0,114
Kurs → Suku bunga 0 0,000 0,023 0,000
Kurs → Suku bunga 3 0,033 0,084 * 0,032
Kurs → Suku bunga 12 0,038 0,097 * 0,038
Kurs → Suku bunga 24 0,038 0,097 * 0,038
Suku bunga → Kurs 0 0,276 0,000 0,263
Suku bunga → Kurs 3 0,726 * 0,489 0,722
Suku bunga → Kurs 12 0,797 * 0,527 0,781
Suku bunga → Kurs 24 0,797 * 0,527 0,757
Suku bunga → Inflasi 0 0,000 0,000 0,000
Suku bunga → Inflasi 3 0,051 0,046 0,126
Suku bunga → Inflasi 12 0,037 0,035 0,045
Suku bunga → Inflasi 24 0,037 0,035 0,004
Inflasi → Suku bunga 0 0,014 0,010 0,016
Inflasi → Suku bunga 3 0,067 0,054 0,073
Inflasi → Suku bunga 12 0,081 0,066 0,089
Inflasi → Suku bunga 24 0,081 0,066 0,089
kor <- cor(residuals(var_d))["bunga", "kurs"]