Regresi Logistik Ordinal Contoh 2

1. Package

library(ggplot2)
library(tidyverse)
library(gmodels)
library(ggmosaic)
library(corrplot)
library(caret)
library(rpart)
library(rpart.plot)
library(C50)
library(gmodels)
library(tidyr)
library(dplyr)
library(knitr)
library(rsample)
library(readxl)
library(MASS)

2. Input Data

data_akreditasi<-read_xlsx("Data Latihan.xlsx", sheet = "Akreditasi")
data_akreditasi
# A tibble: 104 × 4
     UN1   UN2   UN3 Akreditasi
   <dbl> <dbl> <dbl>      <dbl>
 1  68.1  68.6  71.8          4
 2  72.7  75.7  30.2          4
 3  46.4  48.5  46.4          4
 4  66.1  67.3  74.9          3
 5  54.3  64.4  75.4          4
 6  48.5  42    36.9          3
 7  70.5  76.3  40.6          4
 8  70.9  58.5  63.6          4
 9  59.7  38.2  65.9          3
10  50.6  68.5  53.0          3
# ℹ 94 more rows
#melihat sruktur data
str(data_akreditasi)
tibble [104 × 4] (S3: tbl_df/tbl/data.frame)
 $ UN1       : num [1:104] 68.1 72.7 46.4 66.1 54.3 48.5 70.5 70.9 59.7 50.6 ...
 $ UN2       : num [1:104] 68.6 75.7 48.5 67.3 64.4 ...
 $ UN3       : num [1:104] 71.8 30.2 46.4 74.9 75.4 ...
 $ Akreditasi: num [1:104] 4 4 4 3 4 3 4 4 3 3 ...

2.1. Mengubah data integer menjadi kategorik

#Mengubah data integer menjadi kategorik
data_akreditasi$Akreditasi<-as.factor(data_akreditasi$Akreditasi)

data_akreditasi
# A tibble: 104 × 4
     UN1   UN2   UN3 Akreditasi
   <dbl> <dbl> <dbl> <fct>     
 1  68.1  68.6  71.8 4         
 2  72.7  75.7  30.2 4         
 3  46.4  48.5  46.4 4         
 4  66.1  67.3  74.9 3         
 5  54.3  64.4  75.4 4         
 6  48.5  42    36.9 3         
 7  70.5  76.3  40.6 4         
 8  70.9  58.5  63.6 4         
 9  59.7  38.2  65.9 3         
10  50.6  68.5  53.0 3         
# ℹ 94 more rows
str(data_akreditasi)
tibble [104 × 4] (S3: tbl_df/tbl/data.frame)
 $ UN1       : num [1:104] 68.1 72.7 46.4 66.1 54.3 48.5 70.5 70.9 59.7 50.6 ...
 $ UN2       : num [1:104] 68.6 75.7 48.5 67.3 64.4 ...
 $ UN3       : num [1:104] 71.8 30.2 46.4 74.9 75.4 ...
 $ Akreditasi: Factor w/ 4 levels "1","2","3","4": 4 4 4 3 4 3 4 4 3 3 ...
summary(data_akreditasi)
      UN1             UN2             UN3        Akreditasi
 Min.   :36.10   Min.   :29.00   Min.   :27.20   1:16      
 1st Qu.:47.45   1st Qu.:44.53   1st Qu.:44.02   2: 3      
 Median :60.73   Median :52.20   Median :52.81   3:21      
 Mean   :58.85   Mean   :55.86   Mean   :54.41   4:64      
 3rd Qu.:68.03   3rd Qu.:68.33   3rd Qu.:65.09             
 Max.   :83.39   Max.   :86.45   Max.   :82.04             

3. Pembentukan model

library(MASS)
model_akreditasi=polr(Akreditasi~., method='logistic',data=data_akreditasi)

3.1. Uji asumsi multikolinieritas

#uji asumsi multikolinieritas

library(car)
vif(model_akreditasi)
     UN1      UN2      UN3 
2.058265 1.949834 1.314553 

3.2. Uji kesesuaian model.

