Library:
> # install.packages("knitr")
> # install.packages("rmarkdown")
> # install.packages("prettydoc")
> # install.packages("equatiomatic")
Perkembangan dunia yang semakin modern tidak hanya memberikan makna positif bagi kehidupan manusia, tetapi selalu diikuti dengan kemunculan dampak negatif. Saat membutuhkan tempat tinggal baru, manusia akan mencari tempat kosong yang mau tidak mau akan menggusur ekosistem di tempat tersebut, menyebabkan keanekaragaman flora fauna hilang dan akan menimbulkan polusi bagi lingkungan. Penyakit kardiovaskular menjadi salah satu akibat negatif dari komplikasi ulah manusia dalam merusak lingkungan. Penyakit kardiovaskular adalah sekelompok penyakit jantung dan pembuluh darah yang meliputi: penyakit jantung koroner (coronary heart disease), penyakit serebrovaskular (cerebro-vascular disease), penyakit arteri perifer (peripheral arterial disease), penyakit jantung rematik (rheumatic heart disease), penyakit jantung bawaan (congenital heart disease), trombosis vena dalam (deep vein thrombosis) dan emboli pulmonal (pulmonary embolism) (Juslim & Herawati, 2018). Penyakit kardiovaskular disebabkan perilaku hidup yang tidak sehat seperti jarang berolahraga, makan makanan siap saji yang mengandung banyak gula, banyak terpapar polusi (udara,air,tanah), tidak menjaga pola tidur, dan lain sebagainya.
Data yang digunakan adalah data yang berasal dari website Mendeley Data (https://data.mendeley.com/datasets/dzz48mvjht/1). Data penyakit kardiovaskular ini diambil dari salah satu rumah sakit di India. Total sampel mencapai 1000 subjek dengan 14 aspek penelitian yang dapat menjadi indikator penyebab seseorang mengidap penyakit kardiovaskular atau tidak.
> library(openxlsx)
> datareglog<-read.xlsx('C:/Users/LENOVO/Downloads/Cardiovascular_Disease_Dataset.xlsx')
> library(rmarkdown)
> paged_table(as.data.frame(datareglog))
Regresi logistik terdiri dari tiga jenis, yaitu regresi logistik biner, regresi logistik ordinal, dan regresi logistik multinomial. Pada regresi logistik biner, variabel respon bersifat biner dan variabel prediktor kontinu (Putri, Mariani, & Sunarmi, 2021). Sifat biner pada variabel respon bermaksud hanya memiliki dua kemungkinan nilai, contohnya “ya” atau “tidak”. Bentuk lain yang kerap ditemui dalam penulisan variabel respon adalah “0” yang mewakili suatu nilai misalnya sakit dan “1” yang mewakili suatu nilai lain misalnya sehat.
Fungsi peluang untuk setiap pengamatan variabel respon sebagai berikut : \[ f(y)=\pi^y(1-\pi)^{1-y} ; y=0,1 \] Bentuk regresi logistik dengan variabel prediktor sampai ke-i sebagai berikut : \[ \pi(x)=\frac{exp(\beta_{0}+\beta_{1}x_{1}+....+\beta_{i}x_{i})}{1+exp(\beta_{0}+\beta_{1}x_{1}+....+\beta_{i}x_{i})} \] Menurut Putri, Mariani, dan Sunarmi (2021) bentuk regresi di atas perlu ditransformasi menggunakan transformasi logit untuk mendapatkan persamaan yang linier. Bentuk transformasinya sebagai berikut : \[ logit(\pi(x))=ln(\frac{\pi(x)}{1-\pi(x)})=\beta_{0}+\beta_{1}x_{1}+...+\beta_{i}x_{i} \]
Analisis regresi logistik biner ini memiliki tujuan untuk mengetahui hubungan antara variabel prediktor dan variabel dependen dengan dua kategori yang mewakili suatu nilai karakteristik tertentu
> library(knitr)
> library(rmarkdown)
> library(tinytex)
> library(generalhoslem)
> library(pscl)
> library(readxl)
> library(car)
> library(openxlsx)
> datareglog<-read.xlsx('C:/Users/LENOVO/Downloads/Cardiovascular_Disease_Dataset.xlsx')
> str(datareglog)
'data.frame': 1000 obs. of 14 variables:
$ patientid : num 103368 119250 119372 132514 146211 ...
$ age : num 53 40 49 43 31 24 79 52 62 61 ...
$ gender : num 1 1 1 1 1 1 1 1 1 0 ...
$ chestpain : num 2 0 2 0 1 1 2 0 0 0 ...
$ restingBP : num 171 94 133 138 199 173 130 127 121 190 ...
$ serumcholestrol : num 0 229 142 295 0 0 240 345 357 181 ...
$ fastingbloodsugar: num 0 0 0 1 0 0 0 0 0 0 ...
$ restingrelectro : num 1 1 0 1 2 0 2 0 1 1 ...
$ maxheartrate : num 147 115 202 153 136 161 157 192 138 150 ...
$ exerciseangia : num 0 0 1 0 0 0 0 1 0 0 ...
$ oldpeak : chr "5.3" "3.7" "5" "3.2" ...
$ slope : num 3 1 1 2 3 3 2 1 0 2 ...
$ noofmajorvessels : num 3 1 0 2 2 2 1 0 0 0 ...
$ target : num 1 0 0 1 1 1 1 0 0 1 ...
> y=as.factor(datareglog$target)
> x1=datareglog$age
> x2=datareglog$restingBP
> x3=as.factor(datareglog$fastingbloodsugar)
> x4=datareglog$maxheartrate
> datapenyakit<-data.frame(y,x1,x2,x3,x4)
> str(datapenyakit)
'data.frame': 1000 obs. of 5 variables:
$ y : Factor w/ 2 levels "0","1": 2 1 1 2 2 2 2 1 1 2 ...
$ x1: num 53 40 49 43 31 24 79 52 62 61 ...
$ x2: num 171 94 133 138 199 173 130 127 121 190 ...
$ x3: Factor w/ 2 levels "0","1": 1 1 1 2 1 1 1 1 1 1 ...
$ x4: num 147 115 202 153 136 161 157 192 138 150 ...
Data frame yang dibentuk memiliki variabel respon (y) diwakili oleh kolom target, dan dipilih 4 variabel prediktor (x) dari 13 variabel prediktor yang ada. Kolom yang menjadi x1, x2, x3, dan x4 secara berturut-turut adalah umur, tekanan darah, hasil tes gula darah, dan detak jantung maksimal.
Untuk menghasilkan nilai koefisien dari seluruh variabel, galat, nilai p-value, sekaligus menguji apakah masing-masing variabel prediktor berpengaruh signifikan atau tidak terhadap variabel respon.
> reglog<-glm(y~x1+x2+x3+x4, family=binomial, data=datapenyakit)
Untuk mengetahui adanya indikasi korelasi antar variabel prediktor
> vif_values<-car::vif(reglog)
Pengujian regresi logistik secara simultan untuk mengetahui signifikansi model secara keseluruhan
> pR2(reglog)
fitting null model for pseudo-r2
llh llhNull G2 McFadden r2ML r2CU
-502.2656066 -680.2920002 356.0527872 0.2616911 0.2995644 0.4029170
> qchisq(0.95,3)
[1] 7.814728
> reglog<-glm(y~x1+x2+x3+x4, family=binomial, data=datapenyakit)
> summary(reglog)
Call:
glm(formula = y ~ x1 + x2 + x3 + x4, family = binomial, data = datapenyakit)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -7.932993 0.643528 -12.327 < 2e-16 ***
x1 0.002805 0.004380 0.641 0.522
x2 0.038575 0.002994 12.885 < 2e-16 ***
x31 1.370857 0.188828 7.260 3.88e-13 ***
x4 0.013945 0.002327 5.993 2.05e-09 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 1360.6 on 999 degrees of freedom
Residual deviance: 1004.5 on 995 degrees of freedom
AIC: 1014.5
Number of Fisher Scoring iterations: 4
Untuk mengetahui rasio probabilitas sukes terhadap gagal
> beta<-(coef(reglog))
> OR_beta<-exp(beta)
> rasio<-cbind(beta,OR_beta)
Untuk mengetahui proporsi sampel yang memenuhi kedua kategori variabel respon
> predik=fitted(reglog)
> datapenyakit$predik=predik
> klasifikasi=table(datapenyakit$y, datapenyakit$predik>0.5)
Untuk mengetahui kelayakan suatu model yang telah terbentuk
> UKM<-logitgof(datapenyakit$y, fitted(reglog))
> reglog<-glm(y~x1+x2+x3+x4, family=binomial, data=datapenyakit)
> summary(reglog)
Call:
glm(formula = y ~ x1 + x2 + x3 + x4, family = binomial, data = datapenyakit)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -7.932993 0.643528 -12.327 < 2e-16 ***
x1 0.002805 0.004380 0.641 0.522
x2 0.038575 0.002994 12.885 < 2e-16 ***
x31 1.370857 0.188828 7.260 3.88e-13 ***
x4 0.013945 0.002327 5.993 2.05e-09 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 1360.6 on 999 degrees of freedom
Residual deviance: 1004.5 on 995 degrees of freedom
AIC: 1014.5
Number of Fisher Scoring iterations: 4
\[ H0 = \beta_{1} = \beta_{2} = \beta_{3} = \beta_{4} = 0\\ H1 = minimal \hspace{0.2cm} ada \hspace{0.2cm} satu \hspace{0.2cm}\beta_{i} \neq 0\\ i = 1,2,3,4 \]
Berdasarkan output yang dihasilkan dari analisis regresi logistik biner, didapatkan model regresi seperti berikut :
\[ y = -7.932993\ + 0.002805x_{1}\ + 0.038575x_{2}\ + 1.370857x_{31}\ + 0.013945x_{4} \]
Model Regresi Logistik yang terbentuk sebagai berikut :
\[ \pi(x)=\frac{exp(-7.932993+0.002805x_{1}+0.038575x_{2}+ 1.370857 x_{31}+0.013945x_{4})}{1+exp(-7.932993+0.002805x_{1}+0.038575x_{2}+ 1.370857 x_{31}+0.013945x_{4})} \]
Transformasi Logit yang terbentuk sebagai berikut :
\[ logit(\pi(x))=ln(\frac{\pi(x)}{1-\pi(x)})=-7.932993+0.002805x_{1}+0.038575x_{2}+ 1.370857 x_{31}+0.013945x_{4} \]
Model regresi di atas dapat diinterpretasikan sebagai berikut :
\[ b_{1} = 0.002805\ \text {berarti setiap kenaikan umur sebanyak 1 tahun, peluang seseorang mengidap penyakit kardiovaskular}\\ \text{akan naik sebesar 0.002805 dengan asumsi variabel prediktor lainnya konstan}\\ b_{2} = 0.038575\ \text{berarti setiap kenaikan tekanan darah sebesar 1 mmHG, peluang seseorang mengidap penyakit kardioovaskular}\\ \text{akan naik sebesar 0.038575 dengan asumsi variabel prediktor lainnya konstan}\\ b_{3} = 1.370857\ \text{berarti setiap sampel dengan kategori tes gula darah (1) atau memiliki kadar gula darah di atas 120 mg/dl,}\\ \text {peluang seseorang mengidap penyakit kardiovaskular akan naik sebesar 1.370857 dengan asumsi variabel}\\ \text{prediktor lainnya konstan}\\ b_{4} = 0.013945\ \text{berarti setiap kenaikan detak jantung maksimal sebesar 1, peluang seseorang mengidap penyakit kardiovaskular}\\ \text{akan naik sebesar 0.013945 dengan asumsi variabel prediktor lainnya konstan} \]
> vif_values<-car::vif(reglog)
> vif_values
x1 x2 x3 x4
1.003883 1.020429 1.005247 1.014643
Semua nilai VIF < 10, maka asumsi multikolinearitas terpenuhi. Disimpulkan bahwa tidak ada korelasi antar variabel prediktor.
> pR2(reglog)
fitting null model for pseudo-r2
llh llhNull G2 McFadden r2ML r2CU
-502.2656066 -680.2920002 356.0527872 0.2616911 0.2995644 0.4029170
> qchisq(0.95,3)
[1] 7.814728
\[ H0 = \beta_{1} = \beta_{2} = \beta_{3} = \beta_{4} = 0\\ H1 = minimal \hspace{0.2cm} ada \hspace{0.2cm} satu \hspace{0.2cm}\beta_{i} \neq 0\\ i = 1,2,3,4 \]
\[ \text{Diperoleh output seperti berikut :}\\ G = 356.0527872\\ X^{2}_{0.05, 3} = 7.814728 \]
Karena nilai G lebih besar dari nilai chi-square maka tolak HO. Jadi dengan taraf nyata 0.05 dapat disimpulkan bahwa semua variabel prediktor yang terdiri dari umur, tekanan darah, hasil tes gula darah, dan detak jantung maksimal, berpengaruh signifikan secara simultan terhadap peluang seseorang mengidap penyakit kardiovaskular.
> reglog<-glm(y~x1+x2+x3+x4, family=binomial, data=datapenyakit)
> summary(reglog)
Call:
glm(formula = y ~ x1 + x2 + x3 + x4, family = binomial, data = datapenyakit)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -7.932993 0.643528 -12.327 < 2e-16 ***
x1 0.002805 0.004380 0.641 0.522
x2 0.038575 0.002994 12.885 < 2e-16 ***
x31 1.370857 0.188828 7.260 3.88e-13 ***
x4 0.013945 0.002327 5.993 2.05e-09 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 1360.6 on 999 degrees of freedom
Residual deviance: 1004.5 on 995 degrees of freedom
AIC: 1014.5
Number of Fisher Scoring iterations: 4
\[ H0 = \beta_{i} = 0\\ H1 =\beta_{i} \neq 0\\ i = 1,2,3,4 \]
\[ \text{Diperoleh output p-value seperti berikut :}\\ x_{1} = 0.522\\ x_{2} = <2e-16\\ x_{31}= 3.88e-13\\ x_{4} = 2.05e-09\\ \alpha = 0.05 \]
Dapat dilihat bahwa x2,x3,x4 semuanya memilliki p-value kurang dari nilai taraf nyata 0.05, sedangkan x1 memiliki p-value lebih dari nilai taraf nyata 0.05. Jadi dapat disimpulkan bahwa variabel tekanan darah, hasil tes gula darah, dan detak jantung maksimal secara parsial berpengaruh signifikan terhadap peluang seseorang mengidap penyakit kardiovaskular. Di sisi lain variabel prediktor umur secara parsial tidak berpengaruh signifikan terhadap peluang seseorang mengidap penyakit kardiovaskular.
> beta<-(coef(reglog))
> OR_beta<-exp(beta)
> rasio<-cbind(beta,OR_beta)
> paged_table(as.data.frame(rasio))
> predik=fitted(reglog)
> datapenyakit$predik=predik
> klasifikasi=table(datapenyakit$y, datapenyakit$predik>0.5)
> klasifikasi
FALSE TRUE
0 301 119
1 102 478
Hasil prediksi menunjukkan bahwa berdasarkan data uji, dari 1000 observasi terdapat 403 sampel pasien tidak menderita penyakit kardiovaskular. Model berhasil memprediksi dengan tepat sebanyak 301 pasien, sedangkan 102 sisanya diprediksi mengidap penyakit kardiovaskular. Serta terdapat 597 sampel pasien menderita penyakit kardiovaskular dan model berhasil memprediksi dengan tepat sebanyak 478 pasien sedangkan 119 pasien lainnya diprediksi tidak mengidap penyakit kardiovaskular. Sehingga keakuratan model dalam memprediksi adalah 62.97%.
> UKM<-logitgof(datapenyakit$y, fitted(reglog))
> UKM
Hosmer and Lemeshow test (binary model)
data: datapenyakit$y, fitted(reglog)
X-squared = 26.81, df = 8, p-value = 0.0007623
\[ H0 = \text{Model Layak}\\ H1 =\text{Model Tidak Layak} \]
\[ \text{Diperoleh output p-value seperti berikut :}\\ p-value = 0.0007623\\ \alpha = 0.05 \]
Karena p-value kurang dari nilai taraf nyata 0.05 maka dapat diputuskan tolah H0, jadi dapat disimpulkan bahwa model yang terbentuk adalah model yang tidak layak.
Kesimpulan yang didapat dari hasil analisis regresi logistik biner ini adalah model yang terbentuk bukanlah model yang layak untuk menjabarkan hubungan antara variabel respon dengan variabel prediktor. Hal ini dipengaruhi oleh salah satu variabel prediktor yaitu X1 (umur) yang secara parsial tidak berpengaruh signifikan terhadap peluang seseorang mengidap penyakit kardiovaskular.
Sebaiknya ketika terjadi indikasi munculnya variabel prediktor yang secara parsial tidak signifikan terhadap variabel responnya, maka dengan segera dilakukan perubahan variabel prediktor yang digunakan atau mengambil ulang data sampel yang benar-benar mewakili nilai suatu populasi.
Bhattacharyya, D. & Doppala, B. P., 2021. Cardiovascular_Disease_Dataset. [Online] Available at: https://data.mendeley.com/datasets/dzz48mvjht/1 [Accessed 03 06 2024].
Juslim, R. R. & Herawati, F., 2018. Penyakit Kardiovaskular. In: Seri Pengobatan Rasional. Yogyakarta: Graha Ilmu, pp. 1-14.
Putri, D. L. W., Mariani, S. & S., 2021. Peningkatan Ketepatan Klasifikasi Model Regresi Logistik Biner dengan Metode. Indonesian Journal of Mathematics and Natural Sciences, 44(2), pp. 61-72.