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.
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")
| Keterangan | Nilai |
|---|---|
| Observasi awal | 5.424 |
| Observasi setelah preprocessing | 5.359 |
| Jumlah negara | 6 |
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)
| 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 |
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.
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.
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)). \]
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.
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.
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}. \]
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.
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.
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")
| 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)
| 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()
)
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")
| 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.
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)
| 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.
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")
| 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.
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)
| 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.
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")
| 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.
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")
| 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.
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")
| 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.
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)
| 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.
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)
| 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()
)
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")
| 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")
| 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()
)
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.
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.