Saat ini sedang ramai-ramainya mengenai pasien covid-19 mengenai kondisi pasien yaitu hidup/sembuh atau meninggal. Nah kali ini kita akan membahas mengenai regresi logistik yang dapat diterapkan untuk analisis harapan hidup/sembuh pasien covid-19 seperti pengolahan data menggunakan package dplyr untuk melihat analisis awal. Package dplyr tersebut sangat berguna sekali untuk mengolah data numerik menjadi range / kategorikal. Pembahasan mengenai analisis Regresi logistik hampir sama dengan regresi linear dan berganda namun menggunakan bersifat kategorikal/dikotomi. Dikotomi yang dimaksud adalah skala data nominal dengan dua kategori misalnya: ya dan Tidak, Baik dan Buruk atau Tinggi dan Rendah . Pada regresi logistik ada 2 yaitu
- jika variabel tak bebas memiliki dua kategori, maka disebut regresi logistik biner (binary regression logistic).
- jika variabel tak bebas memiliki lebih dari dua kategori, maka disebut regresi logistik multinomial (multinomial/polychotomous logistic regression).
Kita bahas mengenai jenis-jenis variabel yang secara garis besar dibagi menjadi 2 yaitu kategorikal dan kontinue
Variabel Kategorikal
Contents
Variabel kategorikal merupakan variabel hitung yang tidak memenuhi sifat operasi aritmatik. Variabel kategorikal sering disebut sebagai variabel kualitatif.
- Nominal: variabel kategorikal yang nilainya tidak merepresentasikan urutan. Contoh dari variabel nominal ialah variabel yang memiliki 2 nilai, yaitu 0 dan 1, dimana 0 merepresentasikan laki-laki dan 1 merepresentasikan perempuan.
- Ordinal : variabel kategorikal yang nilainya merepresentasikan urutan. Urutan pada variabel ordinal terjadi secara
alamiah. Contoh dari variabel ordinal ialah tingkat luka yang dialami dalam kecelakaan (1: ringan, 2: sedang, dan 3: Berat).
Variabel Kontinu
Variabel Kontinu merupakan variabel yang memiliki nilai-nilai yang terdapat dalam suatu selang/interval bilangan real. Contoh variabel kontinu adalah harga kendaran.
Setelah kalian pahami mengenai jenis variabel, kita lanjutkan mengenai asumsi pada regresi logistik yaitu
- Tidak membutuhkan hubungan linier antara variabel independen dengan variabel dependen.
- Variabel independen tidak memerlukan asumsi multivariate normality.
- Asumsi homokedastisitas tidak diperlukan
- Variabel bebas tidak perlu diubah ke dalam bentuk metrik (interval atau skala ratio).
- Variabel dependen harus bersifat dikotomi
- Variabel independen tidak harus memiliki keragaman yang sama antar kelompok variabel
- Kategori dalam variabel independen harus terpisah satu sama lain atau bersifat eksklusif
Persamaan umum regresi logistik yaitu diturunkan dari persamaan
Sehingga persamaan umum menjadi berikut
Model regresi logistik termasuk kategori Generalized Linear Models/GLM yang digunakan untuk memecahkan masalah peubah respon kategorik (misalnya biner), dengan menggunakan fungsi penghubung (link function) tertentu sehingga diperoleh suatu model yang mampu menganalisa hubungan antara peubah respon kategorik (Dependen Variabel) dengan satu atau beberapa peubah penjelas (Independen Variabel).
Package
Pada analisis regresi logistik yang akan kita gunakan tidak membutuhkan package khusus karena sudah ada function defaultnya hanya butuh package dplyr untuk sedikit mengolah data menjadi kategorikal
Dataset
Dataset yang akan kita gunakan untuk analisis regresi logistik adalah data 100 pasien Covid-19 (data dummy bukan asli yaaa) pasien-covid-19 yang sedang dirawat yaitu mengenai umur dan kondisi (hidup atau meninggal). Dataset tersebut disimpan dalam bentuk csv dengan nama file pasien-covid-19.csv berikut tampilan dataset tersebut
library(dplyr) covid <-read.csv('dataset/pasien-covid-19.csv') print(covid)
hasil
> library(dplyr) > covid <-read.csv('dataset/pasien-covid-19.csv') > print(covid) no kondisi usia 1 1 hidup 20 2 2 hidup 21 3 3 hidup 23 4 4 hidup 25 5 5 hidup 25 6 6 hidup 27 7 7 meninggal 26 8 8 hidup 29 9 9 hidup 28 10 10 hidup 29 11 11 hidup 30 12 12 hidup 30 13 13 hidup 30 14 14 hidup 30 15 15 hidup 31 16 16 meninggal 31 17 17 hidup 32 18 18 hidup 32 19 19 hidup 33 20 20 hidup 34 21 21 hidup 34 22 22 hidup 34 23 23 meninggal 34 24 24 hidup 34 25 25 hidup 34 26 26 hidup 35 27 27 hidup 35 28 28 hidup 36 29 29 meninggal 36 30 30 hidup 36 31 31 hidup 37 32 32 meninggal 37 33 33 hidup 37 34 34 hidup 38 35 35 hidup 38 36 36 hidup 39 37 37 meninggal 39 38 38 hidup 40 39 39 meninggal 40 40 40 hidup 41 41 41 hidup 41 42 42 hidup 41 43 43 hidup 42 44 44 hidup 42 45 45 meninggal 43 46 46 hidup 43 47 47 hidup 43 48 48 meninggal 43 49 49 hidup 44 50 50 hidup 44 51 51 meninggal 44 52 52 meninggal 44 53 53 hidup 45 54 54 meninggal 45 55 55 hidup 46 56 56 meninggal 46 57 57 hidup 47 58 58 hidup 47 59 59 meninggal 47 60 60 hidup 48 61 61 meninggal 48 62 62 meninggal 48 63 63 hidup 49 64 64 hidup 49 65 65 meninggal 49 66 66 hidup 50 67 67 meninggal 50 68 68 hidup 51 69 69 hidup 52 70 70 meninggal 52 71 71 meninggal 53 72 72 meninggal 53 73 73 meninggal 54 74 74 hidup 55 75 75 meninggal 55 76 76 meninggal 55 77 77 meninggal 56 78 78 meninggal 56 79 79 meninggal 56 80 80 hidup 57 81 81 hidup 57 82 82 meninggal 57 83 83 meninggal 57 84 84 meninggal 57 85 85 meninggal 57 86 86 hidup 58 87 87 meninggal 58 88 88 meninggal 58 89 89 meninggal 59 90 90 meninggal 59 91 91 hidup 60 92 92 meninggal 60 93 93 meninggal 61 94 94 meninggal 62 95 95 meninggal 62 96 96 meninggal 63 97 97 hidup 64 98 98 meninggal 64 99 99 meninggal 65 100 100 meninggal 69 >
Variabel indepeden umur sedangkan dependen kondisi (kategorikal)
Pembagian kategori usia
Untuk mempermudah dalam analisis data, maka perlu dibuat sebuah range umur serta berapa frekuensi yang muncul pada kategori tersebut, misalkan kita punya aturan sebagai berikut
Untuk pengolahan hal tersebut, kita bisa menggunakan function ifelse dan dilanjut dengan group_by seperti berikut
a <- covid %>% mutate(kategori=ifelse(usia >=20 & usia<=29,'A', ifelse(usia >=30 & usia<=39,'B', ifelse(usia >=40 & usia<=49,'C','D')))) hidup_meninggal <-a %>% group_by(kategori,kondisi) %>% summarise(frekuensi=n()) print(hidup_meninggal)
hasil
kategori kondisi frekuensi <chr> <fct> <int> 1 A hidup 9 2 A meninggal 1 3 B hidup 22 4 B meninggal 5 5 C hidup 17 6 C meninggal 11 7 D hidup 9 8 D meninggal 26
Kita dapat membacanya rentang usia 20 s.d 29 (kategori A) ada 10 pasien dengan hidup 9 orang dan 1 orang meninggal. Bila kita hanya ingin tahu berapa jumlah setiap kategori yaitu
data_kategori <-a %>% group_by(kategori) %>% summarise(frekuensi=n()) print(data_kategori)
hasil
kategori frekuensi <chr> <int> 1 A 10 2 B 27 3 C 28 4 D 35
Kita seleksi lagi hanya kondisi hidup saja untuk setiap kategori
data_hidup <-a %>% filter(kondisi=='hidup') %>% group_by(kategori) %>% summarise(frekuensi = n()) print(data_hidup)
hasil
kategori frekuensi <chr> <int> 1 A 9 2 B 22 3 C 17 4 D 9
Kita dapat membuat proporsi, misalkan jumlah pasien kategori A yaitu 10 dengan yang hidup 9 sehingga punya proporsi 9/10 = 0.9, kita bisa membuat tabel lagi menjadi berikut
data_hidup_proporsi<-data_hidup %>% mutate(proporsi=c(data_hidup$frekuensi/data_kategori$frekuensi)) print(data_hidup_proporsi)
hasil
kategori frekuensi proporsi <chr> <int> <dbl> 1 A 9 0.9 2 B 22 0.815 3 C 17 0.607 4 D 9 0.257
Agar lebih menarik bisa ditampilkan menjadi berikut
usia <-c('20 s.d 29','30 s.d 39','40 s.d 49','> 50') barplot(data_hidup_proporsi$proporsi,names.arg = usia, xlab='kategori umur',ylab='harapan hidup',col='blue', main='Harapan Hidup Pasien Covid-19',border='black')
Nah kalian bisa melihat data tersebut lebih baik dan bisa menyimpulkan bahwa harapan hidup semakin nipis untuk orang yang berumur.
Estimasi Harapan Hidup Pasien Covid-19
Salah satu syarat penggunaan metode regresi logistik ialah data pada variabel tak bebas bersifat non-metrik (kategori) dalam hal ini yaitu kondisi. Nah kita harus ubah kondisi yaitu hidup==1 dan meninggal ==0 yang berarti harapan hidup
a2 <- covid %>% mutate(binary=ifelse(kondisi=='hidup',1,0)) print(a2) model = glm(formula = a2$binary ~ covid$usia, family = 'binomial') summary(model) b0 = model$coefficient[1] #intercept b1 = model$coefficient[2] print(data.frame(b0,b1))
hasil
Call: glm(formula = a2$binary ~ covid$usia, family = "binomial") Deviance Residuals: Min 1Q Median 3Q Max -2.2562 -0.8200 0.4626 0.8411 1.9845 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) 5.39351 1.14585 4.707 2.51e-06 *** covid$usia -0.11269 0.02431 -4.635 3.56e-06 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 (Dispersion parameter for binomial family taken to be 1) Null deviance: 136.66 on 99 degrees of freedom Residual deviance: 106.79 on 98 degrees of freedom AIC: 110.79 Number of Fisher Scoring iterations: 4 b0 b1 (Intercept) 5.393514 -0.1126932
Berdasarkan model diatas maka persamaan peluang logistik harapan hidup pasien covid-19 berdasarkan usia yaitu
Misalkan kita akan prediksi peluang untuk harapan hidup umur 20 yaitu
usia = 20 peluang = exp(b0+b1*usia)/(1+exp(b0+b1*usia)) print(data.frame(usia,peluang))
hasil
usia peluang (Intercept) 20 0.9584989
Harapan hidup pasien covid-19 untuk umur 20 sebesar 0.9, mari kita coba untuk umur 60
usia = 60 peluang = exp(b0+b1*usia)/(1+exp(b0+b1*usia)) print(data.frame(usia,peluang))
hasil
usia peluang (Intercept) 60 0.2029303
Semakin tipis harapan hidup pasien covid-19 jika semakin “berumur” yaitu 0.20 saja. Walaupun kondisi hidup/meninggal pasien ada banyak faktor selain umur seperti penyakit komplikasi sebelumnya tapi setidaknya ada gambaran awal saja mengenai korelasinya/peluang mengenai umur vs kondisi pasien.
Melalui plot berikut kita akan gambaran mengenai hubungan peluang dan umur
plot(peluang_hidup, xlab='kategori umur',ylab='harapan hidup',col='blue', main='Harapan Hidup Pasien Covid-19')