1 Pendahuluan

Financial resilience dalam penelitian ini dipahami sebagai kemampuan individu memperoleh dana darurat dalam jangka pendek ketika menghadapi guncangan ekonomi. Ukuran ini penting karena tidak hanya menggambarkan kepemilikan akses keuangan, tetapi juga menunjukkan kesiapan individu menghadapi kebutuhan mendesak.

Financial resilience merupakan dimensi penting dalam kesejahteraan finansial karena melengkapi ukuran inklusi keuangan tradisional seperti kepemilikan rekening. Di kawasan ASEAN, isu ini menjadi relevan karena negara-negara anggota memiliki tingkat pembangunan ekonomi, infrastruktur keuangan, dan kondisi sosial yang beragam. Perbedaan tersebut dapat memengaruhi kemampuan individu dalam memperoleh dana darurat ketika terjadi guncangan ekonomi.

Penelitian ini menggunakan data mikro Global Findex 2021-2023 yang dirilis oleh The World Bank. Global Findex dipilih karena menyediakan instrumen survei yang relatif seragam lintas negara dan memuat pertanyaan mengenai kemampuan memperoleh dana darurat dalam 30 hari. Analisis difokuskan pada enam negara ASEAN, yaitu Kamboja, Indonesia, Lao PDR, Malaysia, Singapura, dan Vietnam, sehingga variasi antarnegara dapat dikontrol melalui variabel economy.

Variabel respons memiliki tiga kategori berurutan, yaitu Very difficult, Somewhat difficult, dan Not difficult at all. Karena respons bersifat ordinal, pendekatan awal yang digunakan adalah regresi logistik ordinal dengan asumsi proportional odds. Namun, apabila asumsi tersebut tidak terpenuhi, analisis dilanjutkan menggunakan Partial Proportional Odds Model (PPOM). PPOM dipilih karena tetap mempertahankan struktur ordinal respons, tetapi lebih fleksibel dengan mengizinkan sebagian prediktor memiliki efek berbeda pada setiap batas kategori.

2 Metode Penelitian

2.1 Data

Data yang digunakan merupakan data sekunder dari Global Findex 2021-2023 yang tersedia melalui World Bank Microdata Library. Unit analisis adalah responden individu berusia 15 tahun ke atas pada enam negara ASEAN yang masuk ke dalam data bersih penelitian.

Sebelum pemodelan, dilakukan pemilihan variabel penelitian, pembatasan kategori respons pada jawaban substantif, penghapusan kode non-substantif seperti refuse to answer dan don’t know, serta penghapusan observasi yang memiliki nilai hilang pada variabel analisis. Bobot survei dari variabel wgt digunakan sebagai .case_weight dalam proses estimasi model.

data_candidates <- c(
  "global_findex_asean_clean.csv",
  "global_findex_asean_clean(1).csv"
)
data_path <- data_candidates[file.exists(data_candidates)][1]

if (is.na(data_path)) {
  stop("File data tidak ditemukan. Pastikan global_findex_asean_clean.csv berada pada folder yang sama dengan file Rmd.")
}

df_raw <- read_findex_csv(data_path)
names(df_raw) <- stringr::str_trim(names(df_raw))

y_var <- "fin24a"
weight_var <- "wgt"

x_core <- c(
  "age",
  "educ",
  "inc_q",
  "emp_in",
  "urbanicity_f2f",
  "saved",
  "internetaccess"
)

control_vars <- c("economy")
x_model_terms <- c(control_vars, x_core)

all_needed <- c("economy", "economycode", "year", y_var, x_core, weight_var)

missing_cols <- setdiff(all_needed, names(df_raw))
if (length(missing_cols) > 0) {
  stop("Kolom tidak ditemukan: ", paste(missing_cols, collapse = ", "))
}

df0 <- df_raw |>
  dplyr::select(dplyr::all_of(all_needed)) |>
  dplyr::mutate(
    dplyr::across(
      dplyr::all_of(c(y_var, x_core, weight_var)),
      ~ suppressWarnings(as.numeric(.x))
    )
  )

invalid_codes_list <- list(
  educ = c(4, 5),
  internetaccess = c(3)
)

df1 <- df0

for (v in names(invalid_codes_list)) {
  bad <- invalid_codes_list[[v]]
  df1[[v]][df1[[v]] %in% bad] <- NA_real_
}

df_clean <- df1 |>
  dplyr::filter(.data[[y_var]] %in% c(1, 2, 3)) |>
  tidyr::drop_na(dplyr::all_of(c(y_var, x_core, weight_var, "economy")))

df_model <- df_clean |>
  dplyr::mutate(
    economy = factor(economy),

    financial_resilience = factor(
      fin24a,
      levels = c(1, 2, 3),
      labels = c("Very difficult", "Somewhat difficult", "Not difficult at all"),
      ordered = TRUE
    ),

    educ = factor(
      educ,
      levels = c(1, 2, 3),
      labels = c("Primary or less", "Secondary", "Tertiary or more"),
      ordered = FALSE
    ),

    inc_q = factor(
      inc_q,
      levels = c(1, 2, 3, 4, 5),
      labels = c("Poorest 20%", "Second 20%", "Middle 20%", "Fourth 20%", "Richest 20%"),
      ordered = FALSE
    ),

    emp_in = factor(
      emp_in,
      levels = c(1, 2),
      labels = c("In workforce", "Out of workforce")
    ),

    urbanicity_f2f = factor(
      urbanicity_f2f,
      levels = c(1, 2),
      labels = c("Rural", "Urban")
    ),

    saved = factor(
      saved,
      levels = c(0, 1),
      labels = c("No", "Yes")
    ),

    internetaccess = factor(
      internetaccess,
      levels = c(1, 2),
      labels = c("Yes", "No")
    ),

    .case_weight = .data[[weight_var]]
  ) |>
  tidyr::drop_na(dplyr::all_of(c("financial_resilience", x_model_terms, weight_var)))
preprocess_table <- tibble::tibble(
  Keterangan = c("Observasi awal", "Observasi setelah preprocessing", "Jumlah negara"),
  Nilai = c(
    pretty_num(nrow(df_raw), 0),
    pretty_num(nrow(df_model), 0),
    pretty_num(dplyr::n_distinct(df_model$economy), 0)
  )
)

table_clean(preprocess_table, "Tabel 1. Ringkasan preprocessing")
Tabel 1. Ringkasan preprocessing
Keterangan Nilai
Observasi awal 5.424
Observasi setelah preprocessing 5.359
Jumlah negara 6

2.2 Variabel Penelitian

Variabel respons dalam penelitian ini adalah financial_resilience, yaitu tingkat kesulitan responden dalam mengumpulkan dana darurat dalam 30 hari. Kategori yang lebih tinggi menunjukkan ketahanan finansial yang lebih baik. Variabel prediktor mencakup faktor demografis, sosial-ekonomi, perilaku keuangan, dan akses digital. Variabel economy digunakan sebagai kontrol negara agar perbedaan konteks antarnegara tetap diperhitungkan dalam model.

