Skenario 31 — HB Beta · Top-n/10 · RSE Equal Size. Seleksi variabel auxiliary menggunakan Top-n/10 dengan dua lapis filter:

  1. Filter signifikansi Pearson (p < 0,05) — variabel yang korelasinya tidak signifikan secara statistik dibuang.
  2. Filter arah teori korelasi — variabel yang tanda korelasinya bertentangan dengan teori (misal X27 seharusnya 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).


1. Library & Cek Paket

Library

# 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::recode

Cek JAGS & saeHB

has_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

2. Load Data & Persiapan

Load Data

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
cat("Jumlah variabel:", ncol(df_final), "\n")
## Jumlah variabel: 118

Variabel Rasio

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
  )

Pre-filter Kandidat Global

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
cat("\nTotal dikecualikan:", length(excl_always), "kolom\n")
## 
## Total dikecualikan: 9 kolom

3. Fungsi Pembantu

Helper: pilih_per_grup

# ── 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)
}

Teori Arah Korelasi

# ── 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

Seleksi A2: Top-n/10 + Pearson Signifikansi + Arah Teori

# ── 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)
}

Model: HB Beta

# ── 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
}

Fungsi Plot & Evaluasi

# ── 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)
}

4. Partisi Data: RSE Equal Size

C3 — RSE Equal Size (Median)

# 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 %
table(df_base$grup_equal)
## 
## G1_RSE_Bawah  G2_RSE_Atas 
##           41           40

Distribusi Partisi

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"))


5. Skenario 31: HB TopN RSE-ES saeHB

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:

  • [3a] Signifikansi Pearson: p < 0,05 — variabel tidak signifikan dibuang.
  • [3b] Arah teori: tanda korelasi empiris harus sesuai TEORI_ARAH — variabel yang berlawanan arah teori dibuang.

Jika tidak ada variabel lolos kedua filter di suatu segmen → segmen di-skip.

Run S31

cat("=== Skenario 31: HB TopN RSE-ES ===\n")
## === Skenario 31: HB TopN RSE-ES ===
cat("Seleksi: Top-n/10 + filter signifikansi Pearson (alpha = 0.05)\n")
## Seleksi: Top-n/10 + filter signifikansi Pearson (alpha = 0.05)
cat("Partisi: RSE Equal Size (split median)\n")
## Partisi: RSE Equal Size (split median)
cat(strrep("=", 60), "\n\n")
## ============================================================
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

Plot RSE

if (!is.null(df_s31)) {
  plot_rse(
    data  = df_s31,
    col1  = "RSE",
    col2  = "RSE_hb",
    lab1  = "Direct",
    lab2  = "HB-TN RSE-ES",
    title = "S31: HB Beta Top-n/10 — RSE Equal Size"
  )
} else {
  cat("Plot tidak tersedia: tidak ada hasil model.\n")
}
S31: RSE Direct vs HB Beta Top-n/10 RSE Equal Size

S31: RSE Direct vs HB Beta Top-n/10 RSE Equal Size

Plot Posterior

if (!is.null(df_s31)) {
  plot_hb_posterior(
    df        = df_s31,
    title     = "S31: HB Beta Top-n/10 — RSE Equal Size",
    group_col = "grup_equal"
  )
} else {
  cat("Plot posterior tidak tersedia.\n")
}
S31: HB Beta Posterior — RSE Equal Size

S31: HB Beta Posterior — RSE Equal Size


6. Evaluasi S31

Distribusi RSE

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")
}
Distribusi RSE — S31 vs Direct
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

Metrik Akurasi

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")
}
Relative Bias (%) & RMSE terhadap Direct Estimator
Skenario RB (%) RMSE
S31 HB-TN RSE-ES 0.576 0.0418

Scatter RSE Direct vs HB

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

Scatter RSE Direct vs RSE HB — S31

Perbandingan Estimasi

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

Perbandingan Estimasi Direct vs HB — S31


Ringkasan metodologi S31:

  • Model: HB Beta via saeHB::Beta() (MCMC/JAGS), full posterior distribution per domain.
  • Seleksi variabel (v2): Top-n/10 dengan dua lapis filter(i) signifikansi Pearson 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.
  • Partisi: RSE Equal Size — split berdasarkan median RSE Direct. Tiap segmen mendapat model dan seleksi variabel sendiri-sendiri.
  • CI-check loop: Setelah MCMC, kovariat dengan 95% credible interval menyeberang nol dibuang satu per satu (berdasarkan SD terbesar), lalu MCMC diulang hingga semua CI aman.
  • Plot posterior: Titik biru = estimasi HB, error bar = 95% CI, silang merah = direct, garis hijau = rata-rata HB.

Dianalisis dengan R. Skenario 31 = HB Beta · Top-n/10 (+ Pearson filter) · RSE Equal Size.