Skenario 31 — HB Beta · Top-n/10 · RSE Equal Size. Seleksi variabel auxiliary menggunakan Top-n/10 dengan dua lapis filter:
p < 0,05) — variabel yang korelasinya tidak signifikan
secara statistik dibuang.− tapi empiris +) dibuang.Hanya variabel yang lolos keduanya yang masuk ke kandidat Top-n. Jika tidak ada variabel lolos di suatu segmen, segmen tersebut di-skip (tidak diproses).
# Load urutan: MASS & car DULU, baru dplyr (cegah masking select/recode)
library(MASS)
library(car)
library(readxl)
library(dplyr)
library(tidyr)
library(ggplot2)
library(scales)
library(patchwork)
library(sae)
library(classInt)
library(knitr)
library(kableExtra)
# Ikat namespace kritis
select <- dplyr::select
recode <- dplyr::recodehas_jags <- tryCatch({
library(rjags); library(saeHB); TRUE
}, error = function(e) {
message("saeHB/JAGS tidak tersedia — skenario HB Beta akan fallback ke direct.")
FALSE
})
cat("Status JAGS/saeHB:", ifelse(has_jags, "Tersedia", "Tidak tersedia"), "\n")## Status JAGS/saeHB: Tersedia
Estimasi_531 <- read_excel("C:/Users/User/Downloads/Hasil_Sulawesi_Kab2025.xlsx")
Podes_kab2024 <- read_excel("C:/Users/User/Downloads/Podes_kab_lengkap.xlsx")
Data_Penduduk <- read_excel("C:/Users/User/Downloads/Data_Penduduk.xlsx")
Estimasi_531 <- Estimasi_531 %>% mutate(Kako = sprintf("%04d", Kako))
Podes_kab2024 <- Podes_kab2024 %>% mutate(kode_kab = sprintf("%04s", kode_kab))
df_gabungan <- Estimasi_531 %>%
left_join(Podes_kab2024, by = c("Kako" = "kode_kab")) %>%
dplyr::select(Kako, Estimasi, RSE, starts_with("X"))
df_gabungan$Kako <- as.numeric(df_gabungan$Kako)
df_final <- df_gabungan %>% left_join(Data_Penduduk, by = "Kako")
cat("Jumlah domain:", nrow(df_final), "\n")## Jumlah domain: 81
## Jumlah variabel: 118
df_final <- df_final %>%
mutate(
X6 = X6_jumlah / Jumlah_Penduduk * 1000,
X7 = X7_jumlah / Jumlah_Penduduk * 1000,
X10 = X10_jumlah / Jumlah_Penduduk * 1000,
X33 = X33_jumlah / Jumlah_Penduduk * 1000,
X11 = X11_jumlah / Jumlah_P * 1000,
X12 = X12_jumlah / Jumlah_P * 1000,
X27 = X27_jumlah / Jumlah_P * 1000,
X28 = X28_jumlah / Jumlah_P * 1000,
X29 = X29_jumlah / Jumlah_P * 1000,
X30 = X30_jumlah / Jumlah_P * 1000,
X31 = X31_jumlah / Jumlah_P * 1000,
X35 = X35_jumlah / Jumlah_P * 1000,
X36 = X36_jumlah / Jumlah_P * 1000
)eps_logit <- 1e-4
df_base <- df_final %>%
mutate(
vardir = (RSE / 100 * Estimasi)^2,
y_prop = pmax(pmin(Estimasi / 100, 1 - eps_logit), eps_logit),
y_logit = log(y_prop / (1 - y_prop))
) %>%
as.data.frame()
# Kandidat aux: HANYA kolom yang diawali "X"
kandidat_vars <- names(df_base)[startsWith(names(df_base), "X")]
excl_always <- setdiff(names(df_base), kandidat_vars)
cat("Variabel kandidat (", length(kandidat_vars), "):\n",
paste(kandidat_vars, collapse = ", "), "\n")## Variabel kandidat ( 125 ):
## X1, X2, X8, X9, X13, X14, X15, X16, X17, X18, X19, X21, X22, X23, X24, X25, X26, X32, X37, X38, X39, X40, X41, X43, X44, X45, X1_jumlah, X1_mean, X2_jumlah, X2_mean, X8_jumlah, X8_mean, X9_jumlah, X9_mean, X13_jumlah, X13_mean, X14_jumlah, X14_mean, X15_jumlah, X15_mean, X16_jumlah, X16_mean, X17_jumlah, X17_mean, X18_jumlah, X18_mean, X19_jumlah, X19_mean, X21_jumlah, X21_mean, X22_jumlah, X22_mean, X23_jumlah, X23_mean, X24_jumlah, X24_mean, X25_jumlah, X25_mean, X26_jumlah, X26_mean, X32_jumlah, X32_mean, X34_jumlah, X34_mean, X37_jumlah, X37_mean, X38_jumlah, X38_mean, X39_jumlah, X39_mean, X40_jumlah, X40_mean, X41_jumlah, X41_mean, X43_jumlah, X43_mean, X44_jumlah, X44_mean, X45_jumlah, X45_mean, X6_jumlah, X6_mean, X7_jumlah, X7_mean, X10_jumlah, X10_mean, X11_jumlah, X11_mean, X12_jumlah, X12_mean, X27_jumlah, X27_mean, X28_jumlah, X28_mean, X29_jumlah, X29_mean, X30_jumlah, X30_mean, X31_jumlah, X31_mean, X33_jumlah, X33_mean, X35_jumlah, X35_mean, X36_jumlah, X36_mean, X46, X3, X4, X5, X47, X48, X6, X7, X10, X33, X11, X12, X27, X28, X29, X30, X31, X35, X36
##
## Total dikecualikan: 9 kolom
# ── pilih_per_grup (UPGRADED v2) ──────────────────────────────────────────────
#
# Untuk setiap grup X (mis. X19, X19_mean, X19_jumlah → grup "X19"):
# [1] Evaluasi SEMUA anggota: hitung cor bertanda (vs y_logit), p-value Pearson,
# dan cek kesesuaian arah teori (TEORI_ARAH)
# [2] Filter: lolos hanya jika KEDUANYA terpenuhi:
# (a) Signifikansi → p < alpha
# (b) Arah teori → tanda empiris sesuai TEORI_ARAH
# (var tidak terdaftar di TEORI_ARAH → arah bebas, otomatis lolos)
# [3] Dari anggota yang lolos, pilih 1 dengan |cor(logit)| TERTINGGI
# [4] Jika tidak ada yang lolos → grup tidak punya representatif (di-skip)
#
# Catatan: y_col diasumsikan skala logit (y_logit) sesuai target model HB Beta
#
pilih_per_grup <- function(df, kandidat, y_col,
alpha = 0.05,
teori_arah = get("TEORI_ARAH", envir = .GlobalEnv)) {
get_base <- function(x) sub("_(jumlah|mean|sum|prop)$", "", x)
bases <- unique(sapply(kandidat, get_base))
terpilih <- c()
for (b in bases) {
anggota <- kandidat[get_base(kandidat) == b]
# ── [1] Evaluasi penuh setiap anggota ──────────────────────────────────
eval_anggota <- lapply(anggota, function(v) {
ct <- tryCatch(
cor.test(df[[v]], df[[y_col]], method = "pearson"),
error = function(e) NULL
)
if (is.null(ct) || is.na(ct$estimate)) {
return(list(v = v, cor_s = NA_real_, cor_a = NA_real_,
pval = NA_real_, sig = FALSE,
teori = NA_character_, arah_ok = FALSE))
}
cor_s <- as.numeric(ct$estimate)
pval <- ct$p.value
sig <- !is.na(pval) && pval < alpha
# Cek arah teori berdasarkan nama basis
base_v <- get_base(v)
teori_v <- if (base_v %in% names(teori_arah)) teori_arah[[base_v]] else NA_character_
arah_ok <- if (is.na(teori_v)) TRUE
else if (teori_v == "+") cor_s > 0
else if (teori_v == "-") cor_s < 0
else TRUE
list(v = v,
cor_s = cor_s,
cor_a = abs(cor_s),
pval = pval,
sig = sig,
teori = ifelse(is.na(teori_v), "?", teori_v),
arah_ok = arah_ok)
})
# ── [2] Log tabel diagnostik (hanya tampil jika ada >1 anggota) ────────
if (length(anggota) > 1) {
cat(sprintf(" [GrupX: %-12s] %d kandidat:\n", b, length(anggota)))
cat(sprintf(" %-20s %7s %6s %7s %8s %6s %7s Status\n",
"Var", "|cor|", "Tanda", "Teori", "p-val", "Sig?", "Arah?"))
cat(" ", strrep("-", 75), "\n", sep = "")
for (h in eval_anggota) {
status <- if (!h$sig && !h$arah_ok) "GUGUR-keduanya"
else if (!h$sig) "GUGUR-sig"
else if (!h$arah_ok) "GUGUR-arah"
else "LOLOS"
cat(sprintf(" %-20s %7.4f %6s %7s %8.4f %6s %7s %s\n",
h$v,
ifelse(is.na(h$cor_a), NA, h$cor_a),
ifelse(is.na(h$cor_s), "?",
ifelse(h$cor_s > 0, "(+)", "(-)")),
h$teori,
ifelse(is.na(h$pval), NA, h$pval),
ifelse(h$sig, "YES", "no"),
ifelse(h$arah_ok, "YES", "no"),
status))
}
}
# ── [3] Filter: lolos sig DAN arah ─────────────────────────────────────
lolos <- Filter(function(h) isTRUE(h$sig) && isTRUE(h$arah_ok), eval_anggota)
if (length(lolos) == 0) {
if (length(anggota) > 1)
cat(sprintf(" → Tidak ada anggota lolos sig+arah — grup [%s] di-skip\n\n", b))
next # grup ini tidak menghasilkan representatif
}
# ── [4] Pilih pemenang: |cor(logit)| tertinggi di antara yang lolos ────
cor_lolos <- sapply(lolos, function(h) h$cor_a)
pemenang <- lolos[[which.max(cor_lolos)]]
if (length(anggota) > 1)
cat(sprintf(" → Terpilih: %-18s |cor|=%.4f p=%.4f\n\n",
pemenang$v, pemenang$cor_a, pemenang$pval))
terpilih <- c(terpilih, pemenang$v)
}
unique(terpilih)
}# ── Tabel teori arah korelasi terhadap variabel respons (kemiskinan/logit) ───
# "+": variabel berkorelasi POSITIF (naik X → naik Y)
# "-": variabel berkorelasi NEGATIF (naik X → turun Y)
# Variabel tidak terdaftar → tidak ada restriksi arah (tetap masuk kandidat)
TEORI_ARAH <- c(
X1 = "+", X2 = "-", X3 = "-", X4 = "-", X5 = "-",
X6 = "+", X7 = "+", X8 = "+", X9 = "-", X10 = "+",
X11 = "-", X12 = "-", X13 = "-", X14 = "-", X15 = "-",
X16 = "-", X17 = "-", X18 = "-", X19 = "-", X20 = "+",
X21 = "+", X22 = "-", X23 = "-", X24 = "-", X25 = "-",
X26 = "+", X27 = "-", X28 = "-", X29 = "-", X30 = "-",
X31 = "-", X32 = "+", X33 = "+", X34 = "+", X35 = "-",
X36 = "-", X37 = "+", X38 = "-", X39 = "-", X40 = "-",
X41 = "-", X42 = "+", X43 = "-", X44 = "-", X45 = "-",
X46 = "-", X47 = "+", X48 = "-"
)
# Tampilkan ringkasan
cat("Teori arah korelasi terdefinisi untuk", length(TEORI_ARAH), "variabel:\n")## Teori arah korelasi terdefinisi untuk 48 variabel:
cat(" Positif (+):", sum(TEORI_ARAH == "+"), "vars |",
"Negatif (-):", sum(TEORI_ARAH == "-"), "vars\n")## Positif (+): 14 vars | Negatif (-): 34 vars
# ── Ambil nama basis variabel: "X27_mean" → "X27", "X10" → "X10" ────────────
.base_xvar <- function(v) sub("_(jumlah|mean|sum|prop)$", "", v)
# ── seleksi_topn (UPGRADED v3) ───────────────────────────────────────────────
#
# Upgrade v3 (di atas v2): filter sig + arah dipindah ke DALAM pilih_per_grup
# sehingga seleksi representatif per grup sudah dijamin lolos keduanya.
# Steps [3a] dan [3b] di sini menjadi konfirmasi (tidak akan drop apapun lagi).
#
# Pipeline lengkap:
# 1. Buang kolom konstan
# 2. pilih_per_grup (v2) — per grup X:
# (a) Evaluasi SEMUA varian: cor(logit), p-value, arah teori
# (b) Filter lolos: p < alpha DAN arah sesuai TEORI_ARAH
# (c) Pilih 1 pemenang: |cor(logit)| tertinggi di antara yang lolos
# (d) Grup tanpa pemenang → tidak punya representatif (di-skip)
# 3. Hitung cor bertanda & |cor| kandidat terpilih (untuk ranking)
# 3a. [Konfirmasi] Log signifikansi Pearson
# 3b. [Konfirmasi] Log arah teori
# 4. Urutkan |cor| descending → ambil top n/10
# 5. VIF check (drop VIF > 10 tertinggi, iteratif)
# 6. R² cap → ringkas ke 1 var jika R² > r2_cap
#
# Log: tabel lengkap per-variabel (|cor|, tanda, teori, p-value, status filter)
#
seleksi_topn <- function(df, y_col, excl_cols = NULL,
r2_cap = 0.8,
alpha = 0.05,
teori_arah = get("TEORI_ARAH", envir = .GlobalEnv)) {
if (is.null(excl_cols)) excl_cols <- names(df)[!startsWith(names(df), "X")]
n_domain <- nrow(df)
max_top <- min(max(1L, floor(n_domain / 10L)), 8L)
# [1] Buang kolom konstan
keep <- sapply(df, function(x) length(unique(na.omit(x))) > 1)
df <- df[, keep]
kandidat <- setdiff(names(df), excl_cols)
kandidat <- kandidat[startsWith(kandidat, "X")]
if (length(kandidat) == 0) return(character(0))
# [2] Pilih 1 representatif per grup X (v2: sudah filter sig + arah di dalam)
kandidat <- pilih_per_grup(df, kandidat, y_col,
alpha = alpha,
teori_arah = teori_arah)
if (length(kandidat) == 0) return(character(0))
# [3] Hitung cor bertanda (signed) & |cor|
cor_signed <- sapply(kandidat, function(v)
tryCatch(cor(df[[v]], df[[y_col]], use = "complete.obs"),
error = function(e) NA_real_))
cor_signed <- cor_signed[!is.na(cor_signed)]
if (length(cor_signed) == 0) return(character(0))
cor_abs <- abs(cor_signed)
# [3a] Uji Pearson — hitung p-value (konfirmasi; sudah difilter di pilih_per_grup)
pval_v <- sapply(names(cor_signed), function(v) {
ct <- tryCatch(
cor.test(df[[v]], df[[y_col]], method = "pearson", use = "complete.obs"),
error = function(e) NULL
)
if (is.null(ct)) NA_real_ else ct$p.value
})
# [3b] Cek arah teori (konfirmasi; sudah difilter di pilih_per_grup)
# Ambil nama basis (X27_mean → X27) lalu cocokkan ke TEORI_ARAH
teori_v <- sapply(names(cor_signed), function(v) {
base <- .base_xvar(v)
if (base %in% names(teori_arah)) teori_arah[[base]] else NA_character_
})
# Evaluasi kecocokan arah: NA teori = tidak direstriksi (TRUE)
arah_ok <- mapply(function(cor_s, teori) {
if (is.na(teori)) return(TRUE) # tidak ada restriksi
if (teori == "+") return(cor_s > 0)
if (teori == "-") return(cor_s < 0)
TRUE
}, cor_signed, teori_v)
# ── Cetak tabel konfirmasi (semua harus LOLOS — sudah diseleksi pilih_per_grup) ──
cat(sprintf(
"\n [TopN Konfirmasi | n=%d | y=%s | alpha=%.2f]\n", nrow(df), y_col, alpha))
cat(sprintf(" %-18s %8s %6s %8s %8s %8s %10s\n",
"Variabel", "|cor|", "Tanda", "Teori",
"p-val", "Sig?", "Arah OK?"))
cat(" ", strrep("-", 72), "\n", sep = "")
for (v in names(cor_signed)) {
sig_ok <- !is.na(pval_v[v]) && pval_v[v] < alpha
arah_ok_v <- arah_ok[v]
status <- dplyr::case_when(
!sig_ok & !arah_ok_v ~ "GUGUR-keduanya",
!sig_ok ~ "GUGUR-sig",
!arah_ok_v ~ "GUGUR-arah",
TRUE ~ "LOLOS"
)
cat(sprintf(" %-18s %8.4f %6s %8s %8.4f %8s %10s %s\n",
v,
cor_abs[v],
ifelse(cor_signed[v] > 0, "(+)", "(-)"),
ifelse(is.na(teori_v[v]), "?", teori_v[v]),
ifelse(is.na(pval_v[v]), NA, pval_v[v]),
ifelse(sig_ok, "YES", "no"),
ifelse(arah_ok_v, "YES", "no"),
status))
}
cat("\n")
# ── Variabel lolos (sudah pasti semua LOLOS karena difilter di pilih_per_grup) ──
lolos_mask <- (!is.na(pval_v) & pval_v < alpha) & arah_ok
vars_lolos <- names(cor_signed)[lolos_mask]
# Guard: jika ada yang tidak lolos (seharusnya tidak terjadi) → catat sebagai anomali
anomali <- names(cor_signed)[!lolos_mask]
if (length(anomali) > 0)
cat(sprintf(" [TopN] !! ANOMALI — var lolos pilih_per_grup tapi gagal konfirmasi: %s\n",
paste(anomali, collapse = ", ")))
if (length(vars_lolos) == 0) {
cat(sprintf(
" [TopN] Tidak ada variabel lolos → segmen di-SKIP\n\n"))
return(character(0))
}
cat(sprintf(" [TopN] Kandidat final untuk ranking (%d): %s\n",
length(vars_lolos), paste(vars_lolos, collapse = ", ")))
# [4] Urutkan |cor| descending → ambil top max_top
cor_lolos <- cor_abs[vars_lolos]
vars <- names(sort(cor_lolos, decreasing = TRUE))[
1:min(max_top, length(cor_lolos))]
vars <- vars[!is.na(vars)]
# [5] VIF check: drop variabel VIF > 10 satu per satu (tertinggi)
repeat {
if (length(vars) <= 1) break
m <- try(lm(as.formula(paste(y_col, "~", paste(vars, collapse = "+"))),
data = df), silent = TRUE)
if (inherits(m, "try-error")) { vars <- vars[1]; break }
v_vif <- try(vif(m), silent = TRUE)
if (inherits(v_vif, "try-error")) break
v_ok <- v_vif[!is.na(v_vif)]
if (length(v_ok) == 0 || all(v_ok <= 10)) break
cat(sprintf(" [TopN] VIF drop: %s (VIF=%.1f)\n",
names(which.max(v_ok)), max(v_ok, na.rm = TRUE)))
vars <- vars[vars != names(which.max(v_ok))]
}
# [6] R² cap
if (length(vars) > 1) {
m <- lm(as.formula(paste(y_col, "~", paste(vars, collapse = "+"))),
data = df)
r2 <- summary(m)$r.squared
if (r2 > r2_cap) {
cat(sprintf(" [TopN] R²=%.3f > cap %.2f → ringkas ke 1 var\n",
r2, r2_cap))
vars <- vars[1]
}
}
cat(sprintf(" [TopN] ✓ Final vars (%d): %s\n\n",
length(vars), paste(vars, collapse = ", ")))
return(vars)
}# ── Helper: identifikasi kovariat yang CI-nya menyeberang nol ────────────────
# Akses POSISIONAL — bukan berbasis rownames (saeHB kadang pakai "beta[1]" dst)
# Struktur baku saeHB::Beta()$coefficient:
# Baris 1 = intercept (di-skip)
# Baris 2..k+1 = kovariat urutan sesuai formula
# Kolom 3 = 2.5% | Kolom 7 = 97.5%
.vars_cross_ci <- function(coef_mat, var_names) {
if (is.null(coef_mat) || nrow(coef_mat) < 2L || ncol(coef_mat) < 7L)
return(character(0))
p <- min(length(var_names), nrow(coef_mat) - 1L)
sub <- coef_mat[1L + seq_len(p), , drop = FALSE]
ci_lo <- as.numeric(sub[, 3L])
ci_hi <- as.numeric(sub[, 7L])
cross <- which(ci_lo < 0 & ci_hi > 0)
if (length(cross) == 0L) return(character(0))
var_names[cross]
}
# ── Fungsi utama HB Beta dengan seleksi CI otomatis ─────────────────────────
run_hbbeta <- function(df, vars,
has_jags = get("has_jags", envir = .GlobalEnv),
iter.mcmc = 250000,
burn.in = 50000,
thin = 200,
iter.update = 10) {
# Fallback jika JAGS tidak tersedia
if (!has_jags) {
df$y_hb_pct <- df$Estimasi
df$sd_hb <- NA_real_
df$RSE_hb <- df$RSE
return(df)
}
# Persiapan data
eps <- 1e-4
df$y_prop <- pmax(pmin(df$Estimasi / 100, 1 - eps), eps)
# Scale per kolom — aman untuk kolom near-constant
for (v in vars) {
mu_v <- mean(df[[v]], na.rm = TRUE)
sd_v <- sd(df[[v]], na.rm = TRUE)
df[[v]] <- if (is.na(sd_v) || sd_v == 0) 0 else (df[[v]] - mu_v) / sd_v
df[[v]][is.na(df[[v]]) | is.nan(df[[v]])] <- 0
}
# Loop seleksi berbasis CI
current_vars <- vars
hb_last <- NULL
max_iter <- length(vars) + 1L
for (iter in seq_len(max_iter)) {
if (length(current_vars) == 0L) {
cat(" [HB] Tidak ada variabel tersisa setelah seleksi CI → fallback direct\n")
df$y_hb_pct <- df$Estimasi
df$sd_hb <- NA_real_
df$RSE_hb <- df$RSE
return(df)
}
form_hb <- as.formula(paste("y_prop ~", paste(current_vars, collapse = "+")))
capture.output(
hb_cur <- try(
saeHB::Beta(
formula = form_hb,
data = df,
iter.update = iter.update,
iter.mcmc = iter.mcmc,
thin = thin,
burn.in = burn.in
),
silent = TRUE
)
)
if (inherits(hb_cur, "try-error") || is.null(hb_cur$Est)) {
cat(" [HB] Iterasi", iter, "gagal (JAGS error) → fallback direct\n")
df$y_hb_pct <- df$Estimasi
df$sd_hb <- NA_real_
df$RSE_hb <- df$RSE
return(df)
}
hb_last <- hb_cur
coef_mat <- hb_cur$coefficient
if (is.null(coef_mat)) {
cat(" [HB] Tabel koefisien tidak tersedia → lewati cek CI\n")
break
}
cat(sprintf("\n [HB Iter %d] Vars aktif (%d): %s\n",
iter, length(current_vars),
paste(current_vars, collapse = ", ")))
print(round(coef_mat, 5))
cat("\n")
cross_vars <- .vars_cross_ci(coef_mat, current_vars)
if (length(cross_vars) == 0L) {
cat(sprintf(" [HB] ✓ Semua CI aman — selesai pada iterasi %d.\n", iter))
break
}
# Keluarkan variabel dengan SD terbesar di antara yang CI-nya menyeberang nol
pos_cross <- match(cross_vars, current_vars)
sd_cross <- setNames(
as.numeric(coef_mat[1L + pos_cross, 2L]),
cross_vars
)
to_drop <- names(which.max(sd_cross))
cat(sprintf(" [HB] ✗ Iter %d — CI menyeberang nol: [%s]\n",
iter, paste(cross_vars, collapse = ", ")))
cat(sprintf(" [HB] → Keluarkan '%s' (SD = %.5f, terbesar)\n",
to_drop, sd_cross[[to_drop]]))
current_vars <- setdiff(current_vars, to_drop)
}
# Tulis hasil ke df
if (is.null(hb_last) || is.null(hb_last$Est)) {
cat(" [HB] Tidak ada run valid → fallback direct\n")
df$y_hb_pct <- df$Estimasi
df$sd_hb <- NA_real_
df$RSE_hb <- df$RSE
} else {
cat(" [HB] ✓ Variabel final:", paste(current_vars, collapse = ", "), "\n")
df$y_hb_pct <- hb_last$Est$MEAN * 100
df$sd_hb <- hb_last$Est$SD
df$RSE_hb <- df$sd_hb / pmax(df$y_hb_pct / 100, 1e-6) * 100
}
df
}# ── Plot RSE line (Direct vs Model) ─────────────────────────────────────
plot_rse <- function(data, col1, col2, lab1, lab2, title) {
miss <- setdiff(c(col1, col2), names(data))
if (length(miss) > 0) {
message("Kolom tidak ada: ", paste(miss)); return(invisible(NULL))
}
df_plt <- data %>%
dplyr::select(Kako, all_of(c(col1, col2))) %>%
pivot_longer(-Kako, names_to = "Metode", values_to = "RSE") %>%
mutate(
Metode = case_when(
Metode == col1 ~ lab1,
Metode == col2 ~ lab2,
TRUE ~ Metode
),
Kako = as.character(Kako)
) %>%
filter(!is.na(RSE))
ggplot(df_plt, aes(x = Kako, y = RSE, group = Metode, color = Metode)) +
geom_line(linewidth = 0.8, alpha = 0.85) +
geom_point(size = 1.6) +
geom_hline(yintercept = 25, linetype = "dashed",
color = "#c0392b", linewidth = 0.9) +
annotate("text", x = 1, y = 26.5, label = "Batas 25%",
color = "#c0392b", hjust = 0, size = 3) +
scale_color_manual(values = c("#2980b9", "#27ae60")) +
labs(title = title, x = "Kabupaten/Kota",
y = "RSE (%)", color = NULL) +
theme_minimal(base_size = 11) +
theme(
axis.text.x = element_text(angle = 90, vjust = 0.5, size = 6),
legend.position = "top",
plot.title = element_text(face = "bold", size = 12)
)
}
# ── Plot HB Beta Posterior (dot + CI per domain) ─────────────────────────
plot_hb_posterior <- function(df, title, group_col = NULL) {
df_p <- df %>%
filter(!is.na(y_hb_pct) & !is.na(sd_hb)) %>%
mutate(
ci_lo = pmax((y_hb_pct / 100 - 1.96 * sd_hb) * 100, 0),
ci_hi = pmin((y_hb_pct / 100 + 1.96 * sd_hb) * 100, 100),
Domain = reorder(as.character(Kako), y_hb_pct)
)
if (!is.null(group_col) && group_col %in% names(df_p)) {
df_p$Grup <- df_p[[group_col]]
} else {
df_p$Grup <- "Semua Domain"
}
ggplot(df_p, aes(x = Domain)) +
geom_errorbar(aes(ymin = ci_lo, ymax = ci_hi, color = Grup),
width = 0.3, alpha = 0.55) +
geom_point(aes(y = y_hb_pct, color = Grup), size = 2) +
geom_point(aes(y = Estimasi), color = "#c0392b",
size = 1.2, alpha = 0.6, shape = 4) +
geom_hline(yintercept = mean(df_p$y_hb_pct, na.rm = TRUE),
linetype = "dashed", color = "#2ecc71", linewidth = 0.8) +
scale_color_manual(values = c("#2980b9", "#e67e22", "#8e44ad", "#16a085")) +
labs(
title = title,
subtitle = "Titik biru = HB | Error bar = 95% CI | Silang merah = Direct | Garis hijau = Rata-rata HB",
x = "Kabupaten/Kota (urut HB)", y = "Estimasi (%)", color = "Grup"
) +
theme_minimal(base_size = 10) +
theme(
axis.text.x = element_text(angle = 90, vjust = 0.5, size = 5),
legend.position = "top",
plot.title = element_text(face = "bold", size = 12),
plot.subtitle = element_text(size = 9)
)
}
# ── Utilitas evaluasi ─────────────────────────────────────────────────────
pct_ok <- function(x) round(mean(x < 25, na.rm = TRUE) * 100, 1)
pct_ok_15 <- function(x) round(mean(x < 15, na.rm = TRUE) * 100, 1)
cv_mean <- function(x) round(mean(x, na.rm = TRUE), 2)
tabel_rse <- function(data, var_rse, label) {
data.frame(
Skenario = label,
`RSE >= 25` = sum(data[[var_rse]] >= 25, na.rm = TRUE),
`RSE < 25` = sum(data[[var_rse]] < 25, na.rm = TRUE),
`% < 25%` = pct_ok(data[[var_rse]]),
`% < 15%` = pct_ok_15(data[[var_rse]]),
`CV Mean` = cv_mean(data[[var_rse]]),
check.names = FALSE
)
}
metrik <- function(est_model, est_direct, label) {
data.frame(
Skenario = label,
`RB (%)` = round(mean((est_model - est_direct) /
est_direct, na.rm = TRUE) * 100, 3),
`RMSE` = round(sqrt(mean((est_model - est_direct)^2,
na.rm = TRUE)), 4),
check.names = FALSE
)
}
# ── Tampilkan korelasi var terpilih vs Direct & Logit(Direct) ─────────────
show_var_corr <- function(df, vars, estimasi_col = "Estimasi") {
if (length(vars) == 0 || !estimasi_col %in% names(df)) return(invisible(NULL))
eps <- 1e-4
y_dir <- df[[estimasi_col]]
p <- pmax(pmin(y_dir / 100, 1 - eps), eps)
y_lgit <- log(p / (1 - p))
cat(sprintf(" %-16s %12s %12s\n", "Variabel", "cor(Direct)", "cor(Logit)"))
cat(" ", strrep("-", 42), "\n", sep = "")
for (v in vars) {
x <- df[[v]]
r1 <- tryCatch(cor(x, y_dir, use = "complete.obs"), error = function(e) NA_real_)
r2 <- tryCatch(cor(x, y_lgit, use = "complete.obs"), error = function(e) NA_real_)
cat(sprintf(" %-16s %12.4f %12.4f\n", v, r1, r2))
}
cat("\n")
}
# ── Fungsi utama: jalankan model pada list segmen ─────────────────────────
run_on_segments <- function(seg_list, aux_fn, model_fn, y_col,
min_n = 4, ...) {
hasil <- list()
for (nm in names(seg_list)) {
df_s <- seg_list[[nm]]
if (nrow(df_s) < min_n) {
message(" Skip ", nm, " (n=", nrow(df_s), ")")
next
}
vars <- tryCatch(
aux_fn(df_s, y_col = y_col),
error = function(e) {
message(" VarSel error [", nm, "]: ", e$message)
character(0)
}
)
if (length(vars) == 0) {
message(" Tidak ada var terpilih (atau tidak signifikan) untuk ", nm, " — skip")
next
}
cat(" [", nm, "]", y_col, "| n =", nrow(df_s),
"| Vars:", paste(vars, collapse = ", "), "\n")
show_var_corr(df_s, vars)
res <- tryCatch(
model_fn(df_s, vars, ...),
error = function(e) {
message(" Model error [", nm, "]: ", e$message)
NULL
}
)
if (!is.null(res)) hasil[[nm]] <- res
}
if (length(hasil) == 0) return(NULL)
bind_rows(hasil)
}# RSE_direct_col hanya untuk partisi, nama tidak berawalan "X"
# → otomatis tidak masuk kandidat aux
df_base$RSE_direct_col <- sqrt(df_base$vardir) /
pmax(df_base$Estimasi, 1e-6) * 100
med_rse <- median(df_base$RSE_direct_col, na.rm = TRUE)
df_base$grup_equal <- ifelse(
df_base$RSE_direct_col <= med_rse, "G1_RSE_Bawah", "G2_RSE_Atas"
)
cat("Median RSE Direct:", round(med_rse, 2), "%\n")## Median RSE Direct: 48.37 %
##
## G1_RSE_Bawah G2_RSE_Atas
## 41 40
ggplot(df_base, aes(x = RSE_direct_col, fill = grup_equal)) +
geom_histogram(bins = 25, color = "white", alpha = 0.85) +
geom_vline(xintercept = med_rse,
linetype = "dashed", color = "#c0392b", linewidth = 1) +
annotate("text", x = med_rse + 0.5, y = Inf,
label = paste0("Median = ", round(med_rse, 1), "%"),
vjust = 2, hjust = 0, color = "#c0392b", size = 3.5) +
scale_fill_manual(values = c("G1_RSE_Bawah" = "#2980b9",
"G2_RSE_Atas" = "#e67e22")) +
labs(
title = "C3: RSE Equal Size (Median Split)",
x = "RSE Direct (%)", y = "Jumlah Domain", fill = "Grup"
) +
theme_minimal(base_size = 11) +
theme(legend.position = "top",
plot.title = element_text(face = "bold"))Prasyarat JAGS: Skenario ini memerlukan JAGS
terinstal di OS dan paket saeHB. Download: https://sourceforge.net/projects/mcmc-jags/files/JAGS/4.x/
lalu restart R. Jika JAGS tidak tersedia, otomatis fallback ke direct
estimator.
Upgrade seleksi v2 — dua lapis filter:
p < 0,05
— variabel tidak signifikan dibuang.TEORI_ARAH — variabel yang berlawanan arah teori
dibuang.Jika tidak ada variabel lolos kedua filter di suatu segmen → segmen di-skip.
## === Skenario 31: HB TopN RSE-ES ===
## Seleksi: Top-n/10 + filter signifikansi Pearson (alpha = 0.05)
## Partisi: RSE Equal Size (split median)
## ============================================================
df_s31 <- run_on_segments(
seg_list = split(df_base, df_base$grup_equal),
aux_fn = seleksi_topn,
model_fn = run_hbbeta,
y_col = "y_logit",
min_n = 5
)## [GrupX: X1 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X1 0.2841 (-) + 0.0718 no no GUGUR-keduanya
## X1_jumlah 0.2185 (-) + 0.1699 no no GUGUR-keduanya
## X1_mean 0.2841 (-) + 0.0718 no no GUGUR-keduanya
## → Tidak ada anggota lolos sig+arah — grup [X1] di-skip
##
## [GrupX: X2 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X2 0.4279 (-) - 0.0053 YES YES LOLOS
## X2_jumlah 0.1657 (-) - 0.3006 no YES GUGUR-sig
## X2_mean 0.4279 (-) - 0.0053 YES YES LOLOS
## → Terpilih: X2_mean |cor|=0.4279 p=0.0053
##
## [GrupX: X8 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X8 0.5695 (+) + 0.0001 YES YES LOLOS
## X8_jumlah 0.0884 (+) + 0.5828 no YES GUGUR-sig
## X8_mean 0.5695 (+) + 0.0001 YES YES LOLOS
## → Terpilih: X8 |cor|=0.5695 p=0.0001
##
## [GrupX: X9 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X9 0.0852 (+) - 0.5964 no no GUGUR-keduanya
## X9_jumlah 0.0513 (-) - 0.7500 no YES GUGUR-sig
## X9_mean 0.0852 (+) - 0.5964 no no GUGUR-keduanya
## → Tidak ada anggota lolos sig+arah — grup [X9] di-skip
##
## [GrupX: X13 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X13 0.4172 (+) - 0.0067 YES no GUGUR-arah
## X13_jumlah 0.0226 (+) - 0.8886 no no GUGUR-keduanya
## X13_mean 0.4172 (+) - 0.0067 YES no GUGUR-arah
## → Tidak ada anggota lolos sig+arah — grup [X13] di-skip
##
## [GrupX: X14 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X14 0.2173 (+) - 0.1722 no no GUGUR-keduanya
## X14_jumlah 0.0579 (-) - 0.7193 no YES GUGUR-sig
## X14_mean 0.2173 (+) - 0.1722 no no GUGUR-keduanya
## → Tidak ada anggota lolos sig+arah — grup [X14] di-skip
##
## [GrupX: X15 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X15 0.1568 (+) - 0.3274 no no GUGUR-keduanya
## X15_jumlah 0.0668 (-) - 0.6782 no YES GUGUR-sig
## X15_mean 0.1568 (+) - 0.3274 no no GUGUR-keduanya
## → Tidak ada anggota lolos sig+arah — grup [X15] di-skip
##
## [GrupX: X16 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X16 0.0792 (+) - 0.6224 no no GUGUR-keduanya
## X16_jumlah 0.0771 (-) - 0.6320 no YES GUGUR-sig
## X16_mean 0.0792 (+) - 0.6224 no no GUGUR-keduanya
## → Tidak ada anggota lolos sig+arah — grup [X16] di-skip
##
## [GrupX: X17 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X17 0.0423 (+) - 0.7926 no no GUGUR-keduanya
## X17_jumlah 0.0565 (-) - 0.7256 no YES GUGUR-sig
## X17_mean 0.0423 (+) - 0.7926 no no GUGUR-keduanya
## → Tidak ada anggota lolos sig+arah — grup [X17] di-skip
##
## [GrupX: X18 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X18 0.1811 (+) - 0.2571 no no GUGUR-keduanya
## X18_jumlah 0.0106 (+) - 0.9476 no no GUGUR-keduanya
## X18_mean 0.1811 (+) - 0.2571 no no GUGUR-keduanya
## → Tidak ada anggota lolos sig+arah — grup [X18] di-skip
##
## [GrupX: X19 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X19 0.2753 (-) - 0.0815 no YES GUGUR-sig
## X19_jumlah 0.3322 (-) - 0.0339 YES YES LOLOS
## X19_mean 0.2753 (-) - 0.0815 no YES GUGUR-sig
## → Terpilih: X19_jumlah |cor|=0.3322 p=0.0339
##
## [GrupX: X21 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X21 0.3329 (-) + 0.0334 YES no GUGUR-arah
## X21_jumlah 0.3492 (-) + 0.0252 YES no GUGUR-arah
## X21_mean 0.3329 (-) + 0.0334 YES no GUGUR-arah
## → Tidak ada anggota lolos sig+arah — grup [X21] di-skip
##
## [GrupX: X23 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X23 0.0267 (-) - 0.8686 no YES GUGUR-sig
## X23_jumlah 0.0852 (-) - 0.5964 no YES GUGUR-sig
## X23_mean 0.0267 (-) - 0.8686 no YES GUGUR-sig
## → Tidak ada anggota lolos sig+arah — grup [X23] di-skip
##
## [GrupX: X24 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X24 0.2238 (+) - 0.1596 no no GUGUR-keduanya
## X24_jumlah 0.0603 (+) - 0.7082 no no GUGUR-keduanya
## X24_mean 0.2238 (+) - 0.1596 no no GUGUR-keduanya
## → Tidak ada anggota lolos sig+arah — grup [X24] di-skip
##
## [GrupX: X25 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X25 0.0144 (+) - 0.9287 no no GUGUR-keduanya
## X25_jumlah 0.0842 (-) - 0.6008 no YES GUGUR-sig
## X25_mean 0.0144 (+) - 0.9287 no no GUGUR-keduanya
## → Tidak ada anggota lolos sig+arah — grup [X25] di-skip
##
## [GrupX: X26 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X26 0.5159 (-) + 0.0006 YES no GUGUR-arah
## X26_jumlah 0.4485 (-) + 0.0033 YES no GUGUR-arah
## X26_mean 0.5159 (-) + 0.0006 YES no GUGUR-arah
## → Tidak ada anggota lolos sig+arah — grup [X26] di-skip
##
## [GrupX: X32 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X32 0.3369 (-) + 0.0312 YES no GUGUR-arah
## X32_jumlah 0.3063 (-) + 0.0515 no no GUGUR-keduanya
## X32_mean 0.3369 (-) + 0.0312 YES no GUGUR-arah
## → Tidak ada anggota lolos sig+arah — grup [X32] di-skip
##
## [GrupX: X37 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X37 0.1368 (+) + 0.3936 no YES GUGUR-sig
## X37_jumlah 0.0335 (+) + 0.8353 no YES GUGUR-sig
## X37_mean 0.1368 (+) + 0.3936 no YES GUGUR-sig
## → Tidak ada anggota lolos sig+arah — grup [X37] di-skip
##
## [GrupX: X38 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X38 0.1135 (+) - 0.4798 no no GUGUR-keduanya
## X38_jumlah 0.1160 (-) - 0.4700 no YES GUGUR-sig
## X38_mean 0.1135 (+) - 0.4798 no no GUGUR-keduanya
## → Tidak ada anggota lolos sig+arah — grup [X38] di-skip
##
## [GrupX: X39 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X39 0.4982 (-) - 0.0009 YES YES LOLOS
## X39_jumlah 0.5570 (-) - 0.0002 YES YES LOLOS
## X39_mean 0.4982 (-) - 0.0009 YES YES LOLOS
## → Terpilih: X39_jumlah |cor|=0.5570 p=0.0002
##
## [GrupX: X40 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X40 0.2916 (-) - 0.0643 no YES GUGUR-sig
## X40_jumlah 0.2065 (-) - 0.1952 no YES GUGUR-sig
## X40_mean 0.2916 (-) - 0.0643 no YES GUGUR-sig
## → Tidak ada anggota lolos sig+arah — grup [X40] di-skip
##
## [GrupX: X41 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X41 0.0115 (-) - 0.9432 no YES GUGUR-sig
## X41_jumlah 0.1193 (-) - 0.4577 no YES GUGUR-sig
## X41_mean 0.0115 (-) - 0.9432 no YES GUGUR-sig
## → Tidak ada anggota lolos sig+arah — grup [X41] di-skip
##
## [GrupX: X43 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X43 0.0239 (-) - 0.8819 no YES GUGUR-sig
## X43_jumlah 0.1738 (-) - 0.2771 no YES GUGUR-sig
## X43_mean 0.0239 (-) - 0.8819 no YES GUGUR-sig
## → Tidak ada anggota lolos sig+arah — grup [X43] di-skip
##
## [GrupX: X44 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X44 0.5825 (-) - 0.0001 YES YES LOLOS
## X44_jumlah 0.5583 (-) - 0.0001 YES YES LOLOS
## X44_mean 0.5825 (-) - 0.0001 YES YES LOLOS
## → Terpilih: X44_mean |cor|=0.5825 p=0.0001
##
## [GrupX: X45 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X45 0.3814 (-) - 0.0139 YES YES LOLOS
## X45_jumlah 0.4152 (-) - 0.0070 YES YES LOLOS
## X45_mean 0.3814 (-) - 0.0139 YES YES LOLOS
## → Terpilih: X45_jumlah |cor|=0.4152 p=0.0070
##
## [GrupX: X34 ] 2 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X34_jumlah 0.1030 (-) + 0.5216 no no GUGUR-keduanya
## X34_mean 0.1678 (-) + 0.2944 no no GUGUR-keduanya
## → Tidak ada anggota lolos sig+arah — grup [X34] di-skip
##
## [GrupX: X6 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X6_jumlah 0.1554 (-) + 0.3319 no no GUGUR-keduanya
## X6_mean 0.1517 (-) + 0.3438 no no GUGUR-keduanya
## X6 0.2348 (+) + 0.1395 no YES GUGUR-sig
## → Tidak ada anggota lolos sig+arah — grup [X6] di-skip
##
## [GrupX: X7 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X7_jumlah 0.0482 (-) + 0.7649 no no GUGUR-keduanya
## X7_mean 0.0482 (-) + 0.7649 no no GUGUR-keduanya
## X7 0.0482 (-) + 0.7649 no no GUGUR-keduanya
## → Tidak ada anggota lolos sig+arah — grup [X7] di-skip
##
## [GrupX: X10 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X10_jumlah 0.4128 (-) + 0.0073 YES no GUGUR-arah
## X10_mean 0.3605 (-) + 0.0206 YES no GUGUR-arah
## X10 0.2963 (+) + 0.0600 no YES GUGUR-sig
## → Tidak ada anggota lolos sig+arah — grup [X10] di-skip
##
## [GrupX: X11 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X11_jumlah 0.3286 (-) - 0.0359 YES YES LOLOS
## X11_mean 0.3532 (-) - 0.0235 YES YES LOLOS
## X11 0.3836 (+) - 0.0133 YES no GUGUR-arah
## → Terpilih: X11_mean |cor|=0.3532 p=0.0235
##
## [GrupX: X12 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X12_jumlah 0.2738 (-) - 0.0832 no YES GUGUR-sig
## X12_mean 0.3531 (-) - 0.0236 YES YES LOLOS
## X12 0.2485 (+) - 0.1173 no no GUGUR-keduanya
## → Terpilih: X12_mean |cor|=0.3531 p=0.0236
##
## [GrupX: X27 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X27_jumlah 0.2467 (-) - 0.1200 no YES GUGUR-sig
## X27_mean 0.3156 (-) - 0.0444 YES YES LOLOS
## X27 0.5500 (+) - 0.0002 YES no GUGUR-arah
## → Terpilih: X27_mean |cor|=0.3156 p=0.0444
##
## [GrupX: X28 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X28_jumlah 0.3484 (-) - 0.0256 YES YES LOLOS
## X28_mean 0.3819 (-) - 0.0137 YES YES LOLOS
## X28 0.4895 (+) - 0.0012 YES no GUGUR-arah
## → Terpilih: X28_mean |cor|=0.3819 p=0.0137
##
## [GrupX: X29 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X29_jumlah 0.4539 (-) - 0.0029 YES YES LOLOS
## X29_mean 0.4884 (-) - 0.0012 YES YES LOLOS
## X29 0.2497 (+) - 0.1153 no no GUGUR-keduanya
## → Terpilih: X29_mean |cor|=0.4884 p=0.0012
##
## [GrupX: X30 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X30_jumlah 0.2313 (-) - 0.1456 no YES GUGUR-sig
## X30_mean 0.2524 (-) - 0.1114 no YES GUGUR-sig
## X30 0.4611 (+) - 0.0024 YES no GUGUR-arah
## → Tidak ada anggota lolos sig+arah — grup [X30] di-skip
##
## [GrupX: X31 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X31_jumlah 0.5349 (-) - 0.0003 YES YES LOLOS
## X31_mean 0.4746 (-) - 0.0017 YES YES LOLOS
## X31 0.0190 (+) - 0.9063 no no GUGUR-keduanya
## → Terpilih: X31_jumlah |cor|=0.5349 p=0.0003
##
## [GrupX: X33 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X33_jumlah 0.2547 (-) + 0.1080 no no GUGUR-keduanya
## X33_mean 0.4299 (-) + 0.0050 YES no GUGUR-arah
## X33 0.1140 (-) + 0.4780 no no GUGUR-keduanya
## → Tidak ada anggota lolos sig+arah — grup [X33] di-skip
##
## [GrupX: X35 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X35_jumlah 0.4584 (-) - 0.0026 YES YES LOLOS
## X35_mean 0.4184 (-) - 0.0065 YES YES LOLOS
## X35 0.1721 (-) - 0.2820 no YES GUGUR-sig
## → Terpilih: X35_jumlah |cor|=0.4584 p=0.0026
##
## [GrupX: X36 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X36_jumlah 0.4957 (-) - 0.0010 YES YES LOLOS
## X36_mean 0.5181 (-) - 0.0005 YES YES LOLOS
## X36 0.2227 (+) - 0.1617 no no GUGUR-keduanya
## → Terpilih: X36_mean |cor|=0.5181 p=0.0005
##
##
## [TopN Konfirmasi | n=41 | y=y_logit | alpha=0.05]
## Variabel |cor| Tanda Teori p-val Sig? Arah OK?
## ------------------------------------------------------------------------
## X2_mean 0.4279 (-) - 0.0053 YES YES LOLOS
## X8 0.5695 (+) + 0.0001 YES YES LOLOS
## X19_jumlah 0.3322 (-) - 0.0339 YES YES LOLOS
## X39_jumlah 0.5570 (-) - 0.0002 YES YES LOLOS
## X44_mean 0.5825 (-) - 0.0001 YES YES LOLOS
## X45_jumlah 0.4152 (-) - 0.0070 YES YES LOLOS
## X11_mean 0.3532 (-) - 0.0235 YES YES LOLOS
## X12_mean 0.3531 (-) - 0.0236 YES YES LOLOS
## X27_mean 0.3156 (-) - 0.0444 YES YES LOLOS
## X28_mean 0.3819 (-) - 0.0137 YES YES LOLOS
## X29_mean 0.4884 (-) - 0.0012 YES YES LOLOS
## X31_jumlah 0.5349 (-) - 0.0003 YES YES LOLOS
## X35_jumlah 0.4584 (-) - 0.0026 YES YES LOLOS
## X36_mean 0.5181 (-) - 0.0005 YES YES LOLOS
## X48 0.5298 (-) - 0.0004 YES YES LOLOS
##
## [TopN] Kandidat final untuk ranking (15): X2_mean, X8, X19_jumlah, X39_jumlah, X44_mean, X45_jumlah, X11_mean, X12_mean, X27_mean, X28_mean, X29_mean, X31_jumlah, X35_jumlah, X36_mean, X48
## [TopN] ✓ Final vars (4): X44_mean, X8, X39_jumlah, X31_jumlah
##
## [ G1_RSE_Bawah ] y_logit | n = 41 | Vars: X44_mean, X8, X39_jumlah, X31_jumlah
## Variabel cor(Direct) cor(Logit)
## ------------------------------------------
## X44_mean -0.4399 -0.5825
## X8 0.4454 0.5695
## X39_jumlah -0.4373 -0.5570
## X31_jumlah -0.4520 -0.5349
##
## [HB Iter 1] Vars aktif (4): X44_mean, X8, X39_jumlah, X31_jumlah
## Mean SD 2.5% 25% 50% 75% 97.5%
## intercept -2.15589 0.01899 -2.19334 -2.16919 -2.15588 -2.14270 -2.11967
## X44_mean 0.01084 0.02450 -0.03952 -0.00593 0.01067 0.02696 0.06005
## X8 0.18225 0.02660 0.12937 0.16359 0.18262 0.20123 0.23310
## X39_jumlah -0.13599 0.02138 -0.17779 -0.15067 -0.13586 -0.12251 -0.09527
## X31_jumlah -0.13485 0.02064 -0.17504 -0.14866 -0.13527 -0.12163 -0.09213
##
## [HB] ✗ Iter 1 — CI menyeberang nol: [X44_mean]
## [HB] → Keluarkan 'X44_mean' (SD = 0.02450, terbesar)
##
## [HB Iter 2] Vars aktif (3): X8, X39_jumlah, X31_jumlah
## Mean SD 2.5% 25% 50% 75% 97.5%
## intercept -2.1592 0.01825 -2.1956 -2.1709 -2.1586 -2.1471 -2.12521
## X8 0.1752 0.01951 0.1357 0.1624 0.1748 0.1885 0.21310
## X39_jumlah -0.1347 0.01906 -0.1700 -0.1477 -0.1352 -0.1227 -0.09488
## X31_jumlah -0.1297 0.02066 -0.1695 -0.1432 -0.1307 -0.1157 -0.08770
##
## [HB] ✓ Semua CI aman — selesai pada iterasi 2.
## [HB] ✓ Variabel final: X8, X39_jumlah, X31_jumlah
## [GrupX: X1 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X1 0.5071 (-) + 0.0008 YES no GUGUR-arah
## X1_jumlah 0.1092 (-) + 0.5024 no no GUGUR-keduanya
## X1_mean 0.5071 (-) + 0.0008 YES no GUGUR-arah
## → Tidak ada anggota lolos sig+arah — grup [X1] di-skip
##
## [GrupX: X2 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X2 0.0009 (+) - 0.9955 no no GUGUR-keduanya
## X2_jumlah 0.1741 (+) - 0.2826 no no GUGUR-keduanya
## X2_mean 0.0009 (+) - 0.9955 no no GUGUR-keduanya
## → Tidak ada anggota lolos sig+arah — grup [X2] di-skip
##
## [GrupX: X8 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X8 0.3226 (+) + 0.0423 YES YES LOLOS
## X8_jumlah 0.2311 (+) + 0.1514 no YES GUGUR-sig
## X8_mean 0.3226 (+) + 0.0423 YES YES LOLOS
## → Terpilih: X8 |cor|=0.3226 p=0.0423
##
## [GrupX: X9 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X9 0.1766 (-) - 0.2757 no YES GUGUR-sig
## X9_jumlah 0.1069 (+) - 0.5117 no no GUGUR-keduanya
## X9_mean 0.1766 (-) - 0.2757 no YES GUGUR-sig
## → Tidak ada anggota lolos sig+arah — grup [X9] di-skip
##
## [GrupX: X13 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X13 0.0981 (-) - 0.5471 no YES GUGUR-sig
## X13_jumlah 0.1058 (+) - 0.5160 no no GUGUR-keduanya
## X13_mean 0.0981 (-) - 0.5471 no YES GUGUR-sig
## → Tidak ada anggota lolos sig+arah — grup [X13] di-skip
##
## [GrupX: X14 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X14 0.2538 (-) - 0.1141 no YES GUGUR-sig
## X14_jumlah 0.1052 (+) - 0.5183 no no GUGUR-keduanya
## X14_mean 0.2538 (-) - 0.1141 no YES GUGUR-sig
## → Tidak ada anggota lolos sig+arah — grup [X14] di-skip
##
## [GrupX: X15 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X15 0.2816 (-) - 0.0784 no YES GUGUR-sig
## X15_jumlah 0.1028 (+) - 0.5280 no no GUGUR-keduanya
## X15_mean 0.2816 (-) - 0.0784 no YES GUGUR-sig
## → Tidak ada anggota lolos sig+arah — grup [X15] di-skip
##
## [GrupX: X16 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X16 0.3306 (-) - 0.0372 YES YES LOLOS
## X16_jumlah 0.0194 (-) - 0.9053 no YES GUGUR-sig
## X16_mean 0.3306 (-) - 0.0372 YES YES LOLOS
## → Terpilih: X16 |cor|=0.3306 p=0.0372
##
## [GrupX: X17 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X17 0.1996 (-) - 0.2169 no YES GUGUR-sig
## X17_jumlah 0.0998 (+) - 0.5400 no no GUGUR-keduanya
## X17_mean 0.1996 (-) - 0.2169 no YES GUGUR-sig
## → Tidak ada anggota lolos sig+arah — grup [X17] di-skip
##
## [GrupX: X18 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X18 0.1384 (-) - 0.3943 no YES GUGUR-sig
## X18_jumlah 0.1268 (+) - 0.4357 no no GUGUR-keduanya
## X18_mean 0.1384 (-) - 0.3943 no YES GUGUR-sig
## → Tidak ada anggota lolos sig+arah — grup [X18] di-skip
##
## [GrupX: X19 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X19 0.1042 (-) - 0.5221 no YES GUGUR-sig
## X19_jumlah 0.0845 (-) - 0.6043 no YES GUGUR-sig
## X19_mean 0.1042 (-) - 0.5221 no YES GUGUR-sig
## → Tidak ada anggota lolos sig+arah — grup [X19] di-skip
##
## [GrupX: X21 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X21 0.1048 (+) + 0.5199 no YES GUGUR-sig
## X21_jumlah 0.2226 (+) + 0.1673 no YES GUGUR-sig
## X21_mean 0.1048 (+) + 0.5199 no YES GUGUR-sig
## → Tidak ada anggota lolos sig+arah — grup [X21] di-skip
##
## [GrupX: X23 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X23 0.3256 (-) - 0.0403 YES YES LOLOS
## X23_jumlah 0.1307 (-) - 0.4215 no YES GUGUR-sig
## X23_mean 0.3256 (-) - 0.0403 YES YES LOLOS
## → Terpilih: X23_mean |cor|=0.3256 p=0.0403
##
## [GrupX: X24 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X24 0.1813 (-) - 0.2629 no YES GUGUR-sig
## X24_jumlah 0.0349 (+) - 0.8309 no no GUGUR-keduanya
## X24_mean 0.1813 (-) - 0.2629 no YES GUGUR-sig
## → Tidak ada anggota lolos sig+arah — grup [X24] di-skip
##
## [GrupX: X25 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X25 0.5200 (-) - 0.0006 YES YES LOLOS
## X25_jumlah 0.4316 (-) - 0.0054 YES YES LOLOS
## X25_mean 0.5200 (-) - 0.0006 YES YES LOLOS
## → Terpilih: X25_mean |cor|=0.5200 p=0.0006
##
## [GrupX: X26 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X26 0.1585 (-) + 0.3287 no no GUGUR-keduanya
## X26_jumlah 0.2356 (-) + 0.1433 no no GUGUR-keduanya
## X26_mean 0.1585 (-) + 0.3287 no no GUGUR-keduanya
## → Tidak ada anggota lolos sig+arah — grup [X26] di-skip
##
## [GrupX: X32 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X32 0.2530 (-) + 0.1153 no no GUGUR-keduanya
## X32_jumlah 0.1751 (-) + 0.2797 no no GUGUR-keduanya
## X32_mean 0.2530 (-) + 0.1153 no no GUGUR-keduanya
## → Tidak ada anggota lolos sig+arah — grup [X32] di-skip
##
## [GrupX: X37 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X37 0.0727 (+) + 0.6558 no YES GUGUR-sig
## X37_jumlah 0.1326 (+) + 0.4148 no YES GUGUR-sig
## X37_mean 0.0727 (+) + 0.6558 no YES GUGUR-sig
## → Tidak ada anggota lolos sig+arah — grup [X37] di-skip
##
## [GrupX: X38 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X38 0.2015 (-) - 0.2124 no YES GUGUR-sig
## X38_jumlah 0.1668 (+) - 0.3036 no no GUGUR-keduanya
## X38_mean 0.2015 (-) - 0.2124 no YES GUGUR-sig
## → Tidak ada anggota lolos sig+arah — grup [X38] di-skip
##
## [GrupX: X39 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X39 0.3678 (-) - 0.0195 YES YES LOLOS
## X39_jumlah 0.2235 (-) - 0.1656 no YES GUGUR-sig
## X39_mean 0.3678 (-) - 0.0195 YES YES LOLOS
## → Terpilih: X39_mean |cor|=0.3678 p=0.0195
##
## [GrupX: X40 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X40 0.3638 (-) - 0.0210 YES YES LOLOS
## X40_jumlah 0.0750 (+) - 0.6456 no no GUGUR-keduanya
## X40_mean 0.3638 (-) - 0.0210 YES YES LOLOS
## → Terpilih: X40 |cor|=0.3638 p=0.0210
##
## [GrupX: X41 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X41 0.0609 (+) - 0.7088 no no GUGUR-keduanya
## X41_jumlah 0.2188 (+) - 0.1749 no no GUGUR-keduanya
## X41_mean 0.0609 (+) - 0.7088 no no GUGUR-keduanya
## → Tidak ada anggota lolos sig+arah — grup [X41] di-skip
##
## [GrupX: X43 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X43 0.0818 (+) - 0.6160 no no GUGUR-keduanya
## X43_jumlah 0.1071 (+) - 0.5105 no no GUGUR-keduanya
## X43_mean 0.0818 (+) - 0.6160 no no GUGUR-keduanya
## → Tidak ada anggota lolos sig+arah — grup [X43] di-skip
##
## [GrupX: X44 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X44 0.4158 (-) - 0.0076 YES YES LOLOS
## X44_jumlah 0.2940 (-) - 0.0656 no YES GUGUR-sig
## X44_mean 0.4158 (-) - 0.0076 YES YES LOLOS
## → Terpilih: X44 |cor|=0.4158 p=0.0076
##
## [GrupX: X45 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X45 0.3812 (-) - 0.0152 YES YES LOLOS
## X45_jumlah 0.1405 (-) - 0.3872 no YES GUGUR-sig
## X45_mean 0.3812 (-) - 0.0152 YES YES LOLOS
## → Terpilih: X45_mean |cor|=0.3812 p=0.0152
##
## [GrupX: X34 ] 2 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X34_jumlah 0.0424 (+) + 0.7951 no YES GUGUR-sig
## X34_mean 0.0168 (-) + 0.9183 no no GUGUR-keduanya
## → Tidak ada anggota lolos sig+arah — grup [X34] di-skip
##
## [GrupX: X6 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X6_jumlah 0.1013 (-) + 0.5339 no no GUGUR-keduanya
## X6_mean 0.1186 (-) + 0.4660 no no GUGUR-keduanya
## X6 0.0081 (-) + 0.9602 no no GUGUR-keduanya
## → Tidak ada anggota lolos sig+arah — grup [X6] di-skip
##
## [GrupX: X10 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X10_jumlah 0.2260 (-) + 0.1608 no no GUGUR-keduanya
## X10_mean 0.4856 (-) + 0.0015 YES no GUGUR-arah
## X10 0.1455 (+) + 0.3705 no YES GUGUR-sig
## → Tidak ada anggota lolos sig+arah — grup [X10] di-skip
##
## [GrupX: X11 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X11_jumlah 0.1904 (-) - 0.2392 no YES GUGUR-sig
## X11_mean 0.4809 (-) - 0.0017 YES YES LOLOS
## X11 0.1481 (+) - 0.3619 no no GUGUR-keduanya
## → Terpilih: X11_mean |cor|=0.4809 p=0.0017
##
## [GrupX: X12 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X12_jumlah 0.1198 (-) - 0.4615 no YES GUGUR-sig
## X12_mean 0.4021 (-) - 0.0101 YES YES LOLOS
## X12 0.3387 (+) - 0.0325 YES no GUGUR-arah
## → Terpilih: X12_mean |cor|=0.4021 p=0.0101
##
## [GrupX: X27 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X27_jumlah 0.1782 (-) - 0.2713 no YES GUGUR-sig
## X27_mean 0.5399 (-) - 0.0003 YES YES LOLOS
## X27 0.2674 (+) - 0.0953 no no GUGUR-keduanya
## → Terpilih: X27_mean |cor|=0.5399 p=0.0003
##
## [GrupX: X28 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X28_jumlah 0.1966 (-) - 0.2241 no YES GUGUR-sig
## X28_mean 0.5322 (-) - 0.0004 YES YES LOLOS
## X28 0.3116 (+) - 0.0503 no no GUGUR-keduanya
## → Terpilih: X28_mean |cor|=0.5322 p=0.0004
##
## [GrupX: X29 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X29_jumlah 0.2775 (-) - 0.0830 no YES GUGUR-sig
## X29_mean 0.4997 (-) - 0.0010 YES YES LOLOS
## X29 0.2275 (+) - 0.1580 no no GUGUR-keduanya
## → Terpilih: X29_mean |cor|=0.4997 p=0.0010
##
## [GrupX: X30 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X30_jumlah 0.2314 (-) - 0.1508 no YES GUGUR-sig
## X30_mean 0.4955 (-) - 0.0011 YES YES LOLOS
## X30 0.1878 (+) - 0.2460 no no GUGUR-keduanya
## → Terpilih: X30_mean |cor|=0.4955 p=0.0011
##
## [GrupX: X31 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X31_jumlah 0.3618 (-) - 0.0218 YES YES LOLOS
## X31_mean 0.5547 (-) - 0.0002 YES YES LOLOS
## X31 0.1333 (-) - 0.4122 no YES GUGUR-sig
## → Terpilih: X31_mean |cor|=0.5547 p=0.0002
##
## [GrupX: X33 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X33_jumlah 0.0477 (-) + 0.7701 no no GUGUR-keduanya
## X33_mean 0.2452 (-) + 0.1272 no no GUGUR-keduanya
## X33 0.0123 (-) + 0.9402 no no GUGUR-keduanya
## → Tidak ada anggota lolos sig+arah — grup [X33] di-skip
##
## [GrupX: X35 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X35_jumlah 0.1730 (-) - 0.2858 no YES GUGUR-sig
## X35_mean 0.3656 (-) - 0.0203 YES YES LOLOS
## X35 0.0186 (-) - 0.9092 no YES GUGUR-sig
## → Terpilih: X35_mean |cor|=0.3656 p=0.0203
##
## [GrupX: X36 ] 3 kandidat:
## Var |cor| Tanda Teori p-val Sig? Arah? Status
## ---------------------------------------------------------------------------
## X36_jumlah 0.3726 (-) - 0.0179 YES YES LOLOS
## X36_mean 0.5315 (-) - 0.0004 YES YES LOLOS
## X36 0.0622 (+) - 0.7028 no no GUGUR-keduanya
## → Terpilih: X36_mean |cor|=0.5315 p=0.0004
##
##
## [TopN Konfirmasi | n=40 | y=y_logit | alpha=0.05]
## Variabel |cor| Tanda Teori p-val Sig? Arah OK?
## ------------------------------------------------------------------------
## X8 0.3226 (+) + 0.0423 YES YES LOLOS
## X16 0.3306 (-) - 0.0372 YES YES LOLOS
## X23_mean 0.3256 (-) - 0.0403 YES YES LOLOS
## X25_mean 0.5200 (-) - 0.0006 YES YES LOLOS
## X39_mean 0.3678 (-) - 0.0195 YES YES LOLOS
## X40 0.3638 (-) - 0.0210 YES YES LOLOS
## X44 0.4158 (-) - 0.0076 YES YES LOLOS
## X45_mean 0.3812 (-) - 0.0152 YES YES LOLOS
## X11_mean 0.4809 (-) - 0.0017 YES YES LOLOS
## X12_mean 0.4021 (-) - 0.0101 YES YES LOLOS
## X27_mean 0.5399 (-) - 0.0003 YES YES LOLOS
## X28_mean 0.5322 (-) - 0.0004 YES YES LOLOS
## X29_mean 0.4997 (-) - 0.0010 YES YES LOLOS
## X30_mean 0.4955 (-) - 0.0011 YES YES LOLOS
## X31_mean 0.5547 (-) - 0.0002 YES YES LOLOS
## X35_mean 0.3656 (-) - 0.0203 YES YES LOLOS
## X36_mean 0.5315 (-) - 0.0004 YES YES LOLOS
## X47 0.4163 (+) + 0.0075 YES YES LOLOS
## X48 0.3420 (-) - 0.0308 YES YES LOLOS
##
## [TopN] Kandidat final untuk ranking (19): X8, X16, X23_mean, X25_mean, X39_mean, X40, X44, X45_mean, X11_mean, X12_mean, X27_mean, X28_mean, X29_mean, X30_mean, X31_mean, X35_mean, X36_mean, X47, X48
## [TopN] VIF drop: X31_mean (VIF=19.6)
## [TopN] ✓ Final vars (3): X27_mean, X28_mean, X36_mean
##
## [ G2_RSE_Atas ] y_logit | n = 40 | Vars: X27_mean, X28_mean, X36_mean
## Variabel cor(Direct) cor(Logit)
## ------------------------------------------
## X27_mean -0.4069 -0.5399
## X28_mean -0.4137 -0.5322
## X36_mean -0.3461 -0.5315
##
## [HB Iter 1] Vars aktif (3): X27_mean, X28_mean, X36_mean
## Mean SD 2.5% 25% 50% 75% 97.5%
## intercept -3.0636 0.03839 -3.1422 -3.0884 -3.0637 -3.03832 -2.98765
## X27_mean -0.2198 0.04896 -0.3180 -0.2524 -0.2210 -0.18778 -0.12370
## X28_mean -0.1197 0.05165 -0.2184 -0.1545 -0.1179 -0.08426 -0.01808
## X36_mean -0.2184 0.04800 -0.3107 -0.2508 -0.2191 -0.18547 -0.12190
##
## [HB] ✓ Semua CI aman — selesai pada iterasi 1.
## [HB] ✓ Variabel final: X27_mean, X28_mean, X36_mean
if (is.null(df_s31)) {
cat("\n[PERINGATAN] Tidak ada segmen yang berhasil diproses.\n")
} else {
cat("\n=== Ringkasan Hasil S31 ===\n")
summary(df_s31[, c("Estimasi", "y_hb_pct", "RSE", "RSE_hb")])
}##
## === Ringkasan Hasil S31 ===
## Estimasi y_hb_pct RSE RSE_hb
## Min. : 0.51 Min. : 0.527 Min. :26.1 Min. : 1.78
## 1st Qu.: 4.10 1st Qu.: 4.101 1st Qu.:39.3 1st Qu.: 2.92
## Median : 8.24 Median : 8.227 Median :48.4 Median : 4.99
## Mean : 8.65 Mean : 8.649 Mean :52.3 Mean : 6.51
## 3rd Qu.:11.12 3rd Qu.:11.148 3rd Qu.:61.0 3rd Qu.: 8.39
## Max. :26.70 Max. :26.573 Max. :98.8 Max. :24.32
if (!is.null(df_s31)) {
eval_rows <- list(
tabel_rse(df_base, "RSE_direct_col", "Direct (baseline)"),
tabel_rse(df_s31, "RSE_hb", "S31 HB-TN RSE-ES")
)
tabel_eval <- bind_rows(eval_rows)
kable(
tabel_eval,
caption = "Distribusi RSE — S31 vs Direct",
col.names = c("Skenario", "RSE≥25", "RSE<25", "% <25%", "% <15%", "CV Mean")
) %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "bordered"),
full_width = FALSE, font_size = 13
) %>%
row_spec(1, background = "#fff3cd") %>%
row_spec(2, bold = TRUE, background = "#d4edda")
} else {
cat("Tabel tidak tersedia.\n")
}| Skenario | RSE≥25 | RSE<25 | % <25% | % <15% | CV Mean |
|---|---|---|---|---|---|
| Direct (baseline) | 81 | 0 | 0 | 0.0 | 52.28 |
| S31 HB-TN RSE-ES | 0 | 81 | 100 | 92.6 | 6.51 |
if (!is.null(df_s31) && "y_hb_pct" %in% names(df_s31)) {
m <- metrik(df_s31$y_hb_pct, df_s31$Estimasi, "S31 HB-TN RSE-ES")
kable(
m,
caption = "Relative Bias (%) & RMSE terhadap Direct Estimator",
col.names = c("Skenario", "RB (%)", "RMSE"),
digits = 4
) %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE, font_size = 13
)
} else {
cat("Metrik tidak tersedia.\n")
}| Skenario | RB (%) | RMSE |
|---|---|---|
| S31 HB-TN RSE-ES | 0.576 | 0.0418 |
if (!is.null(df_s31) && all(c("RSE", "RSE_hb") %in% names(df_s31))) {
lim_max <- quantile(c(df_s31$RSE, df_s31$RSE_hb), 0.99, na.rm = TRUE)
ggplot(df_s31, aes(x = RSE, y = RSE_hb, color = grup_equal)) +
geom_point(size = 2.5, alpha = 0.8) +
geom_abline(slope = 1, intercept = 0,
linetype = "dashed", color = "#c0392b", linewidth = 0.9) +
geom_hline(yintercept = 25, linetype = "dotted",
color = "#e67e22", linewidth = 0.8) +
geom_vline(xintercept = 25, linetype = "dotted",
color = "#e67e22", linewidth = 0.8) +
scale_color_manual(values = c("G1_RSE_Bawah" = "#2980b9",
"G2_RSE_Atas" = "#e67e22")) +
coord_cartesian(xlim = c(0, lim_max), ylim = c(0, lim_max)) +
labs(
title = "Scatter RSE Direct vs RSE HB — S31",
subtitle = "Di bawah garis diagonal merah = lebih presisi dari direct",
x = "RSE Direct (%)", y = "RSE HB (%)", color = "Grup RSE"
) +
theme_minimal(base_size = 11) +
theme(
legend.position = "top",
plot.title = element_text(face = "bold")
)
} else {
cat("Plot tidak tersedia.\n")
}Scatter RSE Direct vs RSE HB — S31
if (!is.null(df_s31) && "y_hb_pct" %in% names(df_s31)) {
df_comp <- df_s31 %>%
mutate(Domain = as.character(Kako)) %>%
dplyr::select(Domain, Estimasi, y_hb_pct, grup_equal) %>%
pivot_longer(cols = c(Estimasi, y_hb_pct),
names_to = "Metode",
values_to = "Nilai") %>%
mutate(Metode = recode(Metode,
"Estimasi" = "Direct",
"y_hb_pct" = "HB Top-n/10"))
ggplot(df_comp, aes(x = reorder(Domain, Nilai), y = Nilai,
color = Metode, group = Metode)) +
geom_line(alpha = 0.6, linewidth = 0.7) +
geom_point(size = 1.5) +
facet_wrap(~ grup_equal, scales = "free_x", ncol = 2) +
scale_color_manual(values = c("Direct" = "#c0392b",
"HB Top-n/10" = "#2980b9")) +
labs(
title = "Perbandingan Estimasi Direct vs HB — S31",
x = "Domain (urut nilai)", y = "Estimasi (%)", color = NULL
) +
theme_minimal(base_size = 10) +
theme(
axis.text.x = element_text(angle = 90, vjust = 0.5, size = 5),
legend.position = "top",
strip.text = element_text(face = "bold"),
plot.title = element_text(face = "bold")
)
} else {
cat("Plot tidak tersedia.\n")
}Perbandingan Estimasi Direct vs HB — S31
Ringkasan metodologi S31:
saeHB::Beta()
(MCMC/JAGS), full posterior distribution per domain.p < 0,05 dan (ii) arah korelasi empiris sesuai
TEORI_ARAH. Variabel yang gugur salah satu atau keduanya
tidak masuk kandidat. Jika tidak ada yang lolos di suatu segmen → segmen
di-skip.Dianalisis dengan R. Skenario 31 = HB Beta · Top-n/10 (+ Pearson filter) · RSE Equal Size.