variable_table <- tibble::tribble(
  ~Variabel, ~Peran, ~Keterangan, ~`Skala Data`, ~`Kategori/Kode`,
  "financial_resilience", "Respons", "Tingkat kesulitan memperoleh dana darurat", "Ordinal", "Very difficult<br>Somewhat difficult<br>Not difficult at all",
  "economy", "Kontrol", "Negara responden", "Nominal", "Cambodia<br>Indonesia<br>Lao PDR<br>Malaysia<br>Singapore<br>Vietnam",
  "age", "Prediktor", "Usia responden", "Rasio", "Usia dalam tahun",
  "educ", "Prediktor", "Tingkat pendidikan", "Nominal", "Primary or less<br>Secondary<br>Tertiary or more",
  "inc_q", "Prediktor", "Kuintil pendapatan", "Nominal", "Poorest 20%<br>Second 20%<br>Middle 20%<br>Fourth 20%<br>Richest 20%",
  "emp_in", "Prediktor", "Status angkatan kerja", "Nominal", "In workforce<br>Out of workforce",
  "urbanicity_f2f", "Prediktor", "Wilayah tempat tinggal", "Nominal", "Rural<br>Urban",
  "saved", "Prediktor", "Status menabung", "Nominal", "No<br>Yes",
  "internetaccess", "Prediktor", "Akses internet", "Nominal", "Yes<br>No"
)

table_clean(variable_table, "Tabel 2. Variabel yang digunakan dalam penelitian", full_width = TRUE)
Tabel 2. Variabel yang digunakan dalam penelitian
Variabel Peran Keterangan Skala Data Kategori/Kode
financial_resilience Respons Tingkat kesulitan memperoleh dana darurat Ordinal Very difficult
Somewhat difficult
Not difficult at all
economy Kontrol Negara responden Nominal Cambodia
Indonesia
Lao PDR
Malaysia
Singapore
Vietnam
age Prediktor Usia responden Rasio Usia dalam tahun
educ Prediktor Tingkat pendidikan Nominal Primary or less
Secondary
Tertiary or more
inc_q Prediktor Kuintil pendapatan Nominal Poorest 20%
Second 20%
Middle 20%
Fourth 20%
Richest 20%
emp_in Prediktor Status angkatan kerja Nominal In workforce
Out of workforce
urbanicity_f2f Prediktor Wilayah tempat tinggal Nominal Rural
Urban
saved Prediktor Status menabung Nominal No
Yes
internetaccess Prediktor Akses internet Nominal Yes
No

2.3 Metode Analisis

2.3.1 Variance Inflation Factor

Sebelum pemodelan, multikolinearitas antarvariabel prediktor diperiksa menggunakan Variance Inflation Factor (VIF). Untuk variabel kategorik dengan lebih dari dua kategori, interpretasi dilakukan menggunakan Adjusted GVIF. Variabel dikatakan tidak menunjukkan multikolinearitas serius apabila nilai VIF atau Adjusted GVIF berada jauh di bawah ambang batas umum 5.

2.3.2 Regresi Logistik Ordinal

Model awal yang digunakan adalah proportional odds model dengan fungsi logit kumulatif. Model ini sesuai untuk respons ordinal karena mempertahankan urutan kategori respons.

\[ \log\left( \frac{P(Y_i \leq j \mid \mathbf{x}_i)} {P(Y_i > j \mid \mathbf{x}_i)} \right) = \alpha_j - \mathbf{x}_i^\top\boldsymbol{\beta}. \]

Pada persamaan tersebut, \(\alpha_j\) merupakan threshold atau cutpoint untuk kategori ke-\(j\), sedangkan \(\boldsymbol{\beta}\) merupakan koefisien regresi variabel prediktor. Model proportional odds mengasumsikan koefisien prediktor konstan pada seluruh batas kategori respons.

2.3.3 Estimasi Parameter

Parameter model diestimasi menggunakan metode Maximum Likelihood Estimation (MLE). Secara umum, fungsi log-likelihood untuk respons ordinal dapat ditulis sebagai berikut.

\[ \ell(\alpha, \beta) = \sum_{i=1}^{n}\sum_{j=1}^{J} y_{ij}\ln(P(Y_i=j)). \]

2.3.4 Pemeriksaan Asumsi Proportional Odds

Asumsi proportional odds menyatakan bahwa pengaruh prediktor bernilai konstan pada setiap batas kategori respons. Pemeriksaan dilakukan melalui pendekatan Brant test apabila paket tersedia dan melalui Likelihood Ratio Test (LRT) per prediktor dengan membandingkan model PO terhadap model yang mengizinkan prediktor tertentu menjadi efek non-proporsional. Jika nilai p-value kurang dari 0,05, prediktor tersebut terindikasi melanggar asumsi proportional odds.

2.3.5 Partial Proportional Odds Model

PPOM digunakan ketika asumsi proportional odds tidak sepenuhnya terpenuhi. Dalam PPOM, prediktor yang memenuhi asumsi tetap memiliki satu koefisien umum, sedangkan prediktor yang melanggar asumsi diizinkan memiliki koefisien berbeda pada setiap threshold kategori.

Model ini lebih fleksibel daripada model PO, tetapi tetap mempertahankan struktur ordinal yang akan hilang apabila respons dimodelkan dengan regresi logistik multinomial.

2.3.6 Pemilihan dan Evaluasi Model

Pemilihan model dilakukan berdasarkan nilai AIC dan uji LRT. Model yang memiliki AIC lebih kecil dan peningkatan kecocokan signifikan dipertimbangkan sebagai model yang lebih baik. Rumus AIC dan LR ditulis sebagai berikut.

\[ AIC=-2\ln(L)+2k \]

\[ LR=-2(\ln L_0-\ln L_1)\sim\chi^2_{df}. \]

2.3.7 Odds Ratio

Nilai odds ratio dihitung dengan exp(Estimate). Untuk efek proporsional, OR diinterpretasikan sebagai pengali odds umum untuk berada pada kategori financial resilience yang lebih tinggi. Untuk efek non-proporsional, OR dibaca berdasarkan threshold yang tertulis pada parameter.

2.3.8 Uji Kecocokan Model dan Evaluasi Kinerja

Kecocokan model diperiksa menggunakan statistik devians \(G^2\). Model dikatakan tidak menunjukkan indikasi lack of fit apabila p-value lebih besar dari 0,05. Evaluasi kinerja prediksi dilakukan menggunakan aturan probabilitas terbesar, yaitu setiap observasi diprediksi ke kategori dengan probabilitas model paling tinggi. Hasil prediksi kemudian diringkas melalui confusion matrix, akurasi tepat, akurasi toleransi satu tingkat, dan rata-rata jarak ordinal.

3 Hasil dan Pembahasan

3.1 Distribusi Variabel Respons

desc_y <- df_model |>
  dplyr::count(financial_resilience, name = "Frekuensi") |>
  dplyr::mutate(
    Proporsi_num = Frekuensi / sum(Frekuensi),
    Proporsi = pretty_num(Proporsi_num, 3),
    Persentase = pretty_percent(Proporsi_num, accuracy = 0.01)
  )

desc_y_show <- desc_y |>
  dplyr::select(financial_resilience, Frekuensi, Proporsi, Persentase) |>
  dplyr::mutate(Frekuensi = pretty_num(Frekuensi, 0))

table_clean(desc_y_show, "Tabel 3. Distribusi variabel respons")
Tabel 3. Distribusi variabel respons
financial_resilience Frekuensi Proporsi Persentase
Very difficult 1.740 0,325 32,47%
Somewhat difficult 2.098 0,391 39,15%
Not difficult at all 1.521 0,284 28,38%

