—- LANGKAH 0. Paket & pengaturan ———————————–

rm(list = ls()) # bersihkan objek lama (mis. dari nomor lain) agar tidak tercampur # install.packages(c(“urca”, “lmtest”, “sandwich”, “tseries”, “strucchange”, “readxl”)) # sekali saja library(urca) # uji akar unit, Phillips-Ouliaris, Johansen library(lmtest) # uji diagnostik & coeftest library(sandwich) # galat baku robust Newey-West (HAC) library(tseries) # uji Jarque-Bera library(strucchange) # uji stabilitas CUSUM library(readxl) # membaca file Excel

DATA ANDA: “data uas no 3 arw rapi” (sheet “data”)

kolom: tanggal, tahun, triwulan, konsumsi_rt, pdb, status_data

FOLDER <- file.path(Sys.getenv(ifelse(.Platform\(OS.type == "windows", "USERPROFILE", "HOME")), "Downloads") # <-- GANTI jika folder lain FILE_DATA <- file.path(FOLDER, "data uas no 3 arw rapi.xlsx") # <-- GANTI jika nama beda cari_file <- function(folder) { # cari nama mirip; abaikan file kunci Excel "~\)…” (muncul saat file sedang dibuka) cand <- list.files(folder, pattern = “no[ _]3[ _]arw.rapi.\.xlsx?\(", ignore.case = TRUE, full.names = TRUE) cand[!grepl("^~\\\)”, basename(cand))] } if (!file.exists(FILE_DATA)) { cand <- cari_file(FOLDER) if (length(cand) > 0) FILE_DATA <- cand[1] } if (!file.exists(FILE_DATA)) { # masih tidak ketemu -> pilih manual lewat jendela message(“File tidak ditemukan di:”, FILE_DATA, “pilih file secara manual.”) FILE_DATA <- file.choose() } cat(“File data:”, FILE_DATA, “”) SHEET <- “data”

SAMPEL <- “semua” # “semua” = 2010 Q1 - 2026 Q2 (66 obs); “tetap” = sampai 2023 Q4 (angka tetap BPS) LAG_MAKS <- 4 # lag maksimum selisih yang diperiksa pada ECM (data triwulanan) LAG_UTAMA <- 0 # lag selisih pada ECM UTAMA (0 = ECM dua tahap standar); lihat tabel sensitivitas KRITERIA <- “BIC” # kriteria pemilihan lag untuk ECM perluasan: “AIC” atau “BIC” DUMMY_MUSIM <- TRUE # dummy musiman triwulanan pada ECM (data BPS tidak disesuaikan musiman) DUMMY_COVID <- c(“2020Q2”, “2020Q3”) # dummy pulsa COVID-19 (kosongkan: c() bila tidak dipakai) LAG_HAC <- 4 # lag Newey-West untuk galat baku robust K_JOHANSEN <- 3 # lag VAR untuk uji Johansen utama ECDET_JOH <- “trend” # Johansen: “none” (konstanta bebas), “const”, atau “trend” (tren pada relasi kointegrasi) TINGKAT <- “5pct” # tingkat signifikansi nilai kritis: “10pct”, “5pct”, “1pct”

— Fungsi bantu —————————————————–

bintang <- function(p) ifelse(is.na(p), ““, ifelse(p < 0.001,”“, ifelse(p < 0.01,””, ifelse(p < 0.05, “”, ifelse(p < 0.1, “.”, ““))))) lagv <- function(x, k) c(rep(NA, k), head(x, length(x) - k)) # lag k periode leadv <- function(x, k) c(tail(x, length(x) - k), rep(NA, k)) # lead k periode statdes <- function(x) { x <- as.numeric(x); n <- length(x); m <- mean(x); s0 <- sqrt(mean((x - m)^2)) S <- mean((x - m)^3) / s0^3; K <- mean((x - m)^4) / s0^4 c(Rata2 = m, Median = median(x), Min = min(x), Maks = max(x), SimpBaku = sd(x), Skewness = S, Kurtosis = K, Obs = n) } # Uji akar unit satu deret: ADF & PP (H0: akar unit), KPSS (H0: stasioner) uji_akar <- function(x, tipe = c(”drift”, “trend”), lags = 4) { tipe <- match.arg(tipe) adf <- ur.df(x, type = tipe, lags = lags, selectlags = “AIC”) pp <- tryCatch(ur.pp(x, type = “Z-tau”, model = ifelse(tipe == “drift”, “constant”, “trend”), lags = “long”), error = function(e) NULL) kp <- ur.kpss(x, type = ifelse(tipe == “drift”, “mu”, “tau”), lags = “long”) data.frame( ADF_stat = round([1, 1], 3), ADF_krit = [1, “5pct”], PP_stat = if (is.null(pp)) NA else round(, 3), PP_krit = if (is.null(pp)) NA else [1, “5pct”], KPSS_stat = round(, 3), KPSS_krit = [1, “5pct”], Stasioner_ADF = [1, 1] < [1, “5pct”], Stasioner_KPSS = < [1, “5pct”]) } orde_int <- function(x, tipe_level) { if (uji_akar(x, tipe_level)\(Stasioner_ADF) return(0) if (uji_akar(diff(x), "drift")\)Stasioner_ADF) return(1) 2 } # Ringkasan koefisien dengan galat baku klasik & robust (HAC) tabel_koef <- function(m, lag = LAG_HAC) { ck <- coeftest(m) ch <- coeftest(m, vcov. = NeweyWest(m, lag = lag, prewhite = FALSE)) data.frame(Koefisien = round(ck[, 1], 5), SE = round(ck[, 2], 5), t = round(ck[, 3], 3), p = round(ck[, 4], 4), SE_HAC = round(ch[, 2], 5), t_HAC = round(ch[, 3], 3), p_HAC = round(ch[, 4], 4), Sig_HAC = bintang(ch[, 4])) }

—- LANGKAH 1. Baca data & pilih sampel —————————–

dat <- read_excel(FILE_DATA, sheet = SHEET) if (!all(c(“tanggal”, “konsumsi_rt”, “pdb”) %in% names(dat))) stop(“Kolom konsumsi_rt/pdb tidak ada. File yang terbaca salah:”, FILE_DATA, “yang dipilih adalah ‘data uas no 3 arw rapi’ (sheet ‘data’), bukan data no 2.”) dat\(tanggal <- as.Date(dat\)tanggal) head(dat) # CEK: tanggal, tahun, triwulan, konsumsi_rt, pdb, status_data dat <- dat[order(dat\(tanggal), ] if (SAMPEL == "tetap") dat <- subset(dat, status_data == "tetap") stopifnot(!anyNA(dat[, c("konsumsi_rt", "pdb")])) cat("Sampel:", nrow(dat), "triwulan |", dat\)tahun[1], “Q”, dat\(triwulan[1], "s.d.", dat\)tahun[nrow(dat)], “Q”, dat$triwulan[nrow(dat)], “”) # HASIL YANG SEHARUSNYA MUNCUL (SAMPEL = “semua”): # Sampel: 66 triwulan | 2010 Q 1 s.d. 2026 Q 2 print(round(sapply(dat[, c(“konsumsi_rt”, “pdb”)], statdes), 2))

—- LANGKAH 2. Transformasi & grafik ——————————–

lnC = ln(konsumsi rumah tangga), lnY = ln(PDB) (harga konstan 2010)

Model log-log: koefisien jangka panjang = ELASTISITAS konsumsi terhadap pendapatan.

lnC <- log(dat\(konsumsi_rt); lnY <- log(dat\)pdb) tsC <- ts(lnC, start = c(dat\(tahun[1], dat\)triwulan[1]), frequency = 4) tsY <- ts(lnY, start = c(dat\(tahun[1], dat\)triwulan[1]), frequency = 4)

par(mfrow = c(2, 2), mar = c(3, 4, 3, 1)) ts.plot(tsC, tsY, col = c(“firebrick”, “navy”), lwd = 2, main = “ln Konsumsi RT (merah) dan ln PDB (biru)”) plot(exp(tsC - tsY), main = “Rasio konsumsi RT / PDB”, ylab = “rasio”); abline(h = mean(exp(tsC - tsY)), lty = 2, col = “grey50”) plot(diff(tsC) * 100, main = “Pertumbuhan konsumsi RT (q-to-q, %)”, ylab = “%”); abline(h = 0, col = “grey60”) plot(diff(tsY) * 100, main = “Pertumbuhan PDB (q-to-q, %)”, ylab = “%”); abline(h = 0, col = “grey60”) par(mfrow = c(1, 1)) .

—- LANGKAH 3. Uji akar unit & orde integrasi ———————–

Deret ln bertren diuji dengan “trend”; selisih pertama dengan “drift”.

seri <- list(lnC = lnC, lnY = lnY) tab_level <- do.call(rbind, lapply(names(seri), function(n) data.frame(Variabel = n, Model = “trend”, uji_akar(seri[[n]], “trend”), row.names = NULL))) tab_diff <- do.call(rbind, lapply(names(seri), function(n) data.frame(Variabel = paste0(“d”, n), Model = “drift”, uji_akar(diff(seri[[n]]), “drift”), row.names = NULL))) cat(“=== Uji akar unit pada LEVEL ===”); print(tab_level, row.names = FALSE) cat(“=== Uji akar unit pada SELISIH PERTAMA ===”); print(tab_diff, row.names = FALSE) orde <- sapply(names(seri), function(n) orde_int(seri[[n]], “trend”)) cat(“integrasi (0 = stasioner di level, 1 = stasioner di selisih pertama):”); print(orde)

if (!all(orde == 1)) warning(“Tidak semua variabel I(1); tafsirkan uji kointegrasi dengan hati-hati.”)

—- LANGKAH 4. Regresi jangka panjang (Engle-Granger tahap 1) ——-

lnC_t = b0 + b1 lnY_t + u_t -> ECT_t = u_t = lnC_t - b0 - b1 lnY_t

lr <- lm(lnC ~ lnY) cat(“=== Regresi jangka panjang: lnC = b0 + b1 lnY ===”) print(tabel_koef(lr)) cat(“R-kuadrat:”, round(summary(lr)\(r.squared, 4), "| Durbin-Watson:", round(dwtest(lr)\)statistic, 3), “”) b0 <- coef(lr)[1]; b1 <- coef(lr)[2] ect <- residuals(lr) # ECT_t (penyimpangan dari keseimbangan) cat(sprintf(“Persamaan jangka panjang: ln(Konsumsi) = %.4f + %.4f ln(PDB)”, b0, b1)) t_h1 <- (b1 - 1) / coeftest(lr, vcov. = NeweyWest(lr, lag = LAG_HAC, prewhite = FALSE))[2, 2] cat(“Uji H0: b1 = 1 (elastisitas satu): t_HAC =”, round(t_h1, 3), “”)

Pembanding: DOLS (dynamic OLS) dengan 2 lead & 2 lag dlnY -> inferensi jangka panjang lebih valid

dY <- c(NA, diff(lnY)) dols_dat <- data.frame(lnC, lnY, dY_m2 = lagv(dY, 2), dY_m1 = lagv(dY, 1), dY_0 = dY, dY_p1 = leadv(dY, 1), dY_p2 = leadv(dY, 2)) dols <- lm(lnC ~ lnY + dY_m2 + dY_m1 + dY_0 + dY_p1 + dY_p2, data = dols_dat) cat(“=== DOLS (pembanding): koefisien lnY ===”) print(tabel_koef(dols)[“lnY”, ]) # BACA: b1 = elastisitas jangka panjang konsumsi terhadap PDB: kenaikan PDB 1% berasosiasi # dengan kenaikan konsumsi b1% dalam jangka panjang. Galat baku OLS tahap 1 tidak valid # untuk inferensi (regresi kointegrasi), gunakan DOLS/HAC sebagai indikasi. R2 tinggi # dan DW rendah pada data tren lazim (bukan bukti kointegrasi, lihat Langkah 5).

plot(ts(ect, start = start(tsC), frequency = 4), main = “ECT: penyimpangan konsumsi dari keseimbangan jangka panjang”, ylab = “u_t (ln)”); abline(h = 0, lty = 2, col = “grey40”)

—- LANGKAH 5. Uji kointegrasi ————————————–

eg <- ur.df(as.numeric(ect), type = “none”, lags = 4, selectlags = “AIC”) eg_stat <- [1, 1] eg_krit <- c(“10pct” = -3.04, “5pct” = -3.34, “1pct” = -3.90) eg_ya <- eg_stat < eg_krit[TINGKAT] cat(“=== (a) Engle-Granger: ADF pada residual ===”) cat(“Statistik ADF residual:”, round(eg_stat, 3), “| nilai kritis 10%/5%/1%:”, paste(eg_krit, collapse = ” / “),”“) cat(”Kesimpulan (“, TINGKAT,”):“, ifelse(eg_ya,”residual STASIONER -> ada kointegrasi”, “residual tidak stasioner -> TIDAK ada bukti kointegrasi”), “”)

(b) Phillips-Ouliaris (nilai kritis sudah memperhitungkan estimasi regresi)

po <- ca.po(cbind(lnC, lnY), demean = “constant”, type = “Pz”, lag = “long”) po_stat <- ; po_krit <- [1, TINGKAT]; po_ya <- po_stat > po_krit cat(“=== (b) Phillips-Ouliaris (Pz) ===”) cat(“Statistik Pz =”, round(po_stat, 3), “| nilai kritis”, TINGKAT, “=”, round(po_krit, 3), “”) cat(“Kesimpulan:”, ifelse(po_ya, “tolak H0 (tidak ada kointegrasi) -> ADA kointegrasi”, “gagal tolak H0 -> tidak ada bukti kointegrasi”), “”)

(c) Johansen: rank kointegrasi 2 variabel (spesifikasi utama)

pilih_rank <- function(jo, tingkat = “5pct”) { # rank berurutan r = 0, r <= 1, … ts_ <- ; cv <- [, tingkat]; n <- length(ts_); rank <- 0 for (i in n:1) { if (ts_[i] > cv[i]) rank <- rank + 1 else break } rank } jo <- ca.jo(cbind(lnC, lnY), type = “trace”, ecdet = ECDET_JOH, K = K_JOHANSEN, spec = “transitory”) cat(“=== (c) Johansen (trace), ecdet =”, ECDET_JOH, “, K =”, K_JOHANSEN, “===”); print(summary(jo)) tab_joh <- data.frame(H0 = c(“r <= 1”, “r = 0”), Statistik = round(, 3), Kritis_5pct = [, “5pct”], Keputusan = ifelse( > [, “5pct”], “Tolak H0”, “Gagal tolak H0”)) print(tab_joh, row.names = FALSE) rank_jo <- pilih_rank(jo, TINGKAT); jo_ya <- rank_jo >= 1 cat(“Rank kointegrasi (Johansen):”, rank_jo, “”)

Uji ketahanan Johansen: rank pada berbagai spesifikasi deterministik dan lag

grid <- expand.grid(ecdet = c(“none”, “const”, “trend”), K = 2:4, stringsAsFactors = FALSE) grid\(rank <- mapply(function(e, k) pilih_rank(ca.jo(cbind(lnC, lnY), type = "trace", ecdet = e, K = k, spec = "transitory"), TINGKAT), grid\)ecdet, grid\(K) cat("\n=== Ketahanan Johansen: rank pada spesifikasi berbeda ===\n") print(reshape(grid, idvar = "ecdet", timevar = "K", direction = "wide"), row.names = FALSE) cat("Spesifikasi dengan rank >= 1:", sum(grid\)rank >= 1), “dari”, nrow(grid), “”)

n_ya <- sum(c(eg_ya, po_ya, jo_ya)) ada_koint <- n_ya >= 2 cat(“>>> Ringkasan:”, n_ya, “dari 3 uji utama menyimpulkan ada kointegrasi ->”, ifelse(n_ya == 3, “bukti KUAT”, ifelse(n_ya == 2, “bukti CAMPURAN (mayoritas mendukung)”, ifelse(n_ya == 1, “bukti LEMAH”, “TIDAK ada bukti”))), “”)

—- LANGKAH 6. ECM (Engle-Granger tahap 2) ————————–

ECM: d lnC_t = a0 + g ECT_{t-1} + f d lnY_t + [lag d lnC, d lnY] + dummy + e_t

g = koefisien koreksi kesalahan (ECT), diharapkan -1 < g < 0

f = elastisitas jangka pendek konsumsi terhadap PDB

dC <- c(NA, diff(lnC)) D <- data.frame(dC = dC, dY = dY, ect_l1 = lagv(ect, 1), tahun = dat\(tahun, tw = dat\)triwulan) for (k in 1:LAG_MAKS) { D[[paste0(“dC_l”, k)]] <- lagv(dC, k); D[[paste0(“dY_l”, k)]] <- lagv(dY, k) } if (DUMMY_MUSIM) { D\(Q2 <- as.numeric(D\)tw == 2); D\(Q3 <- as.numeric(D\)tw == 3); D\(Q4 <- as.numeric(D\)tw == 4) } nm_covid <- character(0) for (d in DUMMY_COVID) { y_ <- as.integer(substr(d, 1, 4)); q_ <- as.integer(substr(d, 6, 6)); nm <- paste0(“D”, d) D[[nm]] <- as.numeric(D\(tahun == y_ & D\)tw == q_); nm_covid <- c(nm_covid, nm) } ekstra <- c(if (DUMMY_MUSIM) c(“Q2”, “Q3”, “Q4”), nm_covid) rhs <- function(p) c(“ect_l1”, “dY”, if (p > 0) c(paste0(“dC_l”, 1:p), paste0(“dY_l”, 1:p)), ekstra) ok <- function(vars) complete.cases(D[, c(“dC”, vars)]) hac_p <- function(m, nama) coeftest(m, vcov. = NeweyWest(m, lag = LAG_HAC, prewhite = FALSE))[nama, ]

(a) ECM sederhana (bentuk buku teks, tanpa dummy): d lnC ~ d lnY + ECT(-1)

ecm_a <- lm(dC ~ dY + ect_l1, data = D[ok(c(“dY”, “ect_l1”)), ]) cat(“=== (a) ECM sederhana: d lnC ~ d lnY + ECT(-1) ===”); print(tabel_koef(ecm_a))

(b) ECM UTAMA: dengan dummy musiman dan COVID-19, lag selisih = LAG_UTAMA

D_utama <- D[ok(rhs(LAG_UTAMA)), ] ecm <- lm(reformulate(rhs(LAG_UTAMA), “dC”), data = D_utama) cat(“=== (b) ECM UTAMA (lag =”, LAG_UTAMA, “, n =”, nrow(D_utama), “) ===”, sep = ““) tab_ecm <- tabel_koef(ecm); print(tab_ecm) cat(”R2:“, round(summary(ecm)\(r.squared, 4), "| R2 adj:", round(summary(ecm)\)adj.r.squared, 4),”| AIC:“, round(AIC(ecm), 3),”| BIC:“, round(BIC(ecm), 3),”“) # BACA: baris”ect_l1” = koefisien koreksi kesalahan (g); “dY” = elastisitas jangka pendek (f). # Gunakan kolom HAC (galat baku robust) bila terdapat autokorelasi/heteroskedastisitas.

(c) SENSITIVITAS terhadap jumlah lag selisih (sampel yang sama untuk semua lag)

cc <- complete.cases(D[, c(“dC”, paste0(“dC_l”, 1:LAG_MAKS), paste0(“dY_l”, 1:LAG_MAKS), “ect_l1”, “dY”)]) sens <- t(sapply(0:LAG_MAKS, function(p) { m <- lm(reformulate(rhs(p), “dC”), data = D[cc, ]); h <- hac_p(m, “ect_l1”) c(lag = p, ECT = coef(m)[“ect_l1”], t_HAC = h[3], p_HAC = h[4], dY = coef(m)[“dY”], AIC = AIC(m), BIC = BIC(m), R2adj = summary(m)$adj.r.squared) })) colnames(sens) <- c(“lag”, “ECT”, “t_HAC”, “p_HAC”, “dY”, “AIC”, “BIC”, “R2adj”) cat(“=== (c) Sensitivitas ECT terhadap jumlah lag selisih ===”); print(round(sens, 4), row.names = FALSE) stabil <- all(sens[, “ECT”] < 0 & sens[, “p_HAC”] < 0.05) cat(ifelse(stabil, “ECT negatif dan signifikan pada SEMUA lag -> hasil kuat terhadap spesifikasi lag.”, paste0(“PERHATIAN: ECT tidak stabil terhadap jumlah lag (negatif-signifikan pada”, sum(sens[, “ECT”] < 0 & sens[, “p_HAC”] < 0.05), ” dari “, nrow(sens),” spesifikasi). “,”Interpretasi kecepatan penyesuaian harus disertai catatan ini.“)))

(d) ECM PERLUASAN: lag selisih dipilih oleh AIC/BIC

p_opt <- sens[which.min(sens[, KRITERIA]), “lag”] D_ext <- D[ok(rhs(p_opt)), ] ecm_ext <- lm(reformulate(rhs(p_opt), “dC”), data = D_ext) cat(“=== (d) ECM PERLUASAN (lag dipilih”, KRITERIA, ” = “, p_opt,”, n = “, nrow(D_ext),”) ===“, sep =”“) print(tabel_koef(ecm_ext)) # BACA: ECM perluasan memasukkan dinamika musiman/inersia (lag). Bila ECT-nya berubah tanda atau # tidak signifikan, berarti dinamika lag menyerap pola musiman yang tadinya ditangkap ECT; # laporkan sebagai keterbatasan dan gunakan ECM utama untuk menjawab makna ECT.

—- LANGKAH 7. Koefisien ECT & jangka pendek (ECM utama) ————-

g <- coef(ecm)[“ect_l1”]; f <- coef(ecm)[“dY”] g_t <- hac_p(ecm, “ect_l1”)[3]; g_p <- hac_p(ecm, “ect_l1”)[4] g_p1 <- pt(g_t, df = df.residual(ecm)) # uji satu sisi H1: g < 0 half <- if (g < 0 && g > -1) log(0.5) / log(1 + g) else NA cat(“=== Koefisien koreksi kesalahan (ECT), ECM utama ===”) cat(sprintf(“g = %.4f | t_HAC = %.3f | p dua sisi = %.4f | p satu sisi (g<0) = %.4f”, g, g_t, g_p, g_p1)) if (!is.na(half)) { cat(sprintf(“Kecepatan penyesuaian: %.1f%% dari ketidakseimbangan dikoreksi tiap triwulan”, 100 * abs(g))) cat(sprintf(“Half-life: %.1f triwulan (= %.1f tahun) | 90%% terkoreksi dalam %.1f triwulan”, half, half / 4, log(0.1) / log(1 + g))) } else cat(“Half-life tidak dihitung karena g di luar rentang (-1, 0).”) cat(sprintf(“Elastisitas jangka pendek (dY) f = %.4f | jangka panjang b1 = %.4f”, f, b1)) cat(“:”) cat(sprintf(” Jangka pendek : PDB naik 1%% -> konsumsi naik sekitar %.2f%% pada triwulan yang sama“, f)) cat(sprintf(” Jangka panjang: PDB naik 1%% -> konsumsi naik sekitar %.2f%% setelah penyesuaian penuh“, b1)) # BACA (makna ECT): # g < 0 dan signifikan : ada mekanisme koreksi; bila konsumsi berada di ATAS keseimbangan # jangka panjangnya (ECT > 0), pertumbuhan konsumsi berikutnya lebih # rendah, dan sebaliknya. |g| = proporsi selisih yang dikoreksi per triwulan. # -1 < g < 0 : penyesuaian bertahap menuju keseimbangan (stabil, monoton). # g tidak signifikan : konsumsi tidak menyesuaikan diri (hubungan jangka panjang lemah). # g > 0 atau g < -2 : tidak sesuai teori (tidak stabil).

par(mfrow = c(1, 2), mar = c(4, 4, 3, 1)) plot(D_utama$dC, type = “l”, col = “grey50”, main = “d lnC aktual vs fitted (ECM utama)”, ylab = “d lnC”, xlab = “observasi”) lines(fitted(ecm), col = “firebrick”, lwd = 2); legend(“topright”, c(“Aktual”, “Fitted”), col = c(“grey50”, “firebrick”), lty = 1, bty = “n”) plot(ts(ect, start = start(tsC), frequency = 4), main = “ECT (penyimpangan dari keseimbangan)”, ylab = “u_t”); abline(h = 0, lty = 2) par(mfrow = c(1, 1))

—- LANGKAH 8. Diagnostik model (ECM utama) ————————–

cat(“=== Autokorelasi (Breusch-Godfrey, lag 4) ===”); print(bgtest(ecm, order = 4)) cat(“=== Autokorelasi (Ljung-Box, lag 8) ===”); print(Box.test(residuals(ecm), lag = 8, type = “Ljung-Box”, fitdf = 0)) cat(“=== Heteroskedastisitas (Breusch-Pagan) ===”); print(bptest(ecm)) cat(“=== Normalitas residual (Jarque-Bera) ===”); print(jarque.bera.test(residuals(ecm))) cat(“=== Spesifikasi (RESET) ===”); print(resettest(ecm, power = 2:3, type = “fitted”)) cat(“=== Stabilitas parameter (CUSUM) ===”) cus <- efp(reformulate(rhs(LAG_UTAMA), “dC”), data = D_utama, type = “Rec-CUSUM”) print(sctest(cus)); plot(cus, main = “CUSUM rekursif (ECM utama)”)

—- LANGKAH 9. Uji ketahanan —————————————

(a) ECM satu tahap (Banerjee dkk.): d lnC ~ lnC(-1) + lnY(-1) + d lnY + dummy

koefisien lnC(-1) = penyesuaian; elastisitas jangka panjang = -koef lnY(-1) / koef lnC(-1)

S <- data.frame(dC = dC, dY = dY, lnC_l1 = lagv(lnC, 1), lnY_l1 = lagv(lnY, 1), tw = dat\(triwulan, tahun = dat\)tahun) if (DUMMY_MUSIM) { S\(Q2 <- as.numeric(S\)tw == 2); S\(Q3 <- as.numeric(S\)tw == 3); S\(Q4 <- as.numeric(S\)tw == 4) } for (d in DUMMY_COVID) S[[paste0(“D”, d)]] <- as.numeric(S\(tahun == as.integer(substr(d, 1, 4)) & S\)tw == as.integer(substr(d, 6, 6))) S <- S[complete.cases(S), ] sat <- lm(reformulate(c(“lnC_l1”, “lnY_l1”, “dY”, ekstra), “dC”), data = S) cat(“=== ECM satu tahap ===”); print(tabel_koef(sat)) lam <- coef(sat)[“lnC_l1”]; th <- coef(sat)[“lnY_l1”] V <- NeweyWest(sat, lag = LAG_HAC, prewhite = FALSE)[c(“lnC_l1”, “lnY_l1”), c(“lnC_l1”, “lnY_l1”)] grad <- c(th / lam^2, -1 / lam); b_1t <- -th / lam se_b <- sqrt(as.numeric(t(grad) %% V %% grad)) cat(sprintf(“jangka panjang (satu tahap) = %.4f (SE delta, HAC = %.4f) | penyesuaian = %.4f”, b_1t, se_b, lam))

(b) ECM pada sampel angka tetap BPS (sampai 2023 Q4), bila belum dipakai

if (SAMPEL == “semua”) { idx_t <- dat\(status_data == "tetap" lr_t <- lm(lnC[idx_t] ~ lnY[idx_t]); ect_t <- residuals(lr_t) Dt <- D[idx_t, ]; Dt\)ect_l1 <- lagv(ect_t, 1) Dt <- Dt[complete.cases(Dt[, c(“dC”, rhs(LAG_UTAMA))]), ] ecm_t <- lm(reformulate(rhs(LAG_UTAMA), “dC”), data = Dt) cat(“=== Ketahanan: sampel angka tetap (sampai 2023 Q4, n =”, nrow(Dt), “) ===”) cat(sprintf(“Elastisitas jangka panjang = %.4f | ECT g = %.4f (p HAC = %.4f) | elastisitas jangka pendek = %.4f”, coef(lr_t)[2], coef(ecm_t)[“ect_l1”], hac_p(ecm_t, “ect_l1”)[4], coef(ecm_t)[“dY”])) } # BACA: bila tanda dan besar koefisien serupa dengan model utama, kesimpulan tahan terhadap # revisi angka sementara 2024-2026 dan spesifikasi ECM (dua tahap vs satu tahap).

—- LANGKAH 10. Ringkasan interpretasi otomatis ———————

cat(“================ RINGKASAN INTERPRETASI ================”) cat(“Sampel :”, nrow(dat), “triwulan (”, dat\(tahun[1], "Q", dat\)triwulan[1], “-”, dat\(tahun[nrow(dat)], "Q", dat\)triwulan[nrow(dat)], “)”) cat(“Orde integrasi : lnC =”, orde[“lnC”], “, lnY =”, orde[“lnY”], “”) cat(“Kointegrasi : EG-ADF =”, round(eg_stat, 2), “(kritis 5% = -3,34) |”, “PO Pz =”, round(po_stat, 2), “(kritis =”, round(po_krit, 2), “) |”, “Johansen (”, ECDET_JOH, “, K=”, K_JOHANSEN, “) rank =”, rank_jo, “”) cat(” ->“, n_ya,”dari 3 uji mendukung kointegrasi:“, ifelse(ada_koint,”ADA hubungan jangka panjang (bukti mayoritas)“,”bukti hubungan jangka panjang lemah”), “”) cat(sprintf(“Jangka panjang : ln C = %.4f + %.4f ln Y (elastisitas = %.2f)”, b0, b1, b1)) cat(sprintf(“Jangka pendek : elastisitas d lnY = %.3f”, f)) cat(sprintf(“ECT (g), ECM utama : %.4f, t_HAC = %.2f, p = %.4f %s -> %s”, g, g_t, g_p, bintang(g_p), ifelse(g < 0 & g > -1 & g_p1 < 0.05, “menyesuaikan menuju keseimbangan (signifikan)”, ifelse(g < 0 & g > -1, “arah benar tetapi tidak signifikan”, “tidak sesuai harapan teori”)))) if (!is.na(half)) cat(sprintf(“Kecepatan koreksi : %.1f%% per triwulan | half-life = %.1f triwulan (%.1f tahun)”, 100 * abs(g), half, half / 4)) cat(“Stabilitas ECT :”, ifelse(stabil, “kuat terhadap jumlah lag”, “TIDAK stabil terhadap jumlah lag (lihat Langkah 6c)”), “”) cat(“Diagnostik : p BG =”, round(bgtest(ecm, order = 4)\(p.value, 4), "| p BP =", round(bptest(ecm)\)p.value, 4), “| p JB =”, round(jarque.bera.test(residuals(ecm))\(p.value, 4), "| p RESET =", round(resettest(ecm, power = 2:3, type = "fitted")\)p.value, 4), “”) cat(“========================================================”)

R Markdown

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.

When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:

summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00

Including Plots

You can also embed plots, for example:

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.