#Uji GoF

library(generalhoslem)
lipsitz.test(model_akreditasi)

    Lipsitz goodness of fit test for ordinal response models

data:  formula:  Akreditasi ~ UN1 + UN2 + UN3
LR statistic = 14.137, df = 9, p-value = 0.1175

3.3. Uji serentak

#Uji serentak
library(pscl)
pR2(model_akreditasi)
fitting null model for pseudo-r2
          llh       llhNull            G2      McFadden          r2ML 
-100.93016529 -105.25590856    8.65148654    0.04109739    0.07982128 
         r2CU 
   0.09197122 
#Chisquare tabel
qchisq(0.95, 2)
[1] 5.991465
library(lmtest) 
lrtest(model_akreditasi)
Likelihood ratio test

Model 1: Akreditasi ~ UN1 + UN2 + UN3
Model 2: Akreditasi ~ 1
  #Df  LogLik Df  Chisq Pr(>Chisq)  
1   6 -100.93                       
2   3 -105.26 -3 8.6515     0.0343 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

3.4. Uji Parsial

#Uji Parsial
koef=coef(summary(model_akreditasi))
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
UN1 -0.01438293 0.02419240 -0.5945227 0.55216258
UN2  0.04390920 0.02068839  2.1224078 0.03380351
UN3  0.01186448 0.01749116  0.6783130 0.49757326
1|2  0.46206163 1.08862203  0.4244463 0.67124033
2|3  0.68722838 1.09118411  0.6298006 0.52882507
3|4  1.78213263 1.09729112  1.6241202 0.10435017

4. Pembentukan Model 2

model_akreditasi2=polr(Akreditasi~UN2, method='logistic',data=data_akreditasi)

4.1. Uji Parsial

#Uji Parsial
koef2=coef(summary(model_akreditasi2))
p_val_parsial2=pnorm(abs(koef2[,'t value']),lower.tail=FALSE)*2
tabel_uji_parsial2=cbind(koef2,'p value'=p_val_parsial2)
tabel_uji_parsial2
         Value Std. Error   t value     p value
UN2 0.04043132 0.01488468 2.7163047 0.006601514
1|2 0.47992661 0.82620793 0.5808787 0.561322195
2|3 0.70402595 0.82727662 0.8510164 0.394760258
3|4 1.79162648 0.83915931 2.1350254 0.032758932
summary(model_akreditasi)
Call:
polr(formula = Akreditasi ~ ., data = data_akreditasi, method = "logistic")

Coefficients:
       Value Std. Error t value
UN1 -0.01438    0.02419 -0.5945
UN2  0.04391    0.02069  2.1224
UN3  0.01186    0.01749  0.6783

Intercepts:
    Value   Std. Error t value
1|2  0.4621  1.0886     0.4244
2|3  0.6872  1.0912     0.6298
3|4  1.7821  1.0973     1.6241

Residual Deviance: 201.8603 
AIC: 213.8603 
summary(model_akreditasi2)
Call:
polr(formula = Akreditasi ~ UN2, data = data_akreditasi, method = "logistic")

Coefficients:
      Value Std. Error t value
UN2 0.04043    0.01488   2.716

Intercepts:
    Value  Std. Error t value
1|2 0.4799 0.8262     0.5809 
2|3 0.7040 0.8273     0.8510 
3|4 1.7916 0.8392     2.1350 

Residual Deviance: 202.4944 
AIC: 210.4944 

5. Odds ratio

Untuk menginterpretasikan model, maka dapat dilakukan dengan menghitung nilai odds rasio terlebih dahulu.

#Odds Ratio
exp(coef(model_akreditasi2))
    UN2 
1.04126 

Jika nilai UN2 tahunsebelumnya mengalami kenaikan 1 point, kecenderungan ia untuk mendapatkan nilai akreditasi yang lebih tinggi sebesar 1.04 kali dibandingkan nilai sebelumnya. Hal ini menunjukkan semakin tinggi nilai UN2, maka kecenderungan untuk mendapatkan nilai akreditasi yang lebih baik semakin tinggi.