Mayoritas responden berada pada kondisi finansial yang relatif rentan. Berdasarkan hasil distribusi, kategori Very difficult dan Somewhat difficult menjadi kelompok yang secara bersama-sama menunjukkan masih besarnya proporsi responden yang mengalami kesulitan memperoleh dana darurat. Sementara itu, kategori Not difficult at all menggambarkan kelompok responden dengan financial resilience paling baik. Distribusi tiga kategori masih cukup seimbang sehingga pemodelan ordinal dapat dilakukan tanpa dominasi ekstrem dari satu kelas respons.

ggplot2::ggplot(desc_y, ggplot2::aes(x = financial_resilience, y = Frekuensi, fill = financial_resilience)) +
  ggplot2::geom_col(width = 0.68, color = "white", linewidth = 0.8) +
  ggplot2::geom_text(ggplot2::aes(label = Persentase), vjust = -0.55, fontface = "bold", size = 4.3, color = "#172033") +
  ggplot2::scale_fill_manual(values = pal_resp) +
  ggplot2::labs(
    title = "Distribusi Financial Resilience",
    subtitle = "Kategori respons disusun dari paling sulit hingga paling resilient",
    x = NULL,
    y = "Frekuensi"
  ) +
  ggplot2::theme_minimal(base_size = 13) +
  ggplot2::theme(
    legend.position = "none",
    plot.title = ggplot2::element_text(face = "bold", size = 18, color = "#172033"),
    plot.subtitle = ggplot2::element_text(color = "#64748b"),
    panel.grid.minor = ggplot2::element_blank()
  )

desc_country <- df_model |>
  dplyr::count(economy, financial_resilience, name = "Frekuensi") |>
  dplyr::group_by(economy) |>
  dplyr::mutate(
    Proporsi_num = Frekuensi / sum(Frekuensi),
    Persentase = pretty_percent(Proporsi_num, accuracy = 0.01)
  ) |>
  dplyr::ungroup()

country_table <- desc_country |>
  dplyr::select(economy, financial_resilience, Frekuensi, Persentase) |>
  dplyr::mutate(Frekuensi = pretty_num(Frekuensi, 0))

table_clean(country_table, "Tabel 4. Distribusi financial resilience menurut negara", full_width = TRUE)
Tabel 4. Distribusi financial resilience menurut negara
economy financial_resilience Frekuensi Persentase
Cambodia Very difficult 397 44,96%
Cambodia Somewhat difficult 352 39,86%
Cambodia Not difficult at all 134 15,18%
Indonesia Very difficult 380 38,54%
Indonesia Somewhat difficult 484 49,09%
Indonesia Not difficult at all 122 12,37%
Lao PDR Very difficult 453 56,77%
Lao PDR Somewhat difficult 181 22,68%
Lao PDR Not difficult at all 164 20,55%
Malaysia Very difficult 252 29,54%
Malaysia Somewhat difficult 360 42,20%
Malaysia Not difficult at all 241 28,25%
Singapore Very difficult 125 14,30%
Singapore Somewhat difficult 383 43,82%
Singapore Not difficult at all 366 41,88%
Vietnam Very difficult 133 13,78%
Vietnam Somewhat difficult 338 35,03%
Vietnam Not difficult at all 494 51,19%
ggplot2::ggplot(desc_country, ggplot2::aes(x = economy, y = Proporsi_num, fill = financial_resilience)) +
  ggplot2::geom_col(width = 0.72, color = "white", linewidth = 0.4) +
  ggplot2::coord_flip() +
  ggplot2::scale_y_continuous(labels = scales::percent) +
  ggplot2::scale_fill_manual(values = pal_resp) +
  ggplot2::labs(
    title = "Komposisi Financial Resilience menurut Negara",
    subtitle = "Perbedaan antarnegara dikontrol melalui variabel economy",
    x = NULL,
    y = "Proporsi",
    fill = "Kategori"
  ) +
  ggplot2::theme_minimal(base_size = 13) +
  ggplot2::theme(
    plot.title = ggplot2::element_text(face = "bold", size = 18, color = "#172033"),
    plot.subtitle = ggplot2::element_text(color = "#64748b"),
    legend.position = "bottom",
    panel.grid.minor = ggplot2::element_blank()
  )

3.2 Pemeriksaan Multikolinearitas

df_vif <- df_model |>
  dplyr::mutate(y_num = as.numeric(financial_resilience))

vif_formula <- make_formula("y_num", x_model_terms)

vif_lm <- stats::lm(
  formula = vif_formula,
  data = df_vif,
  weights = .case_weight
)

vif_raw <- car::vif(vif_lm)

if (is.matrix(vif_raw)) {
  vif_table <- as.data.frame(vif_raw) |>
    tibble::rownames_to_column("Variabel") |>
    dplyr::mutate(
      `Adjusted GVIF` = GVIF^(1 / (2 * Df)),
      Keputusan = dplyr::case_when(
        `Adjusted GVIF` >= 10 ~ "Terdapat multikolinearitas tinggi",
        `Adjusted GVIF` >= 5 ~ "Perlu diperhatikan",
        TRUE ~ "Tidak terdapat multikolinearitas"
      )
    ) |>
    dplyr::select(Variabel, `Adjusted GVIF`, Keputusan)
} else {
  vif_table <- tibble::tibble(
    Variabel = names(vif_raw),
    `Adjusted GVIF` = as.numeric(vif_raw),
    Keputusan = dplyr::case_when(
      `Adjusted GVIF` >= 10 ~ "Terdapat multikolinearitas tinggi",
      `Adjusted GVIF` >= 5 ~ "Perlu diperhatikan",
      TRUE ~ "Tidak terdapat multikolinearitas"
    )
  )
}

vif_show <- vif_table |>
  dplyr::mutate(`Adjusted GVIF` = pretty_num(`Adjusted GVIF`, 3))

table_clean(vif_show, "Tabel 5. Pemeriksaan multikolinearitas")
Tabel 5. Pemeriksaan multikolinearitas
Variabel Adjusted GVIF Keputusan
economy 1,119 Tidak terdapat multikolinearitas
age 1,174 Tidak terdapat multikolinearitas
educ 1,202 Tidak terdapat multikolinearitas
inc_q 1,021 Tidak terdapat multikolinearitas
emp_in 1,058 Tidak terdapat multikolinearitas
urbanicity_f2f 1,307 Tidak terdapat multikolinearitas
saved 1,116 Tidak terdapat multikolinearitas
internetaccess 1,261 Tidak terdapat multikolinearitas

Seluruh nilai Adjusted GVIF berada jauh di bawah ambang batas 5. Dengan demikian, tidak ditemukan indikasi multikolinearitas serius pada variabel prediktor maupun kontrol negara. Kondisi ini menunjukkan bahwa estimasi koefisien tidak mengalami inflasi standard error yang berarti, sehingga interpretasi parsial dapat dilakukan dengan lebih andal.

3.3 Hasil Estimasi Model Proportional Odds Awal

formula_po <- make_formula("financial_resilience", x_model_terms)
formula_null <- financial_resilience ~ 1
formula_country_only <- financial_resilience ~ economy

model_po_polr <- MASS::polr(
  formula = formula_po,
  data = df_model,
  weights = .case_weight,
  Hess = TRUE,
  method = "logistic",
  model = TRUE
)

