Belajar R- Analisis regresi logistik pada data Covid 19

By | July 30, 2024
Print Friendly, PDF & Email
2,678 Views

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

  1. jika variabel tak bebas memiliki dua kategori, maka disebut regresi logistik biner (binary regression logistic).
  2. 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

Variabel kategorikal merupakan variabel hitung yang tidak memenuhi sifat operasi aritmatik. Variabel kategorikal sering disebut sebagai variabel kualitatif.

  1. 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.
  2. 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

  1. Tidak membutuhkan hubungan linier antara variabel independen dengan variabel dependen.
  2. Variabel independen tidak memerlukan asumsi multivariate normality.
  3. Asumsi homokedastisitas tidak diperlukan
  4. Variabel bebas tidak perlu diubah ke dalam bentuk metrik (interval atau skala ratio).
  5. Variabel dependen harus bersifat dikotomi
  6. Variabel independen tidak harus memiliki keragaman yang sama antar kelompok variabel
  7. Kategori dalam variabel independen harus terpisah satu sama lain atau bersifat eksklusif

Persamaan umum regresi logistik yaitu diturunkan dari persamaan

    \[ln (\frac{\hat p}{1-\hat p}) = \alpha+\beta_0+\beta_1x_1\]

    \[\frac{\hat p }{1-\hat p}=e^{\alpha+\beta_0+\beta_1x_1}\]

    \[\hat p=(1-\hat p) e^{\alpha+\beta_0+\beta_1x_1}\]

    \[\hat p=e^{\alpha+\beta_0+\beta_1x_1} - \hat p e^{\alpha+\beta_0+\beta_1x_1}\]

    \[\hat p + \hat p e^{\alpha+\beta_0+\beta_1x_1}=e^{\alpha+\beta_0+\beta_1x_1}\]

    \[\hat p(1+e^{\alpha+\beta_0+\beta_1x_1})=e^{\alpha+\beta_0+\beta_1x_1}\]

    \[\hat p = \frac{e^{\alpha+\beta_0+\beta_1x_1}}{1+e^{\alpha+\beta_0+\beta_1x_1}}\]

Sehingga persamaan umum menjadi berikut

    \[\hat p=\frac{e^{\alpha+\beta_0+ \beta_1x_1 +...+ \beta_px_p}}{1+e^{\alpha+\beta_0+\beta_1x_1+...+\beta_px_p}}\]

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 \hat p==1

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

    \[\hat p (y=1) = \frac{e^{5.39351-0.11269*usia}}{1+e^{5.39351-0.11269*usia}}\]

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