Sebagai awalan, coretan ini berfokus ke pembelajaran (sehingga ukuran metrik evaluasi yang mungkin tidak terlalu bagus bisa diabaikan, makna diabaikan disini jangan terlalu terfokus pada nilai metrik evaluasi untuk coretan ini melainkan bagaimana step by step bagaimana mendapatkan interpretasi hingga metrik evaluasi apabila kita menggunakan regresi logistik).
Oh ya, coretan ini sebagai salah satu sarana untuk berbagi dan mungkin tak lupt dari kesalahan, sehingga kalau ada perbaikan atau kurang sesuai, silahkan bernada pada email kami: “achmadfauzan@uii.ac.id”
Analisis Regresi Logistik adalah metode statistika untuk memahami hubungan antara variabel independen/ prediktor/ bebas/ feature dan variabel dependen/ respon/ terikat/ target biner.
Makna biner dalam konteks analisis regresi logistik adalah bahwa variabel dependen hanya memiliki dua kemungkinan kategori atau nilai.
Contoh:
Ya (1) / Tidak (0) → Misalnya, apakah seseorang lulus ujian atau tidak.
Sakit (1) / Sehat (0) → Misalnya, apakah seseorang terkena penyakit tertentu atau tidak.
Membeli (1) / Tidak membeli (0) → Misalnya, apakah seseorang akan membeli produk atau tidak.
Pada regresi logistik, kita akan mengenal istilah kategori referensi. Kategori referensi merupakan kategori dasar. Cara menentukan kategori referensi diantaranya:
Kategori yang dianggap baseline standar dalam penelitian
Kategori paling umum
Kategori dengan makna khusus (misalnya tidak mendapatkan perlakukan).
Dalam regresi logistik biner, model digunakan untuk memperkirakan probabilitas suatu kejadian terjadi berdasarkan variabel independen. Variabel dependen biner biasanya memiliki dua nilai, seperti 0 dan 1.
Proses analisis regresi logistik melibatkan pembuatan model matematika yang memetakan nilai-nilai variabel independent ke probabilitas variabel dependent yang berada dalam rentang antara 0 dan 1. Salah satu fungsi yang digunakan pada model ini adalah logit atau log-odds untuk memodelkan hubungan.
Selain fungsi logit, pembaca bisa menggunakan fungsi hubung yang lain seperti probit, dll (silahkan membaca Agresti (link)).
Fungsi logit mengubah probabilitas ke dalam rentang nilai yang tidak terbatas. Tujuan fungsi logit adalah memungkinkan penggunaan metode statistika konvensional.
Metode yang digunakan adalah maximum likelihood estimation untuk menentukan parameter-model yang paling sesuai dengan data.
Distribusi yang diikuti oleh variabel dependen biner adalah distribusi Bernoulli.
Fungsi kepekatan peluang (PDF) dari distribusi Bernoulli digunakan dalam analisis regresi logistik.
\[f(y_i)=\pi (x_i)^{y_i} (1-\pi(x_i))^{1-y_i}, y_i = 0,1\] Keterangan
\(y_i\): Variabel respon ke-\(i\) (dengan nilai 0 atau 1)
\(\pi_i\): Peluang kejadian ke-\(i\).
Secara umum, model regresi logistik dapat ditulis
\[\mu = E[y] = \log \left[ \frac{\pi (x)}{1-\pi (x)} \right] = \beta_0 + \beta_1 X + \beta_2 X+ \cdots + \beta_p X_p \]
\[ \pi (x) = P(Y=1 | \pi(x)) \] dan
\[1 - \pi (x) = 1 - P(Y=1 | \pi(x)) = P (Y=0 | \pi(x))\]
atau dapat juga ditulis
\[\pi(x_i) = \frac{\exp(\beta_0 + \beta_1x_{1i} + \beta_2x_{2i}+\cdots + \beta_px_{pi})}{1+\exp(\beta_0 + \beta_1x_{1i} + \beta_2x_{2i}+\cdots + \beta_px_{pi}}\] Keterangan:
\(\pi(x_i)\): Peluang terjadinya kategori variabel respon.
\(x_{ji}\): variabel prediktor ke-\(j\).
\(p\): Banyaknya variabel prediktor.
\(\beta_0\): intercept.
\(\beta_0, \beta_1, \beta_2, \cdots, \beta_p\): koefisien regresi untuk setiap variabel prediktor.
Pemodelan Regresi Logistik Sederhana dengan variabel prediktor biner memerlukan reference category/ kategori pembanding/ kategori baseline. Kategori pembanding dikodekan sebagai \(0\), sedangkan kategori lainnya dikodekan sebagai \(1\).
Proses pengkodean ini merupakan transformasi variabel biner menjadi variabel numerik.
Data yang digunakan adalah data stillbirth di kabupaten Aceh Timur.
Stillbirth merupakan kelahiran bayi dalam keadaan tidak bernyawa yang telah mencapai umur kehamilan 20 minggu atau sebelum masa persalinan. Terdapat beberapa penyebab stillbirth yaitu infeksi selama kehamilan, kelainan atau cacat bawaan, kondisi kesehatan ibu, usia ibu, dan sebagainya.
Data diperoleh dari artikel dengan judul “Analisis Regresi Logistik Biner Untuk Menentukan Faktor Stillbirth Di Kabupaten Aceh Timur” (link artikel).
Data tersebut sudah kami siapkan dan dapat anda akses pada link berikut: (data).
data <- read.csv("data.csv", header = TRUE, sep = ",")
data <- data %>% select(-no) # Menghapus kolom "
head(data)
Keterangan:
\(Y\) : Status kejadian stillbirth (0: tidak terjadi stillbirth, 1: terjadi stillbirth)
\(X_1\): Infeksi selama kehamilan (0 = tidak terjadinya infeksi kehamilan, 1 = terjadinya infeksi kehamilan)
\(X_2\): Kelainan atau cacat bawaan (0 = tidak mengalami kelainan atau cacat bawaan, 1 = mengalami kelainan atau cacat bawaan)
\(X_3\); Kondisi Ibu (0 = preklamsia, 1 = diabetes)
\(X_4\): Usia Ibu
## Rows: 55
## Columns: 5
## $ Y <int> 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0…
## $ X1 <int> 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0…
## $ X2 <int> 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1…
## $ X3 <int> 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0…
## $ X4 <int> 33, 38, 31, 32, 24, 24, 26, 36, 30, 25, 40, 31, 39, 25, 26, 38, 31,…
data <- data %>%
mutate(across(c(Y, X1, X2,X3), as.factor)) # Mengubah hanya kolom Y, X1, dan X2 menjadi faktor
glimpse(data) # Cek perubahan tipe data
## Rows: 55
## Columns: 5
## $ Y <fct> 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0…
## $ X1 <fct> 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0…
## $ X2 <fct> 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1…
## $ X3 <fct> 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0…
## $ X4 <int> 33, 38, 31, 32, 24, 24, 26, 36, 30, 25, 40, 31, 39, 25, 26, 38, 31,…
Name | data |
Number of rows | 55 |
Number of columns | 5 |
_______________________ | |
Column type frequency: | |
factor | 4 |
numeric | 1 |
________________________ | |
Group variables | None |
Variable type: factor
skim_variable | n_missing | complete_rate | ordered | n_unique | top_counts |
---|---|---|---|---|---|
Y | 0 | 1 | FALSE | 2 | 1: 30, 0: 25 |
X1 | 0 | 1 | FALSE | 2 | 1: 30, 0: 25 |
X2 | 0 | 1 | FALSE | 2 | 0: 37, 1: 18 |
X3 | 0 | 1 | FALSE | 2 | 0: 41, 1: 14 |
Variable type: numeric
skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 |
---|---|---|---|---|---|---|---|---|---|
X4 | 0 | 1 | 30.47 | 7.52 | 2 | 26 | 31 | 36 | 40 |
Metode Holdout Sample digunakan untuk membagi dataset menjadi training data dan testing data.
Training data/ data latih digunakan untuk melatih model, sedangkan testing data/ data uji digunakan untuk mengevaluasi performa prediksi model.
Training data harus lebih banyak dibandingkan dengan testing data.
Pembagian dataset biasanya dinyatakan dalam bentuk proporsi atau persentase (misalnya \(0.9\) atau \(90\%\) untuk training dan \(0.1 \text{ atau} 10\%\) untuk testing).
Pembagian data dilakukan secara acak menggunakan random sampling.
Jika variabel respon bersifat kategorik, disarankan menggunakan stratified random sampling agar distribusi kategori tetap seimbang. Berikut sintaksnya.
library(dplyr)
set.seed(12)
intrain <- initial_split(data = data,prop = 0.9,strata =Y)
data_train <- training(intrain)
data_train
## [1] "Level, angka pertama adalah kelas positif/ kategori referensinya/ baselinnya"
## [1] "0" "1"
levels()
. Ilustatrasinya adalah sebagai
berikut.## [1] "0" "1"
## [1] "0" "1"
## [1] "0" "1"
## [1] "0" "1"
Berdasarkan output diatas, penjelasannya adalah sebagai berikut.
Pada variabel \(Y\), Kategori pembanding-nya/ kategori referensinya adalah “0” karena berada di urutan pertama (0: tidak terjadi stillbirth, 1: terjadi stillbirth)
Pada variabel \(X_1\), Kategori pembanding-nya/ kategori referensinya adalah “0” karena berada di urutan pertama (0 = tidak terjadinya infeksi kehamilan, 1 = terjadinya infeksi kehamilan).
Pada variabel \(X_2\), Kategori pembanding-nya/ kategori referensinya adalah “0” karena berada di urutan pertama (0 = tidak mengalami kelainan atau cacat bawaan, 1 = mengalami kelainan atau cacat bawaan).
Pada variabel \(X_3\), Kategori pembanding-nya/ kategori referensinya adalah “0” karena berada di urutan pertama (0 = preklamsia, 1 = diabetes).
kita bisa merubah Kategori pembanding dengan fungsi relevel dan mengisi argumen ref dengan kategori yang akan dijadikan sebagai kategori pembanding. Berikut ilustrasinya
reglog <- glm(Y=="1"~X1+X2+X3+X4, family = binomial(link = "logit"), data = data_train)
summary(reglog)
##
## Call:
## glm(formula = Y == "1" ~ X1 + X2 + X3 + X4, family = binomial(link = "logit"),
## data = data_train)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.248445 1.774764 -1.267 0.2052
## X11 2.921707 1.366034 2.139 0.0324 *
## X21 2.118471 1.408886 1.504 0.1327
## X31 2.675139 1.256575 2.129 0.0333 *
## X4 -0.009075 0.044503 -0.204 0.8384
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 67.417 on 48 degrees of freedom
## Residual deviance: 51.821 on 44 degrees of freedom
## AIC: 61.821
##
## Number of Fisher Scoring iterations: 5
\[Logit [\hat{\pi} (X)] = -2.248445 + 2.921707 X_{1(1)} + 2.118471X_{2(1)} + 2.675139 X_{3(1)} + 0.01942 X_4\]
sintaks Y==“1” berarti kita menenetapkan kelas positifnya adalah “1”atau \(P(Y=1|\pi(x))\), sedangkan kelas negatifnya adalah 0 atau \(P(Y=0|\pi(x))\)
Jika kita tidak mendefinisikan dengan sintaks Y==“1” maka secara default yang akan menjadi kelas positif adalah kategori pertama yang ditunjukkan dari output fungsi levels. Dalam kasus variabel respon Y, secara default yang menjadi kelas positif adalah 0 Berikut cara mengecek kategori pertama dari levels.
## [1] "0" "1"
sintaks ~X1+X2+X3+X4 menandakan bahwa X1, X2, X3, dan X4 adalah variabel prediktor.
sintaks family(link = "logit"
) digunakan untuk
menandakan kita menggunakan regresi logistik dengan link function adalah
logit.
untuk mengeluarkan nilai dugaan koefisien, Selang kepercayaan (Confidence Interval) dan p-value dapat menggunakan fungsi parameters dari package parameters.
Intercept umumnya dapat diinterpretasikan dengan melakukan transformasi terlebih dahulu ke dalam bentuk peluang dengan mengatur nilai peubah prediktor sama dengan 0. Perhitungan ini bisa menggunakan fungsi predict dan argumen dari predict yaitu type=“response”.
Koefisien dari prediktor X1 [1] (\(\beta_1\)) adalah 2.921706941 (positif) berarti saat seorang ibu memiliki infeksi kehamilan (X1) maka kemungkinan bayi akan terkena stillbirth semakin besar. \(p-val = 0.03244989 < 0.05 = \alpha\) untuk prediktor X1 [1] yang berarti sudah cukup bukti untuk menolak \(H_0:\beta_1 = 0\) yang berarti X1 [1] berpengaruh terhadap \(Y\). 95% CI untuk (\(\beta_1\)) dapat diinterpretasikan jika sudah kita transformasi ke dalam Odd-Ratio
Koefisien dari prediktor X2 [1] (\(\beta_2\)) adalah 2.118471137 (positif) berarti saat seorang ibu memiliki kelainan/ cacat bawaan maka kemungkinan bayi akan terkena stillbirth semakin besar. \(p-val = 0.13267149 > 0.05 = \alpha\) untuk prediktor X2 [1] yang berarti tidak cukup bukti untuk menolak \(H_0:\beta_2 = 0\) yang berarti X2 [1] tidak berpengaruh signifikan terhadap \(Y\).
Koefisien dari prediktor X3 [1] (\(\beta_3\)) adalah 2.675139441 (positif) berarti saat seorang ibu memiliki diabetes maka kemungkinan bayi akan terkena stillbirth semakin besar. \(p-val = 0.03326147 < 0.05 = \alpha\) untuk prediktor X3 [1] yang berarti cukup bukti untuk menolak \(H_0:\beta_3 = 0\) yang berarti X3 [1] berpengaruh signifikan terhadap \(Y\).
Koefisien dari prediktor X4 (\(\beta_4\)) adalah -0.009075333 (negatif) berarti saat seorang ibu semakin berumumr maka kemungkinan bayi akan terkena stillbirth semakin kecil, kendati demikian \(p-val = 0.83841197 > 0.05 = \alpha\) untuk prediktor X4 yang berarti tidak cukup bukti untuk menolak \(H_0:\beta_4 = 0\) yang berarti X4 tidak berpengaruh signifikan terhadap \(Y\).
Untuk pembelajaran ini variabel yang tidak signifikan tetap
digunakan dengan pertimbangan variabel tersebut penting dalam penelitian
dan sebagai bahan pembelajaran. Sementara untuk penelitian riilnya, anda
dapat mempertimbangakan untuk tetap menggunakan atau dilakukan eliminasi
menggunakan stepwise
.
Untuk mendapatkan nilai Odds-Ratio dari koefisien dan intercept kita dapat menerapkan rumus berikut
\[\text{Odds-Ratio} (\beta) = \exp (\beta) \] sehingga
## (Intercept) X11 X21 X31 X4
## 0.1055633 18.5729634 8.3184101 14.5143736 0.9909657
atau lebih mudah jika kita menggunakan argumen
exponentiate = TRUE
pada fungsi parameters. Selain nilai
koefisien dan intercept berubah menjadi Odds-Ratio, nilai standard error
dan selang kepercayaan (CI) koefisien juga berubah menyesuaikan. Namun,
nilai statistik z dan p-value tidak berubah.
tidy_parameters(reglog,conf.int = TRUE,conf.level = 0.95,ci_method="wald",exponentiate = TRUE) %>%
mutate(across(where(is.numeric),function(x) round(x,2) ))
Penjelasan
Odds-Ratio dari prediktor X1 [1] (\(\beta_1\)) adalah 18.57 berarti seorang ibu yang memiliki infeksi kehamilan mempunyai odds 1757 % (\([18.57-1]\times 100\% = 17.57 \times 100\% = 1757 \%\)) lebih tinggi dibandingkan dengan seorang ibu yang tidak memiliki infeksi kehamilan dalam potensi terjadinya stillbirth.
Odds-Ratio dari prediktor X2 [1] (\(\beta_2\)) adalah 8.32 berarti seorang ibu yang memiliki cacat bawaan mempunyai odds 732 % (\([8.32-1]\times 100\% = 7.32 \times 100 \% = 732 \%\)) lebih tinggi dibandingkan dengan seorang ibu yang tidak memiliki cacat bawaan dalam potensi terjadinya stillbirth.
Odds-Ratio dari prediktor X3 [1] (\(\beta_3\)) adalah 14.51 berarti seorang ibu yang memiliki diabetes mempunyai odds 578 % (\([6.78-1]\times 100\% = 5.14 \times 100 \% = 578 \%\)) lebih tinggi dibandingkan dengan seorang ibu yang tidak memiliki diabetes dalam potensi terjadinya stillbirth.
Odds-Ratio dari prediktor X4 (\(\beta_4\)) adalah 0.99 berarti semakin usia seorang ibu hampir tidak ada pengaruh. Jika dihitung nilai odds nya sebesar \(1 \% (1-0.99) \times 100 \% = 0.01 \times 100 \% = 1 \%\) lebih rendah dengan peningkatan umur.
Selanjutnya, misal kita hendak Peluang terjadinya stillbirth
predict(object = reglog, newdata = data.frame(X1 = "0", X2 = "0", X3 = "0", X4 = 40),type = "response")
## 1
## 0.06840462
Berdasarkan hasil diatas, diperoleh nilai peluang terjadinya stillbirth sebesar 0.06840462. Secara matematis dapat dihitung sebagai berikut. Persamaan probabilitas kejadian \(Y = 1\) dalam regresi logistik adalah:
\[\begin{align} \pi(x) &= \frac{\exp(\beta_0 + \beta_1 X_1 + \beta_2 X_2 + \beta_3 X_3 + \beta_4 X_4 )}{1 + \exp(\beta_0 + \beta_1 X_1 + \beta_2 X_2 + \beta_3 X_3 + \beta_4 X_4} \\ &= \frac{\exp(-2.248445 + 2.921707[0] + 2.118471 [0] + 2.675139[0] - 0.009075[40] )}{1 + \exp(-2.248445 + 2.921707[0] + 2.118471 [0] + 2.675139[0] - 0.009075[40] )} \\ &= 0.068405462 \end{align}\]
predict(object = reglog, newdata = data.frame(X1 = "1", X2 = "1", X3 = "1", X4 = 40),type = "response")
## 1
## 0.9939634
Berdasarkan hasil diatas, diperoleh nilai peluang terjadinya stillbirth sebesar 0.09833882. Secara matematis dapat dihitung sebagai berikut.
Persamaan probabilitas kejadian \(Y = 1\) dalam regresi logistik adalah:
\[\begin{align} \pi(x) &= \frac{\exp(\beta_0 + \beta_1 X_1 + \beta_2 X_2 + \beta_3 X_3 + \beta_4 X_4 )}{1 + \exp(\beta_0 + \beta_1 X_1 + \beta_2 X_2 + \beta_3 X_3 + \beta_4 X_4} \\ &= \frac{\exp(-2.248445 + 2.921707[1] + 2.118471 [1] + 2.675139[1] - 0.009075[40] )}{1 + \exp(-2.248445 + 2.921707[1] + 2.118471 [1] + 2.675139[1] - 0.009075[40] )} \\ &= 0.993963475 \end{align}\]
Goodness-of-fits Model biasa menggunakan ukuran-ukuran atau metrik-metrik tertentu yang didasarkan dari log-likehood. Ukuran AICc, BIC, RMSE biasanya digunakan untuk menentukan model terbaik dari beberapa model yang tersedia. Jika hanya satu model saja yang tersedia ukuran ini tidak bisa digunakan. Semakin kecil nila dari AICc, BIC, RMSE maka semakin baik pula modelnya.
Selain itu ada juga ukuran \(R^2\) yang bisa digunakan jika model yang tersedia hanya satu. Nilai berkisar antara 0 dan 1. Semakin mendekati 1 nilai semakin baik modelnya. Namun, dalam regresi logistik, \(R^2\) tidak didefinisikan secara langsung seperti pada regresi linear karena modelnya berbasis probabilitas (likelihood), bukan selisih kuadrat (sum of squares). Sebagai gantinya, beberapa pseudo-R² dikembangkan untuk regresi logistik, salah satunya adalah Tjur’s R².
Tjur’s R² (juga disebut sebagai Coefficient of Discrimination) mengukur perbedaan rata-rata probabilitas yang diprediksi antara kelas positif dan kelas negatif.
Formula \(Tjur's R^2\)
\[R^2_{Tjur}=\bar{\pi}_1-\bar{\pi}_0\]
\(\bar{\pi}_1\): rata-rata probabilitas prediksi untuk kelas sukses (\(Y=1\)).
\(\bar{\pi}_0\): rata-rata probabilitas prediksi untuk kelas \(Y=0\)
Semakin tinggi nilai \(R^2_{Tjur}\), semakin baik model dalam membedakan antara kelas 0 dan kelas 1. Jika \(R^2_{Tjur}\) = 0, maka model tidak memiliki daya diskriminasi. Jika \(R^2_{Tjur}\) mendekati 1, maka model sangat baik dalam memisahkan kelas.
Alternatif \(pseudo-R^2\) dalam regresi logistik
Metode | Interpretasi |
---|---|
McFadden’s R² | Menggunakan perbandingan likelihood antara model penuh dan model kosong. Nilai 0.2 - 0.4 dianggap baik. |
Cox & Snell’s R² | Berdasarkan likelihood ratio, tetapi nilainya tidak mencapai 1. |
Nagelkerke’s R² | Koreksi dari Cox & Snell’s R², sehingga bisa mencapai maksimum 1. |
Kemudian, Goodness-of-fits juga bisa menggunakan uji hipotesis statistik yaitu Likelihood Ratio Test. Secara umum, uji ini membandingkan dua model regresi dan menyimpulkan model mana yang terbaik.
Jika kita hanya memliki satu model saja maka model pembandingnya adalah null-model atau model tanpa variabel prediktor dan hanya memuat intercept saja.
Hipotesis dari Likelihood Ratio Test adalah sebagai berikut:
\[\begin{align} H_0 &: \beta_1 = \beta_2 = \beta_3 = \beta_4 \text{ null model fit (cocok untuk data)} \\ H_1 &: \exists j, \beta_j \neq 0, j=1,2,3,4 \text{ model yang diusulkan fit (cocok untuk data)} \end{align}\]
Likelihood Ratio Test Statistics \(G\) didefinisikan
\[G=-2 \cdot \log \left( \frac{L_0}{L_1}\right)\]
Di bawah hipotesis nol, \(G\) mengikuti distribusi chi-squared dengan derajat kebebasan yang sama dengan perbedaan jumlah parameter yang diduga pada kedua model. \(L_0\) adalah likelihood dari data pada model nol dan \(L_1\) adalah likelihood dari data pada model yang diusulkan.
Jika likelihood ratio test statistic \(G\) cukup besar, maka kita menolak hipotesis nol dan memilih hipotesis alternatif, yang menunjukkan bahwa parameter tambahan dalam model yang diusulkan secara signifikan meningkatkan fit (kecocokan untuk data).
Berikut adalah sintaksnya.
## Only one model was provided, however, at least two are required for
## comparison.
## Fitting a null-model as reference now.
Berdasarkan hasil diatas, \(H_0\) ditolak atau model yang diusulkan fit (cocok untuk data).
Berikut adalah sintaks untuk mendapatkan prediksi regresi logistik menggunakan testing data
## 1 2 3 4 5 6
## 0.9555136 0.9555136 0.3877723 0.3791901 0.9558978 0.4117206
Hasil prediksi dari regresi logistik berupa nilai peluang, semakin
besar nilai peluangnya maka semakin besar kemungkinan hasil prediksinya
adalah kelas positifnya atau dalam hal ini adalah terjadi
stillbirth. Kemudian kita akan satukan hasil prediksi ini
dengan kolom \(Y\) pada data testing
dalam bentuk data.frame. Kita definsikan kolom truth
adalah
nilai aktual dari data testing variabel \(Y\) data yang kita miliki.
untuk melakukan evaluasi performa prediksi, maka nilai peluang dari hasil prediksi regresi logistik harus kita konversi menjadi nilai kelas asal yaitu “1” dan “0”. Caranya adalah dengan menentukan suatu threshold tertentu pada nilai peluangnya. Sehingga threshold itulah yang menentukan hasil prediksi mana yang menjadi kelas “1” atau “0”. Berikut adalah sintaksnya.
Umumnya nilai threshold yang digunakan adalah \(0.5\), nilai threshold ini bisa kita ganti berdasarkan subjektivitas pengguna ataupun dengan metode-motode optimalisasi threshold.
threshold = 0.5
pred_reglog <- pred_reglog %>%
mutate(estimate=if_else(estimate_prob>threshold,"1","0")) %>% #kategorisasi
mutate(estimate=factor(estimate,levels=c("1","0"))) %>% # ubah ke factor
# karena positive class dataset adalah 0 kita perlu rubah dulu ke 1
mutate(truth = factor(truth,levels=c("1","0"))) # ubah kelas positif menjadi 1
pred_reglog
Hasil prediksi ini biasanya kita evaluasi dengan suatu nilai metrik tertentu. Sebelum ke metrics tersebut, kita akan mengenal confusion matrix yang menjadi dasar perhitungan metrik-metrik tersebut. Berikut adalah komponen dari confusion matrix.
Berikut sintaks untuk menghitung CM.
confussion_matrix <- pred_reglog %>% conf_mat(truth=truth,estimate=estimate)
autoplot(confussion_matrix,type = "heatmap")+
scale_fill_viridis_c(direction = -1,option = "mako",alpha = 0.4)
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
Dalam Confusion Matriks, terdapat 4 komponen, yakni sebagai berikut.
TRUE POSITIVE (TP): Banyaknya amatan kelas positif yang hasil prediksi modelnya juga kelas positif
TRUE NEGATIVE (TN): Banyaknya amatan kelas negatif yang hasil prediksi modelnya juga kelas negatif
FALSE NEGATIVE (FN): Banyaknya amatan kelas negatif yang hasil prediksi modelnya kelas positif
FALSE POSITIVE (FP): Banyaknya amatan kelas positif yang hasil prediksi modelnya kelas negatif.
Dari 4 komponen tersebut, dapat dihitung beberapa ukuran/ metrik evaluasi yakni
Accuracy(Akurasi) adalah ukuran banyaknya hasil prediksi model yang benar dari keseluruhan hasil prediksi model.
Rumus
\[\text{Accuracy} = \frac{TP+TN}{TP+TN+FP+FN}\]
Precision (Presisi) adalah proporsi prediksi kelas positif yang benar dari total kelas positif yang diprediksi.
Rumus
\[\text{Precision} = \frac{TP}{TP+FP}\]
Recall adalah proporsi kelas positif yang diprediksi benar dari total kelas positif yang sebenarnya.
Rumus
\[\text{Recall} = \frac{TP}{TP+FN}\]
F1-Score adalah rata-rata harmonik dari presisi dan recall. Metric ini mempertimbangkan keseimbangan antara precision dan recall.
Rumus
\[\text{F1} = 2 \times \frac{\text{Precision}\times \text{ Recall} } {\text{Precision} + \text{ Recall}}\]
Specificity mengukur proporsi kelas negatif yang diprediksi benar dari total kelas negatif yang sebenarnya.
Rumus
\[\text{Specificity} = \frac{TN}{TN+FP}\]
FPR mengukur proporsi FALSE POSITIVE dari total kelas negatif sebenarnya.
Rumus
\[\text{FPR} = 1 - \text{Specificity} = \frac{FP}{TN+FP}\]
FNR mengukur proporsi FALSE NEGATIVE dari total kelas positif sebenarnya.
Rumus
\[\text{FNR} = \frac{FN}{TP+FN}\]
MCC adalah ukuran kualitas klasifikasi biner, mempertimbangkan keempat elemen confusion matrix.
Rumus
\[\text{MCC} = \frac{TP \times TN - FP \times FN}{\sqrt{(TP+FP)(TP+FN)(TN+FP)(TN+FN)}}\]
Balanced Accuracy adalah metrik evaluasi yang berguna ketika dataset memiliki ketimpangan (imbalance) di antara kelas-kelas yang berbeda. Metrik ini memberikan akurasi yang seimbang antara kelas mayoritas dan minoritas.
Rumus
\[\text{Balanced Accuracy} = \frac{\text{Specificity} + \text{Sensitivity}}{2}\]
Kesemua metriks tersebut dapat dikeluarkan menggunakan sintaks berikut.
atau bisa juga ditampilkan salah satu saja seperti berikut.
atau bisa juga lebih dari satu
multi_metric <- metric_set(accuracy,sensitivity,specificity,bal_accuracy,mcc,f_meas)
pred_reglog %>%
multi_metric(estimate = estimate,truth = truth)
Evaluasi performa prediksi juga bisa didapatkan dengan menggunakan
nilai peluang hasil prediksi yang didapatkan dari regresi logistik.
Nilai peluang tersebut pada langkah sebelumnya disimpan dalam kolom
estimate_prob
.
Berdasarkan dua output diatas, kita bisa melihat bahwa kurva ROC dibentuk berdasarkan metrik sensitivity dan specificity yang dihitung dari berbagai macam kemungkinan threshold. Oleh karena itu, kurva ROC ini juga sering digunakan untuk mendapatkan threshold optimal berdasarkan sensitivity dan specificity.
Kurva ROC ini biasanya digunakan untuk menentukan model dengan performa prediksi terbaik. Namun, pada ilustrasi ini kita hanya menggunakan satu model sehingga kurva ROC ini kurang bisa digunakan. Tetapi, terdapat metrik yang berbasiskan kurva roc yang bisa digunakan tanpa membandingkan dengan model lain yaitu AREA Under Curve (AUC).
Penentuan Treshold Optimal sifatnya adalah optional, umumnya Treshold yang digunakan sebesar 0.5. Pada kali ini kita akan mencoba mendapatkan threshold optimal berdasarkan sensitivity dan specificity menggunakan Youden’s J statistic yang didefinisikan sebagai berikut.
\[\text{Youden's J Statistics = sensitivity + specificity - 1}\] Semakin mendekati 1 nilainya maka semakin baik thresholdnya dan semakin nilainya mendekati 0 semakin buruk thresholdnya. Jika kita terapkan pada sintaks adalah sebagai berikut.
kemudian karena kita mencari Youden’s J statistic yang mendekati satu
berarti sama saja kita mencari nilai threshold yang Youden’s J statistic
paling maksimum. Kita bisa mendapatkan nilai maksimum ini dengan bantuan
fungsi slice_max
optimal_thresh <- kurva_roc %>%
mutate(youden_index=sensitivity+specificity-1) %>%
slice_max(order_by = youden_index)
optimal_thresh
Kemudian hasil prediksi dengan threshold optimal bisa didapatkan dengan sintaks berikut
pred_reglog2 <- data.frame(estimate_prob=pred_reglog0,truth=data_test$Y)
threshold2 = optimal_thresh %>% pull(.threshold)
pred_reglog2 <- pred_reglog2 %>%
mutate(estimate=if_else(estimate_prob>threshold2,"1","0")) %>%
mutate(estimate=factor(estimate,levels=c("1","0"))) %>%
# karena positive class dataset adalah 0 kita perlu rubah dulu ke 1
mutate(truth = factor(truth,levels=c("1","0")))
pred_reglog2
Kemudian jika kita bandingkan antara threshold 0.5 dengan threshold optimal pada beberapa metric maka hasilnya adalah sebagai berikut.
res_metric2 <- pred_reglog2 %>%
multi_metric(truth = truth,estimate = estimate) %>%
mutate(threshold=threshold2) %>%
relocate(threshold,.after = .metric)
res_metric <- pred_reglog %>%
multi_metric(truth = truth,estimate = estimate) %>%
mutate(threshold=threshold) %>%
relocate(threshold,.after = .metric)
res_metric2 %>%
bind_rows(res_metric) %>%
select(-.estimator) %>%
pivot_wider(id_cols = .metric,names_from = threshold,
names_prefix ="thres=",
values_from = .estimate)
untuk mengilustrasikan prediksi pada data baru, kita akan membuat suatu data baru “buatan” dengan mengambil sampel acak dari data yang kita miliki. Data baru bisanya tidak memuat variabel response sehingga kita akan hilangkan kolom \(Y\).
## 1 2 3 4 5 6 7
## 0.38132885 0.07379667 0.59237109 0.61193519 0.59237109 0.40952425 0.60977789
## 8 9 10
## 0.38992906 0.41392044 0.39642476
pred_data_baru_df <- data.frame(estimate=pred_data_baru) %>%
mutate(estimate=if_else(estimate>threshold2,"1","0")) %>%
mutate(estimate=factor(estimate,levels=c("0","1")))
pred_data_baru_df
Alhamdulillah, selesai