model_po_clm <- fit_clm_po(formula_po, df_model)
model_null_clm <- fit_clm_po(formula_null, df_model)
model_country_only_clm <- fit_clm_po(formula_country_only, df_model)

coef_po <- tidy_clm(model_po_clm)

coef_po_show <- coef_po |>
  dplyr::mutate(
    Estimate = pretty_num(Estimate, 3),
    OR = pretty_num(OR, 3),
    `p-value` = pretty_p(`p-value`)
  ) |>
  dplyr::select(Parameter, Jenis, Estimate, OR, `p-value`, Keputusan)

table_clean(coef_po_show, "Tabel 6. Hasil estimasi model proportional odds awal", full_width = TRUE)
Tabel 6. Hasil estimasi model proportional odds awal
Parameter Jenis Estimate OR p-value Keputusan
Very difficult|Somewhat difficult Cutpoint 0,598 1,818 <0,001 Signifikan
Somewhat difficult|Not difficult at all Cutpoint 2,664 14,355 <0,001 Signifikan
economyIndonesia Efek proporsional -0,400 0,671 <0,001 Signifikan
economyLao PDR Efek proporsional -0,883 0,413 <0,001 Signifikan
economyMalaysia Efek proporsional -0,219 0,804 0,0487 Signifikan
economySingapore Efek proporsional 0,241 1,272 0,0468 Signifikan
economyVietnam Efek proporsional 1,192 3,293 <0,001 Signifikan
age Efek proporsional 0,018 1,018 <0,001 Signifikan
educSecondary Efek proporsional 0,278 1,320 <0,001 Signifikan
educTertiary or more Efek proporsional 0,980 2,663 <0,001 Signifikan
inc_qSecond 20% Efek proporsional 0,276 1,318 0,0014 Signifikan
inc_qMiddle 20% Efek proporsional 0,366 1,441 <0,001 Signifikan
inc_qFourth 20% Efek proporsional 0,720 2,055 <0,001 Signifikan
inc_qRichest 20% Efek proporsional 1,115 3,051 <0,001 Signifikan
emp_inOut of workforce Efek proporsional -0,378 0,685 <0,001 Signifikan
urbanicity_f2fUrban Efek proporsional 0,074 1,077 0,3016 Tidak signifikan
savedYes Efek proporsional 0,543 1,722 <0,001 Signifikan
internetaccessNo Efek proporsional -0,541 0,582 <0,001 Signifikan

Pada model PO awal, sebagian besar prediktor signifikan pada taraf 5%. Dengan Kamboja sebagai negara referensi, beberapa negara memiliki odds financial resilience yang lebih tinggi, sedangkan beberapa negara lain lebih rendah. Pendidikan dan kuintil pendapatan menunjukkan pola bertingkat: semakin tinggi pendidikan dan pendapatan, semakin besar kecenderungan responden berada pada kategori financial resilience yang lebih baik. Perilaku menabung juga meningkatkan odds financial resilience, sedangkan tidak memiliki akses internet menurunkannya pada model PO awal. Karena interpretasi ini masih bergantung pada asumsi proportional odds, pemeriksaan asumsi diperlukan sebelum menetapkan model akhir.

3.4 Indikasi Pelanggaran Asumsi Proportional Odds

if (requireNamespace("brant", quietly = TRUE)) {
  brant_out <- tryCatch(
    brant::brant(model_po_polr),
    error = function(e) paste("Brant test gagal:", e$message)
  )
} else {
  brant_out <- "Package brant tidak tersedia. Pemeriksaan dilanjutkan menggunakan LRT per prediktor."
}
## ------------------------------------------------------------ 
## Test for         X2  df  probability 
## ------------------------------------------------------------ 
## Omnibus              191.46  16  0
## economyIndonesia     7.67    1   0.01
## economyLao PDR           51.92   1   0
## economyMalaysia      1.92    1   0.17
## economySingapore     0.39    1   0.53
## economyVietnam           3   1   0.08
## age              15.14   1   0
## educSecondary            0.33    1   0.57
## educTertiary or more     0   1   0.96
## inc_qSecond 20%      0.21    1   0.65
## inc_qMiddle 20%      0.01    1   0.92
## inc_qFourth 20%      0.06    1   0.8
## inc_qRichest 20%     3.53    1   0.06
## emp_inOut of workforce   0.01    1   0.91
## urbanicity_f2fUrban      0.26    1   0.61
## savedYes         9.59    1   0
## internetaccessNo     0.09    1   0.77
## ------------------------------------------------------------ 
## 
## H0: Parallel Regression Assumption holds
brant_out
##                                   X2 df                              probability
## Omnibus                191.460926700 16 0.00000000000000000000000000000004190917
## economyIndonesia         7.671701072  1 0.00560935508277484243255806006800412433
## economyLao PDR          51.917791256  1 0.00000000000057873642139972634491906778
## economyMalaysia          1.924296448  1 0.16538379527669039292803176977031398565
## economySingapore         0.386458133  1 0.53416705764871386108438855444546788931
## economyVietnam           2.999438278  1 0.08329339089137302587495526040584081784
## age                     15.135183590  1 0.00010008062831610429522805755242487180
## educSecondary            0.328460901  1 0.56656677397401067342030955842346884310
## educTertiary or more     0.002903921  1 0.95702436401311641311906441842438653111
## inc_qSecond 20%          0.208533550  1 0.64791922816790492589689165470190346241
## inc_qMiddle 20%          0.010610328  1 0.91795785610634594853252110624453052878
## inc_qFourth 20%          0.064169267  1 0.80002361976835112411521322428598068655
## inc_qRichest 20%         3.531057125  1 0.06022937573212708284309258033317746595
## emp_inOut of workforce   0.011664522  1 0.91399377583415830628155163140036165714
## urbanicity_f2fUrban      0.256884966  1 0.61226834718388234435337835748214274645
## savedYes                 9.585051901  1 0.00196167893417834417538192504082417145
## internetaccessNo         0.086621540  1 0.76851692496624002259864028019364923239
po_violation_lrt <- purrr::map_dfr(x_core, function(v) {
  nominal_v <- make_nominal_formula(v)

  candidate <- fit_clm_with_warnings(
    formula = formula_po,
    nominal_formula = nominal_v,
    data_input = df_model
  )

  if (is.null(candidate$model)) {
    return(tibble::tibble(
      Prediktor = v,
      LR = NA_real_,
      df = NA_real_,
      `p-value` = NA_real_,
      Keputusan = "Tidak dapat diuji"
    ))
  }

  ll_base <- as.numeric(stats::logLik(model_po_clm))
  ll_nom <- as.numeric(stats::logLik(candidate$model))
  df_base <- attr(stats::logLik(model_po_clm), "df")
  df_nom <- attr(stats::logLik(candidate$model), "df")

  LR <- 2 * (ll_nom - ll_base)
  df_diff <- df_nom - df_base
  p <- stats::pchisq(LR, df = df_diff, lower.tail = FALSE)

  tibble::tibble(
    Prediktor = v,
    LR = LR,
    df = df_diff,
    `p-value` = p,
    Keputusan = dplyr::if_else(p < 0.05, "Terindikasi melanggar", "Tidak terindikasi")
  )
}) |>
  dplyr::arrange(`p-value`)

