Regresi Logistik Ordinal Data Kerja Bakti
1. Pendahuluan
1.1. Definisi
Regresi logistik ordinal merupakan salah satu analisis regresi logitik yang digunakan untuk menganalisa hubungan antara variabel dependen dengan variabel independen, dimana variabel dependen bersifat polikotomus dengan skala ordinal.
Polikotomus disini maksudnya adalah data kategorik di mana kategori nya berjumlah lebih dari dua.
1.2. Model Regresi Logistik Ordinal
Model yang dapat dipakai untuk regresi logistik ordinal adalah model logit.
Keterangan :
\(j = 1,2,...,j\) adalah kategori respon.
1.3. Langkah Analisis
Adapun langkah-langkah analisis regresi logistik ordinal adalah sebagai berikut :
Melakukan input data
Melakukan pengecekan asumsi multikolinieritas antar variabel bebas. Jika tidak terdapat multikolinieritas, maka analisis dapat dilanjutkan. Jika terdapat multikolinieritas, data terlebih dahulu harus dilakukan penanganan seperti transformasi data, penambahan data atau penghapusan pada salah satu variabel yang berkorelasi kuat dengan variabel lainnya.
Melakukan uji kecocokan model atau Goodness of Fit untuk mengetahui apakah model yang dibentuk sudah baik atau belum. Pengujian dapat dilakukan menggunakan Uji Ordinal Hosmer and Lemeshow, Pulksteni and Robinson, Pearson dan Deviance Chi Square, serta Uji Lipsitz. Jika diperoleh kesimpulan model cocok atau H0 diterima, maka analisis regresi logistik ordinal cocok untuk memodelkan data tersebut.
Setelah itu akan dilanjutkan dengan uji serentak menggunakan statistik uji G untuk mengetahui ada tidaknya pengaruh variabel prediktor terhadap variabel respon secara bersama-sama. Jika terdapat pengaruh atau H0 ditolak, maka lanjutkan dengan uji signifikansi parsial menggunaka uji Wald. Sebaliknya, jika tidak terdapat pengaruh, maka uji parsial tidak perlu dilakukan.
Terakhir lakukan interpretasi model menggunakan nilai Odds Ratio.
2. Contoh
2.1. Deskripsi
Misal ingin diketahui apakah terdapat pengaruh antara umur, jenis kelamin serta status perkawinan terhadap tingkat partisipasi kerja bakti di suatu kelurahan. Tingkat partisipasi tersebut diukur dalam 3 kategori, yaitu Tidak Pernah, Jarang dan Sering. Karena tingkat partisipasi sebagai variabel dependen merupakan variabel kategorik berskala ordinal, maka regresi logistik ordinal merupakan metode yang sesuai untuk mencapai tujuan tersebut.
Berikut tabel deskripsi dari data yang digunakan.
| Variabel | Keterangan | Skala |
|---|---|---|
| Y | Tingkat Partisipasi Kerja Bakti (kerjabakti) |
|
| X1 | Umur (Age) | Kontinu |
| X2 | Jenis Kelamin (Gender) |
|
| X3 | Status Perkawinan (Married) |
|
2.2. Input data
Langkah pertama yang harus dilakukan saat akan melakukan analisis data menggunakan R adalah melakukan input data.
Banyak cara yang dapat dilakukan untuk mengimport data, disini saya menggunakan sintaks read_excel yang terdapat pada
library (readxl)
library(readxl)
data <- read_excel("Data Latihan.xlsx", sheet = "Kerja Bakti")
data## # A tibble: 199 × 4
## age gender married kerjabakti
## <dbl> <dbl> <dbl> <dbl>
## 1 59 1 1 1
## 2 39 0 1 1
## 3 28 0 1 1
## 4 30 1 1 2
## 5 26 1 0 1
## 6 36 1 1 1
## 7 40 0 1 1
## 8 55 1 1 1
## 9 54 0 1 1
## 10 28 1 0 3
## # ℹ 189 more rows
Data tersebut terdiri dari 199 baris dan 4 kolom. Artinya, ada 199 responden yang akan digunakan sebagai sampel penelitian.
Sebelum dilakukan pemodelan, cek terlebih dahulu apakah skala data
sudah sesuai dengan tabel deskripsi pada bagian awal. Ingat, terdapat 3
variabel kategorik pada data tersebut, yaitu tingkat partisipasi, jenis
kelamin dan status perkawinan. Kamu dapat mengecek informasi tersebut
melalui str()
#melihat sruktur data
str(data)## tibble [199 × 4] (S3: tbl_df/tbl/data.frame)
## $ age : num [1:199] 59 39 28 30 26 36 40 55 54 28 ...
## $ gender : num [1:199] 1 0 0 1 1 1 0 1 0 1 ...
## $ married : num [1:199] 1 1 1 1 0 1 1 1 1 0 ...
## $ kerjabakti: num [1:199] 1 1 1 2 1 1 1 1 1 3 ...
Dari output di atas, terlihat bahwa variabel age sudah benar karena
merupakan data numerik, sedangkan ketiga variabel lain yang seharusnya
berskala kategorik harus diubah terlebih dahulu menggunakan
as.factor() agar menjadi data kategorik.
2.3. Mengubah data integer menjadi kategorik
#Mengubah data integer menjadi kategorik
data$gender<-as.factor(data$gender)
data$married<-as.factor(data$married)
data$kerjabakti<-as.factor(data$kerjabakti)Kemudian periksa kembali skala data menggunakan
str().
#memeriksa kembali sruktur data
str(data)## tibble [199 × 4] (S3: tbl_df/tbl/data.frame)
## $ age : num [1:199] 59 39 28 30 26 36 40 55 54 28 ...
## $ gender : Factor w/ 2 levels "0","1": 2 1 1 2 2 2 1 2 1 2 ...
## $ married : Factor w/ 2 levels "0","1": 2 2 2 2 1 2 2 2 2 1 ...
## $ kerjabakti: Factor w/ 3 levels "1","2","3": 1 1 1 2 1 1 1 1 1 3 ...
summary(data)## age gender married kerjabakti
## Min. :17.0 0:107 0: 60 1:74
## 1st Qu.:25.0 1: 92 1:139 2:96
## Median :33.0 3:29
## Mean :35.3
## 3rd Qu.:44.0
## Max. :77.0
2.4. Eksplorasi
2.4.1. Summary data
summary(data)## age gender married kerjabakti
## Min. :17.0 0:107 0: 60 1:74
## 1st Qu.:25.0 1: 92 1:139 2:96
## Median :33.0 3:29
## Mean :35.3
## 3rd Qu.:44.0
## Max. :77.0
library(arsenal)
tab<-tableby(kerjabakti~ .,data = data)
summary(tab,text=TRUE)##
##
## | | 1 (N=74) | 2 (N=96) | 3 (N=29) | Total (N=199) | p value|
## |:------------|:---------------:|:---------------:|:---------------:|:---------------:|-------:|
## |age | | | | | < 0.001|
## |- Mean (SD) | 40.811 (13.190) | 32.156 (12.056) | 31.621 (11.397) | 35.296 (13.053) | |
## |- Range | 17.000 - 71.000 | 17.000 - 77.000 | 22.000 - 61.000 | 17.000 - 77.000 | |
## |gender | | | | | 0.809|
## |- 0 | 42 (56.8%) | 50 (52.1%) | 15 (51.7%) | 107 (53.8%) | |
## |- 1 | 32 (43.2%) | 46 (47.9%) | 14 (48.3%) | 92 (46.2%) | |
## |married | | | | | < 0.001|
## |- 0 | 12 (16.2%) | 30 (31.2%) | 18 (62.1%) | 60 (30.2%) | |
## |- 1 | 62 (83.8%) | 66 (68.8%) | 11 (37.9%) | 139 (69.8%) | |
2.4.2. Box plot
boxplot(data$age)boxplot(age~kerjabakti, data)2.5. Pembentukan model
Semua skala data sudah sesuai dengan tabel deskripsi di awal. Langkah
selanjutnya adalah melakukan pemodelan regresi logistik ordinal
menggunakan sintaks polr() yang terdapat pada
library (MASS) .
#pembentukan model
library(MASS)
model_ord=polr(kerjabakti~age+gender+married, method='logistic',data=data)
summary(model_ord)##
## Re-fitting to get Hessian
## Call:
## polr(formula = kerjabakti ~ age + gender + married, data = data,
## method = "logistic")
##
## Coefficients:
## Value Std. Error t value
## age -0.03629 0.01177 -3.084
## gender1 0.28602 0.27749 1.031
## married1 -1.04737 0.33355 -3.140
##
## Intercepts:
## Value Std. Error t value
## 1|2 -2.4827 0.4682 -5.3023
## 2|3 0.1174 0.4239 0.2769
##
## Residual Deviance: 367.9638
## AIC: 377.9638
- Untuk melakukan pemodelan ini, nama variabel dependen ditulis sebelum tanda ~ dan semua variabel independen ditulis setelah tanda ~. Method yang dipilih adalah logistik.
2.5.1. Uji asumsi multikolinieritas
Sebelum dianalisis lebih jauh, jangan lupa untuk mengecek asumsi multikolinieritas. Pengujian multikolinieritas menggunakan kriteria VIF.
#uji asumsi multikolinieritas
library(car)## Loading required package: carData
vif(model_ord)##
## Re-fitting to get Hessian
## age gender married
## 1.090172 1.006878 1.092370
Dari output di atas diperoleh hasil bahwa semua nilai VIF < 10 sehingga asumsi non-multikolinierias telah terpenuhi. Artinya, tidak ada korelasi yang kuat antar variabel independen.
2.5.2. Uji kesesuaian model.
Hipotesis :
H0 : Model sesuai (tidak ada perbedaan antara observasi dan prediksi)
H1 : Model tidak sesuai (ada perbedaan antara observasi dan prediksi)
Pengujian akan dilakukan menggunakan lipsitz
test yang terdapat pada
library(generalhoslem).
#Uji GoF
library(generalhoslem)## Loading required package: reshape
lipsitz.test(model_ord)##
## Lipsitz goodness of fit test for ordinal response models
##
## data: formula: kerjabakti ~ age + gender + married
## LR statistic = 13.096, df = 9, p-value = 0.1583
Berdasarkan output tersebut diperoleh informasi bahwa pada pada taraf signifikansi 5%, gagal tolak H0 karena p-value 0.1583 > 0.05. Artinya, tidak ada perbedaan antara observasi dan prediksi.
2.5.3. Uji serentak
Karena model telah sesuai, maka akan dilanjutkan dengan uji serentak dengan hipotesis sebagai berikut,
H0: \(β_1=β_2=⋯=β_p=0\) (tidak ada pengaruh variabel independen terhadap variabel dependen secara bersama-sama)
H1: Minimal ada satu \(\beta_j\neq 0\), \(j = 1, 2, ..., p\) (ada pengaruh variabel independen terhadap variabel dependen secara bersama-sama)
Pengujian akan dilakukan menggunakan pR2 yang terdapat pada
library(pscl).
#Uji serentak
library(pscl)## Classes and Methods for R developed in the
## Political Science Computational Laboratory
## Department of Political Science
## Stanford University
## Simon Jackman
## hurdle and zeroinfl functions by Achim Zeileis
pR2(model_ord)## fitting null model for pseudo-r2
## llh llhNull G2 McFadden r2ML
## -183.98190937 -199.03783777 30.11185680 0.07564355 0.14042385
## r2CU
## 0.16239300
#Chisquare tabel
qchisq(0.95, 3)## [1] 7.814728
Berdasarkan output tersebut diperoleh informasi bahwa pada taraf signifikansi 5%, H0 ditolak karena G2 = 30.11 > 7.814. Artinya, ada pengaruh variabel independen terhadap variabel dependen secara bersama-sama.
2.5.4. Uji Parsial
Untuk mengetahui variabel mana saja yang berpengaruh secara parsial, maka akan dilanjutkan dengan uji parsial (Uji Wald).
H0 : \(\beta _{j}= 0\) (tidak ada pengaruh variabel prediktor ke-j terhadap variabel respon)
H1 : \(\beta _{j}\neq 0\) (ada pengaruh variabel prediktor ke-j terhadap variabel respon)
\(j = 1, 2, … , p\)
#Uji Parsial
koef=coef(summary(model_ord))##
## Re-fitting to get Hessian
p_val_parsial=pnorm(abs(koef[,'t value']),lower.tail=FALSE)*2
tabel_uji_parsial=cbind(koef,'p value'=p_val_parsial)
tabel_uji_parsial## Value Std. Error t value p value
## age -0.03629359 0.01176745 -3.0842346 2.040766e-03
## gender1 0.28601940 0.27749170 1.0307314 3.026668e-01
## married1 -1.04736526 0.33354681 -3.1400848 1.688989e-03
## 1|2 -2.48267904 0.46822257 -5.3023481 1.143226e-07
## 2|3 0.11737143 0.42394305 0.2768566 7.818902e-01
coefmodel<-c(-model_ord$coefficients)
koefisien<-coef(summary(model_ord))##
## Re-fitting to get Hessian
#menghitung pvalue
p <- pnorm(abs(koefisien[,"t value"]), lower.tail = FALSE)*2
(ctabel<-cbind(round(koefisien,4), "pvalue"=round(p,4))) ## Value Std. Error t value pvalue
## age -0.0363 0.0118 -3.0842 0.0020
## gender1 0.2860 0.2775 1.0307 0.3027
## married1 -1.0474 0.3335 -3.1401 0.0017
## 1|2 -2.4827 0.4682 -5.3023 0.0000
## 2|3 0.1174 0.4239 0.2769 0.7819
Berdasarkan uji hipotesis dan cara penarikan kesimpulan, diperoleh informasi bahwa pada taraf signifikansi 5%, ketiga variabel secara individual mempengaruh tingkat partisipasi masyarakat dalam mengikuti kerja bakti. Hal ini dikarenakan p-value ketiga variabel < 0.05.
Dari output di atas, juga bisa dituliskan model logit yang terbentuk. Adapun banyak model yang terbentuk adalah sesuai dengan banyak kategori pada variabel dependen dikurangi 1, yaitu 3 – 1 = 2.
Namun perlu diingat, jika menggunakan R untuk estimasi model logistik ordinal, harus mengalikan -1 ke semua \(\beta_{1}, \beta _{2}, \cdots , \beta _{p}\) agar terbentuk model yang sesuai.
2.6. Pembentukan Model 2 (menghilangkan variabel gender)
model_ord2=polr(kerjabakti~age+married, method='logistic',data=data)
summary(model_ord2)##
## Re-fitting to get Hessian
## Call:
## polr(formula = kerjabakti ~ age + married, data = data, method = "logistic")
##
## Coefficients:
## Value Std. Error t value
## age -0.03593 0.01178 -3.048
## married1 -1.02864 0.33247 -3.094
##
## Intercepts:
## Value Std. Error t value
## 1|2 -2.5860 0.4588 -5.6365
## 2|3 0.0023 0.4094 0.0057
##
## Residual Deviance: 369.029
## AIC: 377.029
2.7. Berikut model yang terbentuk.
Model untuk menghitung berapa peluang responden tidak pernah mengikuti kerja bakti
Model untuk menghitung berapa peluang responden tidak pernah dan jarang mengikuti kerja bakti
Kedua model tersebut nantinya dapat digunakan untuk memprediksi tingkat partisipasi seorang responden berdasarkan nilai peluang dari tiga kategori tersebut, sebagai simulasi akan dicontohkan sebagai berikut.
Misal seorang responden berusia 59 tahun, berjenis kelamin perempuan dan sudah menikah. Maka peluang masing-masing kategori untuk responden dengan kriteria tersebut dapat dihitung dengan cara berikut.
Jadi, peluang ia tidak pernah mengikuti kerja bakti sebesar 0.6034806.
Peluang ia jarang mengikuti kerja bakti sebesar 0.3499908.
Sedangkan, peluang ia sering mengikuti kerja bakti adalah sebesar 0.0465286.
Karena dari ketiga kategori yang paling besar adalah peluang tidak pernah mengikuti kerja bakti, maka responden dengan karakteristik berusia 59 tahun, berjenis kelamin perempuan dan sudah menikah diprediksi tidak pernah mengikuti kerja bakti.
Jika Menggunakan syntax di R, hasilnya akan sama
#Input data baru (usia 59, perempuan, sudah menikah)
new = data.frame(age = 59,
gender = as.factor("1"),
married = as.factor("1")
)
prediksi <- predict(model_ord,newdata = new,"probs")
peluang <- data.frame(cumulatif = cumsum(prediksi),point=prediksi)
peluang## cumulatif point
## 1 0.6034805 0.60348051
## 2 0.9534713 0.34999075
## 3 1.0000000 0.04652874
2.8. Odds ratio
Untuk menginterpretasikan model, maka dapat dilakukan dengan menghitung nilai odds rasio terlebih dahulu.
#Odds Ratio
exp(coef(model_ord))## age gender1 married1
## 0.9643571 1.3311183 0.3508610
Dari output tersebut, diperoleh informasi sebagai berikut.
Untuk variabel umur, didapatkan nilai odds ratio sebesar 0.96, artinya jika umur responden bertambah 1 tahun, maka kecenderungan ia untuk semakin terlibat kerja bakti sebesar 0.96 kali dibandingkan umur sebelumnya. Hal ini menunjukkan semakin tua umur seseorang, maka kecenderungan untuk terlibat akan semakin menurun.
Untuk variabel jenis kelamin, didapatkan nilai odds ratio sebesar 1.33, artinya responden perempuan memiliki kecenderungan 1.33 kali lebih besar untuk semakin terlibat dalam kerja bakti dibandingkan responden pria.
Untuk variabel status perkawinan, didapatkan nilai odds ratio sebesar 0.35, artinya responden yang sudah menikah memiliki kecenderungan 0.35 kali untuk semakin terlibat dalam kerja bakti dibandingkan responden yang belum menikah.
3. Sumber
- https://exsight.id/blog/2021/07/28/tutorial-analisis-regresi-logistik-ordinal-menggunakan-rstudio/. Tutorial Analisis Regresi Logistik Ordinal Menggunakan RStudio.