po_violation_show <- po_violation_lrt |>
  dplyr::mutate(
    LR = pretty_num(LR, 3),
    df = pretty_num(df, 0),
    `p-value` = pretty_p(`p-value`)
  )

table_clean(po_violation_show, "Tabel 7. Indikasi pelanggaran asumsi proportional odds")
Tabel 7. Indikasi pelanggaran asumsi proportional odds
Prediktor LR df p-value Keputusan
urbanicity_f2f 15,824 1 <0,001 Terindikasi melanggar
educ 15,374 2 <0,001 Terindikasi melanggar
internetaccess 12,102 1 <0,001 Terindikasi melanggar
saved 11,920 1 <0,001 Terindikasi melanggar
inc_q 15,982 4 0,0030 Terindikasi melanggar
age 6,675 1 0,0098 Terindikasi melanggar
emp_in 0,628 1 0,4282 Tidak terindikasi

Hasil pemeriksaan menunjukkan bahwa asumsi proportional odds tidak sepenuhnya terpenuhi. Beberapa prediktor memiliki p-value kurang dari 0,05, sehingga pengaruhnya tidak dapat diasumsikan konstan pada seluruh batas kategori respons. Temuan ini menjadi dasar penggunaan PPOM sebagai model akhir.

3.5 Perbandingan Kandidat Model

violating_vars <- po_violation_lrt |>
  dplyr::filter(!is.na(`p-value`), `p-value` < 0.05) |>
  dplyr::arrange(`p-value`) |>
  dplyr::pull(Prediktor)

top1 <- violating_vars[1:min(1, length(violating_vars))]
top2 <- violating_vars[1:min(2, length(violating_vars))]
top3 <- violating_vars[1:min(3, length(violating_vars))]

candidate_sets <- list(
  PO = character(0),
  PPOM_top1 = top1,
  PPOM_top2 = top2,
  PPOM_top3 = top3,
  PPOM_saved = intersect(c("saved"), x_core),
  PPOM_age = intersect(c("age"), x_core),
  PPOM_internetaccess = intersect(c("internetaccess"), x_core),
  PPOM_saved_age = intersect(c("saved", "age"), x_core),
  PPOM_saved_internetaccess = intersect(c("saved", "internetaccess"), x_core),
  PPOM_age_saved_internetaccess = intersect(c("age", "saved", "internetaccess"), x_core)
)

candidate_key <- purrr::map_chr(candidate_sets, ~ paste(sort(unique(.x)), collapse = "+"))
candidate_sets <- candidate_sets[!duplicated(candidate_key)]

candidate_models <- list()
candidate_rows <- list()

for (nm in names(candidate_sets)) {
  nom_vars <- unique(candidate_sets[[nm]])
  nom_formula <- make_nominal_formula(nom_vars)

  fit_obj <- fit_clm_with_warnings(
    formula = formula_po,
    nominal_formula = nom_formula,
    data_input = df_model
  )

  candidate_models[[nm]] <- fit_obj$model

  if (is.null(fit_obj$model)) {
    candidate_rows[[nm]] <- tibble::tibble(
      Model = nm,
      `Efek non-proporsional` = paste(nom_vars, collapse = ", "),
      AIC = NA_real_,
      BIC = NA_real_,
      LR = NA_real_,
      `p-value` = NA_real_
    )
  } else {
    ll_candidate <- as.numeric(stats::logLik(fit_obj$model))
    df_candidate <- attr(stats::logLik(fit_obj$model), "df")
    ll_po <- as.numeric(stats::logLik(model_po_clm))
    df_po <- attr(stats::logLik(model_po_clm), "df")

    LR <- 2 * (ll_candidate - ll_po)
    df_diff <- df_candidate - df_po
    p_lr <- ifelse(df_diff > 0, stats::pchisq(LR, df = df_diff, lower.tail = FALSE), NA_real_)

    candidate_rows[[nm]] <- tibble::tibble(
      Model = nm,
      `Efek non-proporsional` = paste(nom_vars, collapse = ", "),
      AIC = stats::AIC(fit_obj$model),
      BIC = stats::BIC(fit_obj$model),
      LR = LR,
      `p-value` = p_lr
    )
  }
}

candidate_summary <- dplyr::bind_rows(candidate_rows) |>
  dplyr::arrange(AIC)

eligible <- candidate_summary |>
  dplyr::filter(is.finite(AIC))

chosen_candidate <- eligible$Model[which.min(eligible$AIC)]
model_final <- candidate_models[[chosen_candidate]]
chosen_nominal_vars <- candidate_sets[[chosen_candidate]]
final_model_type <- ifelse(length(chosen_nominal_vars) > 0, "Partial Proportional Odds", "Proportional Odds")

candidate_show <- candidate_summary |>
  dplyr::mutate(
    AIC = pretty_num(AIC, 1),
    BIC = pretty_num(BIC, 1),
    LR = pretty_num(LR, 3),
    `p-value` = pretty_p(`p-value`),
    `Efek non-proporsional` = dplyr::if_else(`Efek non-proporsional` == "", "-", `Efek non-proporsional`)
  )

table_clean(candidate_show, "Tabel 8. Perbandingan kandidat model", full_width = TRUE)
Tabel 8. Perbandingan kandidat model
Model Efek non-proporsional AIC BIC LR p-value
PPOM_top3 urbanicity_f2f, educ, internetaccess 10.192,2 10.337,2 30,320 <0,001
PPOM_top2 urbanicity_f2f, educ 10.196,3 10.334,7 24,231 <0,001
PPOM_age_saved_internetaccess age, saved, internetaccess 10.198,0 10.336,5 22,467 <0,001
PPOM_saved_internetaccess saved, internetaccess 10.198,3 10.330,1 20,218 <0,001
PPOM_saved_age saved, age 10.200,6 10.332,5 17,891 <0,001
PPOM_top1 urbanicity_f2f 10.200,7 10.325,9 15,824 <0,001
PPOM_internetaccess internetaccess 10.204,4 10.329,6 12,102 <0,001
PPOM_saved saved 10.204,6 10.329,8 11,920 <0,001
PPOM_age age 10.209,8 10.335,1 6,675 0,0098
PO
10.214,5 10.333,2 0,000 NA

Berdasarkan nilai AIC terkecil, model akhir yang terpilih adalah PPOM_top3. Variabel yang diperlakukan sebagai efek non-proporsional adalah urbanicity_f2f, educ, internetaccess. Pemilihan ini menunjukkan bahwa model yang lebih fleksibel memberikan kecocokan lebih baik dibandingkan model PO awal.

3.6 Perbandingan Model Regresi Logistik Ordinal

lrt_po_vs_final <- lr_test(
  model_reduced = model_po_clm,
  model_full = model_final,
  label = "PO vs PPOM"
)

model_comparison <- tibble::tibble(
  Model = c("PO", "PPOM Final"),
  AIC = c(stats::AIC(model_po_clm), stats::AIC(model_final)),
  `Efek Non-Proporsional` = c("-", paste(chosen_nominal_vars, collapse = ", "))
) |>
  dplyr::mutate(AIC = pretty_num(AIC, 2))

table_clean(model_comparison, "Tabel 9. Perbandingan model regresi logistik ordinal")
Tabel 9. Perbandingan model regresi logistik ordinal
Model AIC Efek Non-Proporsional
PO 10.214,50
PPOM Final 10.192,18 urbanicity_f2f, educ, internetaccess

Model PPOM Final memiliki nilai AIC lebih rendah dibandingkan model PO. Dengan demikian, PPOM Final dipilih sebagai model terbaik dalam penelitian ini. Konsekuensinya, variabel yang terpilih sebagai efek non-proporsional diinterpretasikan secara spesifik pada setiap batas kategori respons.

3.7 Uji Kecocokan Model

gof_deviance <- deviance_gof_grouped(
  model = model_final,
  data_input = df_model,
  x_terms = x_model_terms,
  y_name = "financial_resilience"
)

gof_table <- gof_deviance |>
  dplyr::transmute(
    `Statistik G2` = pretty_num(Statistik, 3),
    df = pretty_num(df, 0),
    `p-value` = pretty_p(`p-value`),
    Keputusan = Keputusan
  )

table_clean(gof_table, "Tabel 10. Uji kecocokan model")
Tabel 10. Uji kecocokan model
Statistik G2 df p-value Keputusan
8.417,483 8.522 0,7878 Tidak ada indikasi lack of fit

Uji kecocokan model digunakan untuk memeriksa apakah model PPOM telah mampu menggambarkan pola data dengan baik. Jika p-value lebih besar dari 0,05, maka tidak terdapat indikasi lack of fit. Dengan demikian, model akhir dapat digunakan untuk menjelaskan hubungan antara prediktor dan tingkat financial resilience.

3.8 Uji Signifikansi Parameter

3.8.1 Uji Simultan

lr_final_vs_null <- lr_test(
  model_reduced = model_null_clm,
  model_full = model_final,
  label = "Model akhir vs model null"
)

lr_simultan_show <- lr_final_vs_null |>
  dplyr::transmute(
    LR = pretty_num(LR, 3),
    df = pretty_num(df, 0),
    `p-value` = pretty_p(`p-value`),
    Keputusan = Keputusan
  )

table_clean(lr_simultan_show, "Tabel 11. Uji signifikansi simultan")
Tabel 11. Uji signifikansi simultan
LR df p-value Keputusan
1.625,523 20 <0,001 Signifikan

Hasil uji simultan menunjukkan bahwa model akhir signifikan dalam menjelaskan financial resilience. Artinya, variabel prediktor yang digunakan secara bersama-sama memiliki kontribusi terhadap variasi tingkat financial resilience responden.

3.8.2 Uji Parsial

coef_final <- tidy_clm(model_final)

partial_table <- coef_final |>
  dplyr::filter(Jenis != "Cutpoint") |>
  dplyr::mutate(
    Estimate = pretty_num(Estimate, 3),
    `p-value` = pretty_p(`p-value`)
  ) |>
  dplyr::select(Parameter, Jenis, Estimate, `p-value`, Keputusan)

table_clean(partial_table, "Tabel 12. Uji parsial parameter model akhir", full_width = TRUE)
Tabel 12. Uji parsial parameter model akhir
Parameter Jenis Estimate p-value Keputusan
Very difficult|Somewhat difficult.urbanicity_f2fUrban Efek non-proporsional -0,174 0,0291 Signifikan
Somewhat difficult|Not difficult at all.urbanicity_f2fUrban Efek non-proporsional 0,079 0,3663 Tidak signifikan
Very difficult|Somewhat difficult.educSecondary Efek non-proporsional -0,349 <0,001 Signifikan
Somewhat difficult|Not difficult at all.educSecondary Efek non-proporsional -0,184 0,0468 Signifikan
Very difficult|Somewhat difficult.educTertiary or more Efek non-proporsional -0,883 <0,001 Signifikan
Somewhat difficult|Not difficult at all.educTertiary or more Efek non-proporsional -0,988 <0,001 Signifikan
Very difficult|Somewhat difficult.internetaccessNo Efek non-proporsional 0,618 <0,001 Signifikan
Somewhat difficult|Not difficult at all.internetaccessNo Efek non-proporsional 0,384 <0,001 Signifikan
economyIndonesia Efek proporsional -0,405 <0,001 Signifikan
economyLao PDR Efek proporsional -0,862 <0,001 Signifikan
economyMalaysia Efek proporsional -0,219 0,0488 Signifikan
economySingapore Efek proporsional 0,275 0,0239 Signifikan
economyVietnam Efek proporsional 1,223 <0,001 Signifikan
age Efek proporsional 0,018 <0,001 Signifikan
inc_qSecond 20% Efek proporsional 0,283 0,0011 Signifikan
inc_qMiddle 20% Efek proporsional 0,370 <0,001 Signifikan
inc_qFourth 20% Efek proporsional 0,731 <0,001 Signifikan
inc_qRichest 20% Efek proporsional 1,126 <0,001 Signifikan
emp_inOut of workforce Efek proporsional -0,392 <0,001 Signifikan
savedYes Efek proporsional 0,540 <0,001 Signifikan

Hasil uji parsial menunjukkan bahwa sebagian besar prediktor berpengaruh signifikan terhadap financial resilience pada taraf 5%. Pada efek proporsional, interpretasi berlaku konstan pada seluruh batas kategori. Pada efek non-proporsional, signifikansi dan arah pengaruh dibaca berdasarkan masing-masing threshold, sehingga pola pengaruhnya dapat berbeda antara batas Very difficult versus Somewhat difficult dan batas Somewhat difficult versus Not difficult at all.

3.9 Odds Ratio Partial Proportional Odds Model

or_table <- coef_final |>
  dplyr::filter(Jenis != "Cutpoint") |>
  dplyr::mutate(
    Estimate_num = Estimate,
    OR_num = OR,
    Estimate = pretty_num(Estimate, 3),
    OR = pretty_num(OR, 3),
    `CL-lower` = pretty_num(`CI 2.5%`, 3),
    `CL-upper` = pretty_num(`CI 97.5%`, 3)
  ) |>
  dplyr::select(Parameter, Estimate, OR, `CL-lower`, `CL-upper`)

table_clean(or_table, "Tabel 13. Odds ratio Partial Proportional Odds Model", full_width = TRUE)
Tabel 13. Odds ratio Partial Proportional Odds Model
Parameter Estimate OR CL-lower CL-upper
Very difficult|Somewhat difficult.urbanicity_f2fUrban -0,174 0,840 0,719 0,982
Somewhat difficult|Not difficult at all.urbanicity_f2fUrban 0,079 1,082 0,912 1,283
Very difficult|Somewhat difficult.educSecondary -0,349 0,706 0,596 0,835
Somewhat difficult|Not difficult at all.educSecondary -0,184 0,832 0,694 0,997
Very difficult|Somewhat difficult.educTertiary or more -0,883 0,413 0,311 0,551
Somewhat difficult|Not difficult at all.educTertiary or more -0,988 0,372 0,294 0,471
Very difficult|Somewhat difficult.internetaccessNo 0,618 1,856 1,573 2,189
Somewhat difficult|Not difficult at all.internetaccessNo 0,384 1,468 1,213 1,777
economyIndonesia -0,405 0,667 0,548 0,813
economyLao PDR -0,862 0,422 0,345 0,516
economyMalaysia -0,219 0,804 0,646 0,999
economySingapore 0,275 1,317 1,037 1,672
economyVietnam 1,223 3,399 2,715 4,254
age 0,018 1,018 1,014 1,022
inc_qSecond 20% 0,283 1,327 1,120 1,572
inc_qMiddle 20% 0,370 1,448 1,220 1,719
inc_qFourth 20% 0,731 2,077 1,749 2,468
inc_qRichest 20% 1,126 3,084 2,571 3,699
emp_inOut of workforce -0,392 0,676 0,596 0,766
savedYes 0,540 1,715 1,523 1,933

OR lebih dari satu menunjukkan peningkatan odds responden untuk berada pada kategori financial resilience yang lebih tinggi, sedangkan OR kurang dari satu menunjukkan penurunan odds, dengan asumsi variabel lain konstan. Pada variabel non-proporsional, OR harus dibaca per threshold karena pengaruhnya tidak sama pada seluruh batas kategori respons.

Secara substantif, beberapa pola utama dapat ditarik dari tabel OR. Variabel negara menunjukkan bahwa terdapat perbedaan financial resilience antarnegara setelah variabel individu dikontrol. Usia memiliki asosiasi positif, sehingga semakin tinggi usia responden, semakin besar odds untuk berada pada kategori financial resilience yang lebih baik. Kuintil pendapatan memperlihatkan pola meningkat secara konsisten; kelompok pendapatan yang lebih tinggi memiliki odds lebih besar dibandingkan kelompok termiskin. Responden yang berada di luar angkatan kerja cenderung memiliki odds financial resilience lebih rendah, sedangkan responden yang memiliki tabungan cenderung memiliki odds lebih tinggi.

Untuk variabel non-proporsional, pendidikan, wilayah tempat tinggal, dan akses internet menunjukkan pola yang tidak konstan antar-threshold. Artinya, pengaruh ketiga variabel tersebut tidak cukup dijelaskan oleh satu koefisien umum sebagaimana diasumsikan pada model PO. Temuan ini memperkuat alasan penggunaan PPOM sebagai model akhir.

coef_plot <- coef_final |>
  dplyr::filter(Jenis != "Cutpoint") |>
  dplyr::mutate(
    Parameter = stringr::str_replace_all(Parameter, "`", ""),
    Parameter = stringr::str_replace_all(Parameter, "\\.", " pada "),
    Jenis = factor(Jenis, levels = c("Efek proporsional", "Efek non-proporsional"))
  )

ggplot2::ggplot(
  coef_plot,
  ggplot2::aes(
    x = reorder(Parameter, OR),
    y = OR,
    ymin = `CI 2.5%`,
    ymax = `CI 97.5%`,
    color = Jenis,
    shape = Keputusan
  )
) +
  ggplot2::geom_hline(yintercept = 1, linetype = "dashed", color = "#64748b", linewidth = 0.8) +
  ggplot2::geom_errorbar(width = 0.18, linewidth = 0.85, alpha = 0.9) +
  ggplot2::geom_point(size = 3.4) +
  ggplot2::coord_flip() +
  ggplot2::scale_color_manual(values = c("Efek proporsional" = "#1e3a8a", "Efek non-proporsional" = "#f97316")) +
  ggplot2::labs(
    title = "Odds Ratio Model Akhir",
    subtitle = "OR > 1 meningkatkan kecenderungan berada pada kategori financial resilience yang lebih tinggi",
    x = NULL,
    y = "Odds Ratio",
    color = "Jenis efek",
    shape = "Keputusan"
  ) +
  ggplot2::theme_minimal(base_size = 13) +
  ggplot2::theme(
    plot.title = ggplot2::element_text(face = "bold", size = 18, color = "#172033"),
    plot.subtitle = ggplot2::element_text(color = "#64748b"),
    legend.position = "bottom",
    panel.grid.minor = ggplot2::element_blank()
  )

3.10 Hasil Confusion Matrix

prob_final <- predict_probs_clm(model_final, df_model)
y_levels <- levels(df_model$financial_resilience)
pred_class <- make_pred_class(prob_final, y_levels)

class_metrics <- ordinal_classification_metrics(
  actual = df_model$financial_resilience,
  predicted = pred_class
)

class_metrics_show <- class_metrics |>
  dplyr::mutate(
    `Akurasi tepat` = pretty_percent(`Akurasi tepat`, accuracy = 0.01),
    `Akurasi toleransi satu tingkat` = pretty_percent(`Akurasi toleransi satu tingkat`, accuracy = 0.01),
    `Rata-rata jarak ordinal` = pretty_num(`Rata-rata jarak ordinal`, 3)
  ) |>
  tidyr::pivot_longer(cols = dplyr::everything(), names_to = "Metrik", values_to = "Nilai")

table_clean(class_metrics_show, "Tabel 14. Evaluasi klasifikasi ordinal")
Tabel 14. Evaluasi klasifikasi ordinal
Metrik Nilai
Akurasi tepat 52,45%
Akurasi toleransi satu tingkat 95,04%
Rata-rata jarak ordinal 0,525

Hasil evaluasi klasifikasi menunjukkan kemampuan prediksi tepat berada pada tingkat sedang. Namun, akurasi toleransi satu tingkat biasanya jauh lebih tinggi, yang berarti sebagian besar kesalahan prediksi hanya berbeda maksimal satu kategori ordinal dari kategori aktual. Oleh karena itu, model PPOM lebih tepat diposisikan sebagai model inferensial atau konfirmatori untuk menjelaskan asosiasi antarvariabel, bukan sebagai alat prediksi individual yang presisi.

conf_mat <- caret::confusionMatrix(
  data = factor(pred_class, levels = y_levels, ordered = TRUE),
  reference = df_model$financial_resilience
)

conf_tbl <- as.data.frame(conf_mat$table)

table_clean(conf_tbl, "Tabel 15. Confusion matrix aktual dan prediksi")
Tabel 15. Confusion matrix aktual dan prediksi
Prediction Reference Freq
Very difficult Very difficult 909
Somewhat difficult Very difficult 721
Not difficult at all Very difficult 110
Very difficult Somewhat difficult 493
Somewhat difficult Somewhat difficult 1152
Not difficult at all Somewhat difficult 453
Very difficult Not difficult at all 156
Somewhat difficult Not difficult at all 615
Not difficult at all Not difficult at all 750
ggplot2::ggplot(conf_tbl, ggplot2::aes(x = Reference, y = Prediction, fill = Freq)) +
  ggplot2::geom_tile(color = "white", linewidth = 1) +
  ggplot2::geom_text(ggplot2::aes(label = Freq), size = 5, fontface = "bold", color = "#172033") +
  ggplot2::scale_fill_gradientn(colors = c("#f8fbff", "#eaf2ff", "#8b5cf6", "#1e3a8a")) +
  ggplot2::labs(
    title = "Confusion Matrix Model Akhir",
    subtitle = "Perbandingan kategori aktual dan hasil prediksi",
    x = "Aktual",
    y = "Prediksi",
    fill = "Frekuensi"
  ) +
  ggplot2::theme_minimal(base_size = 13) +
  ggplot2::theme(
    plot.title = ggplot2::element_text(face = "bold", size = 18, color = "#172033"),
    plot.subtitle = ggplot2::element_text(color = "#64748b"),
    panel.grid = ggplot2::element_blank()
  )

4 Diskusi

Penelitian ini bertujuan mengonfirmasi hubungan antara karakteristik demografis, sosial-ekonomi, perilaku keuangan, akses digital, dan tingkat financial resilience di beberapa negara ASEAN menggunakan pendekatan regresi logistik ordinal. Secara umum, hasil analisis menunjukkan bahwa financial resilience tidak hanya berbeda antarindividu, tetapi juga memperlihatkan variasi antarnegara. Oleh karena itu, variabel economy dimasukkan sebagai kontrol negara dalam model akhir.

Model PO menunjukkan bahwa asumsi proportional odds tidak sepenuhnya terpenuhi. Dengan kata lain, pengaruh sebagian prediktor tidak konstan pada seluruh batas kategori financial resilience. Temuan ini menunjukkan bahwa model PO terlalu membatasi struktur hubungan antarvariabel. PPOM kemudian digunakan sebagai model akhir karena lebih fleksibel dalam menangkap variasi pengaruh prediktor pada setiap threshold kategori respons.

Hasil perbandingan model menunjukkan bahwa PPOM memberikan nilai AIC yang lebih rendah dibandingkan model PO. Uji LRT juga menunjukkan bahwa model yang lebih fleksibel memberikan peningkatan kecocokan yang signifikan. Dengan demikian, dari sisi konfirmatori, penggunaan PPOM dapat dibenarkan karena model ini lebih sesuai untuk menjelaskan hubungan antara prediktor dan financial resilience ketika asumsi proportional odds tidak sepenuhnya terpenuhi.

Secara substantif, terdapat beberapa pola penting. Pertama, konteks negara berperan dalam menjelaskan financial resilience. Perbedaan antarnegara dapat merepresentasikan variasi kondisi ekonomi, infrastruktur keuangan, kesempatan kerja, dan lingkungan sosial yang memengaruhi kemampuan individu memperoleh dana darurat. Kedua, usia berasosiasi positif dengan financial resilience. Individu yang lebih tua kemungkinan memiliki pengalaman ekonomi, jaringan sosial, atau akumulasi sumber daya yang lebih besar dibandingkan individu yang lebih muda.

Ketiga, tingkat pendapatan memiliki hubungan yang konsisten dengan financial resilience. Responden pada kuintil pendapatan lebih tinggi cenderung memiliki odds lebih besar untuk berada pada kategori financial resilience yang lebih baik dibandingkan responden pada kuintil pendapatan terendah. Temuan ini menguatkan bahwa kapasitas ekonomi rumah tangga merupakan faktor penting dalam kemampuan menghadapi kebutuhan dana darurat.

Keempat, status pekerjaan juga berhubungan dengan financial resilience. Responden yang berada di luar angkatan kerja cenderung memiliki financial resilience lebih rendah dibandingkan responden yang berada dalam angkatan kerja. Kelima, perilaku menabung terbukti berasosiasi positif dengan financial resilience. Tabungan dapat berfungsi sebagai buffer atau cadangan keuangan ketika individu menghadapi kebutuhan mendesak.

Keenam, pendidikan, wilayah tempat tinggal, dan akses internet muncul sebagai efek non-proporsional dalam model akhir. Artinya, pengaruh variabel-variabel tersebut tidak sama pada setiap batas kategori financial resilience. Untuk pendidikan, hasil ini menunjukkan bahwa perbedaan pendidikan tidak hanya memengaruhi financial resilience secara umum, tetapi efeknya dapat berbeda ketika membedakan kelompok yang sangat sulit memperoleh dana darurat dari kelompok lainnya dibandingkan ketika membedakan kelompok yang sudah lebih resilient. Demikian pula, akses internet dan wilayah tempat tinggal menunjukkan pola pengaruh yang tidak sepenuhnya konstan antarlevel respons. Hal ini mengindikasikan bahwa hubungan antara karakteristik sosial-digital dan financial resilience bersifat lebih kompleks daripada yang diasumsikan oleh model PO.

Dari sisi evaluasi model, hasil klasifikasi menunjukkan bahwa akurasi tepat model berada pada tingkat sedang. Namun, akurasi toleransi satu tingkat tinggi menunjukkan sebagian besar kesalahan prediksi masih berada dekat dengan kategori aktual. Dengan demikian, model ini lebih tepat digunakan sebagai model inferensial dan konfirmatori, bukan sebagai alat prediksi kategori individu yang presisi.

Keterbatasan utama penelitian ini adalah data yang digunakan bersifat observasional, sehingga hasil analisis tidak dapat langsung diinterpretasikan sebagai hubungan kausal. Selain itu, meskipun PPOM lebih fleksibel daripada PO, interpretasi efek non-proporsional perlu dilakukan dengan hati-hati karena koefisiennya berbeda pada setiap threshold respons.

5 Kesimpulan

Berdasarkan hasil analisis, financial resilience individu di beberapa negara ASEAN berkaitan dengan kombinasi faktor negara, demografis, sosial-ekonomi, perilaku keuangan, dan akses digital. Model PO tidak memenuhi asumsi proportional odds secara penuh, sehingga PPOM digunakan sebagai model akhir.

Secara simultan, model akhir signifikan dalam menjelaskan variasi financial resilience. Variabel economy, age, inc_q, emp_in, saved, educ, urbanicity_f2f, dan internetaccess memiliki peran dalam menjelaskan tingkat financial resilience. Pendapatan yang lebih tinggi, usia yang lebih tua, dan perilaku menabung cenderung berkaitan dengan financial resilience yang lebih baik, sedangkan berada di luar angkatan kerja berkaitan dengan financial resilience yang lebih rendah.

Temuan penting lainnya adalah bahwa educ, urbanicity_f2f, dan internetaccess memiliki efek non-proporsional pada model akhir. Hal ini menunjukkan bahwa pengaruh ketiga variabel tersebut berbeda pada setiap batas kategori financial resilience. Dengan demikian, PPOM memberikan pemahaman yang lebih kaya dibandingkan model PO karena mampu menangkap kompleksitas hubungan antarvariabel pada respons ordinal.

Secara keseluruhan, hasil penelitian ini mendukung pendekatan konfirmatori bahwa karakteristik sosial-ekonomi dan akses terhadap sumber daya berhubungan dengan kemampuan individu menghadapi kebutuhan keuangan darurat. Namun, karena data bersifat observasional, hasil ini perlu ditafsirkan sebagai asosiasi statistik, bukan bukti kausal.

6 Referensi

  1. Demirgüç-Kunt, A., Klapper, L., Singer, D., & Ansar, S. (2022). The Global Findex Database 2021: Financial Inclusion, Digital Payments, and Resilience in the Age of COVID-19. Washington, DC: World Bank.
  2. Esquivias, M. A., Sethi, N., Ramandha, M. D., & Jayanti, A. D. (2021). Financial inclusion dynamics in Southeast Asia: An empirical investigation on three countries. Business Strategy & Development, 4(2), 203–215.
  3. McCullagh, P. (1980). Regression models for ordinal data. Journal of the Royal Statistical Society: Series B, 42(2), 109–142.
  4. Williams, R. (2006). Generalized ordered logit/partial proportional odds models for ordinal dependent variables. The Stata Journal, 6(1), 58–82.
  5. Peterson, B., & Harrell, F. E. (1990). Partial proportional odds models for ordinal response variables. Journal of the Royal Statistical Society: Series C, 39(2), 205–217.
  6. Wang, H. (2024). Ordinal Logistic Regression Analysis in Effective Teaching Practices. Journal of Mathematics and Statistics, 20(1), 13–17.