Nama Kelompok

  1. Dimas Kurniawan (23031554067)

  2. Eko Hadi Prasetiyo (23031554121)

  3. Muhammad Hilmi Musyaffa (23031554128)

Linear Diskrimanan Analysis

1. Mempersiapkan library yang di butuhkan

Baris kode berikut digunakan untuk memanggil berbagai library yang diperlukan dalam analisis, namun hasil pemanggilannya tidak ditampilkan karena hanya bertujuan untuk memuat fungsi-fungsi yang akan digunakan selanjutnya.

library(MASS)       
library(dplyr)      
library(ggplot2)    
library(reshape2)   
library(caret)     
library(mvnormtest) 
library(biotools)
library(DescTools)

2. Prapemrosesan Data

2.1. Pemuatan Dataset

Membaca data mentah dari file

tryCatch({
  data_full <- read.csv("C:\\Users\\dimas\\Desktop\\Rstudi\\anxiety_baru.csv", stringsAsFactors = FALSE, check.names = TRUE) 
  cat("Dataset berhasil dimuat.\n")
  print(paste("Jumlah baris awal:", nrow(data_full)))
  print(paste("Jumlah kolom awal:", ncol(data_full)))
  print("Nama kolom awal (setelah R menyesuaikannya):")
  print(colnames(data_full))
}, error = function(e) {
  stop("Gagal memuat file Anxiety.csv. Pastikan file ada dan path benar. Error: ", e$message)
})
## Dataset berhasil dimuat.
## [1] "Jumlah baris awal: 2028"
## [1] "Jumlah kolom awal: 16"
## [1] "Nama kolom awal (setelah R menyesuaikannya):"
##  [1] "X1..Age"                                                                                                      
##  [2] "X2..Gender"                                                                                                   
##  [3] "X3..University"                                                                                               
##  [4] "X4..Department"                                                                                               
##  [5] "X5..Academic.Year"                                                                                            
##  [6] "X6..Current.CGPA"                                                                                             
##  [7] "X7..Did.you.receive.a.waiver.or.scholarship.at.your.university."                                              
##  [8] "X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure.."                 
##  [9] "X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs.."             
## [10] "X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure.."                        
## [11] "X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure."         
## [12] "X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs.."                              
## [13] "X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still."
## [14] "X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen."                       
## [15] "Anxiety.Value"                                                                                                
## [16] "Anxiety.Label"

2.2. Seleksi Fitur/Kolom

Menghapuskolom yang tidak relevan atau tidak diperlukan untuk analisis diskriminan

kolom_untuk_dihapus <- c(
  "X1..Age",
  "X2..Gender",
  "X3..University",
  "X4..Department",
  "X5..Academic.Year",
  "X6..Current.CGPA",
  "X7..Did.you.receive.a.waiver.or.scholarship.at.your.university.",
  "Anxiety.Value"
)

kolom_ada <- kolom_untuk_dihapus %in% colnames(data_full)
if (!all(kolom_ada)) {
  cat("Peringatan: Kolom berikut tidak ditemukan dan tidak dapat dihapus:")
  print(kolom_untuk_dihapus[!kolom_ada])
}
kolom_untuk_dihapus_valid <- kolom_untuk_dihapus[kolom_ada]
data_diskriminan <- data_full[, !colnames(data_full) %in% kolom_untuk_dihapus_valid, drop = FALSE]
cat("Nama kolom setelah penghapusan kolom demografi dan Anxiety.Value:")
## Nama kolom setelah penghapusan kolom demografi dan Anxiety.Value:
print(colnames(data_diskriminan))
## [1] "X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure.."                 
## [2] "X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs.."             
## [3] "X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure.."                        
## [4] "X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure."         
## [5] "X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs.."                              
## [6] "X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still."
## [7] "X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen."                       
## [8] "Anxiety.Label"

2.3. Konversi Tipe Data

Memastikan variabel target (Anxiety.Label) berformat factor yang sesuai untuk klasifikasi

if ("Anxiety.Label" %in% colnames(data_diskriminan)) {
  data_diskriminan$Anxiety.Label <- as.factor(data_diskriminan$Anxiety.Label)
  cat("'Anxiety.Label' telah diubah menjadi factor.")
  cat("Level dari 'Anxiety.Label':")
  print(levels(data_diskriminan$Anxiety.Label))
} else {
  stop("Kolom 'Anxiety.Label' tidak ditemukan. Periksa nama kolom setelah pemrosesan.")
}
## 'Anxiety.Label' telah diubah menjadi factor.Level dari 'Anxiety.Label':[1] "Mild Anxiety"     "Minimal Anxiety"  "Moderate Anxiety" "Severe Anxiety"

2.4. Penanganan Nilai Hilang

Mengisi nilai yang hilang (NA) pada kolom prediktor, misalnya dengan menggunakan modus.

get_mode <- function(v, na.rm = TRUE) {
  if (na.rm) {
    v <- v[!is.na(v)]
  }
  uniqv <- unique(v)
  if (length(uniqv) == 0) return(NA) 
  uniqv[which.max(tabulate(match(v, uniqv)))]}

predictor_cols <- setdiff(colnames(data_diskriminan), "Anxiety.Label")
cat("Memeriksa missing values sebelum imputasi:")
## Memeriksa missing values sebelum imputasi:
print(sapply(data_diskriminan[, predictor_cols, drop = FALSE], function(x) sum(is.na(x))))
##                  X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure.. 
##                                                                                                             0 
##              X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs.. 
##                                                                                                             0 
##                         X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure.. 
##                                                                                                             0 
##          X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure. 
##                                                                                                             0 
##                               X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs.. 
##                                                                                                             0 
## X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still. 
##                                                                                                             0 
##                        X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen. 
##                                                                                                             0

2.5. Pembersihan Data

Menghapus baris data yang masih memiliki nilai hilang pada variabel target setelah langkah sebelumnya.

data_diskriminan <- data_diskriminan[complete.cases(data_diskriminan$Anxiety.Label), ]
cat(paste("Jumlah baris setelah preprocessing:", nrow(data_diskriminan), ""))
## Jumlah baris setelah preprocessing: 2028

3. Analisis Data Eksploratif (EDA)

Tahap untuk memahami pola dan karakteristik data melalui ringkasan statistik dan visualisasi.

3.1. Statistik Deskriptif

summary(data_diskriminan)
##  X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure..
##  Min.   :0.000                                                                               
##  1st Qu.:1.000                                                                               
##  Median :2.000                                                                               
##  Mean   :1.778                                                                               
##  3rd Qu.:3.000                                                                               
##  Max.   :3.000                                                                               
##  X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs..
##  Min.   :0.000                                                                                   
##  1st Qu.:1.000                                                                                   
##  Median :2.000                                                                                   
##  Mean   :1.634                                                                                   
##  3rd Qu.:3.000                                                                                   
##  Max.   :3.000                                                                                   
##  X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure..
##  Min.   :0.000                                                                        
##  1st Qu.:1.000                                                                        
##  Median :2.000                                                                        
##  Mean   :1.754                                                                        
##  3rd Qu.:3.000                                                                        
##  Max.   :3.000                                                                        
##  X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure.
##  Min.   :0.000                                                                                       
##  1st Qu.:1.000                                                                                       
##  Median :2.000                                                                                       
##  Mean   :1.783                                                                                       
##  3rd Qu.:3.000                                                                                       
##  Max.   :3.000                                                                                       
##  X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs..
##  Min.   :0.000                                                                  
##  1st Qu.:1.000                                                                  
##  Median :2.000                                                                  
##  Mean   :1.866                                                                  
##  3rd Qu.:3.000                                                                  
##  Max.   :3.000                                                                  
##  X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still.
##  Min.   :0.000                                                                                                
##  1st Qu.:1.000                                                                                                
##  Median :2.000                                                                                                
##  Mean   :1.797                                                                                                
##  3rd Qu.:3.000                                                                                                
##  Max.   :3.000                                                                                                
##  X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen.
##  Min.   :0.000                                                                         
##  1st Qu.:1.000                                                                         
##  Median :2.000                                                                         
##  Mean   :1.733                                                                         
##  3rd Qu.:3.000                                                                         
##  Max.   :3.000                                                                         
##           Anxiety.Label
##  Mild Anxiety    :505  
##  Minimal Anxiety :163  
##  Moderate Anxiety:618  
##  Severe Anxiety  :742  
##                        
## 

3.2. Analisis Variabel Target

cat("Frekuensi tabel untuk Anxiety.Label:")
## Frekuensi tabel untuk Anxiety.Label:
print(table(data_diskriminan$Anxiety.Label))
## 
##     Mild Anxiety  Minimal Anxiety Moderate Anxiety   Severe Anxiety 
##              505              163              618              742

3.3. Visualisasi Data

if (length(predictor_cols) > 0) {
  for (var in predictor_cols) {
    p <- ggplot(data_diskriminan, aes_string(x = "Anxiety.Label", y = var, fill = "Anxiety.Label")) +
      geom_boxplot() +
      labs(title = paste("Boxplot:", var),
           x = "Tingkat Kecemasan", y = "Nilai") +
      theme_minimal() +
      theme(
        axis.text.x = element_text(angle = 45, hjust = 1),
        plot.title = element_text(size = 14, face = "bold", hjust = 0.5)
      )
    print(p)
  }
} else {
  cat("Tidak ada kolom prediktor yang teridentifikasi untuk EDA.\n")
}

4. Pembagian Data

Memisahkan dataset menjadi dua bagian: data pelatihan (untuk membangun model) dan data pengujian (untuk mengevaluasi model

4.1. Partisi Data

Menggunakan fungsi seperti createDataPartition untuk membagi data

set.seed(123) 
if (nrow(data_diskriminan) > 10) { 
    train_index <- createDataPartition(data_diskriminan$Anxiety.Label, p = 0.7, list = FALSE, times = 1)
    train_data <- data_diskriminan[train_index, ]
    test_data <- data_diskriminan[-train_index, ]
    cat(paste("Ukuran data training:", nrow(train_data), "observasi\n"))
    cat(paste("Ukuran data testing:", nrow(test_data), "observasi\n"))
    cat("Distribusi Anxiety.Label di data training:\n")
    print(table(train_data$Anxiety.Label))
    cat("Distribusi Anxiety.Label di data testing:\n")
    print(table(test_data$Anxiety.Label))
    
    if(!all(levels(test_data$Anxiety.Label) %in% levels(train_data$Anxiety.Label))){
        cat("Peringatan: Tidak semua level Anxiety.Label di test_data ada di train_data. Ini bisa menyebabkan masalah.\n")
        cat("Sebaiknya gunakan seluruh dataset untuk training jika N sangat kecil atau gunakan LOOCV.\n")
        use_full_data_for_training <- TRUE
    } else {
        use_full_data_for_training <- FALSE
    }

    if (nrow(test_data) < length(levels(data_diskriminan$Anxiety.Label)) * 2 || any(table(test_data$Anxiety.Label) == 0) ) {
      cat("Peringatan: Data testing sangat kecil atau ada kelas tanpa observasi. Menggunakan seluruh dataset untuk training & evaluasi.")
      use_full_data_for_training <- TRUE
    }

} else {
    cat("Ukuran dataset terlalu kecil untuk splitting. Menggunakan seluruh dataset untuk training & evaluasi.")
    use_full_data_for_training <- TRUE
}
## Ukuran data training: 1422 observasi
## Ukuran data testing: 606 observasi
## Distribusi Anxiety.Label di data training:
## 
##     Mild Anxiety  Minimal Anxiety Moderate Anxiety   Severe Anxiety 
##              354              115              433              520 
## Distribusi Anxiety.Label di data testing:
## 
##     Mild Anxiety  Minimal Anxiety Moderate Anxiety   Severe Anxiety 
##              151               48              185              222
if (exists("use_full_data_for_training") && use_full_data_for_training) {
    train_data <- data_diskriminan
    test_data <- data_diskriminan 
    cat("Menggunakan seluruh dataset untuk training dan evaluasi karena N sangat kecil.")
    cat(paste("Ukuran data (training & evaluasi):", nrow(train_data), "observasi"))
}

5. Pengujian Asumsi Analisis Diskriminan

Memverifikasi apakah asumsi-asumsi yang mendasari LDA terpenuhi oleh data pelatihan.

5.1. Uji Normalitas Multivariat

groups <- levels(train_data$Anxiety.Label)
normality_ok <- TRUE
if (length(predictor_cols) > 0 && ncol(train_data[, predictor_cols, drop = FALSE]) > 0) {
    for (group in groups) {
        group_data <- train_data[train_data$Anxiety.Label == group, predictor_cols, drop = FALSE]
        if (nrow(group_data) >= 3 && nrow(group_data) > length(predictor_cols) && ncol(group_data) > 0) {
            cat(paste("\nUji Normalitas Multivariat untuk grup:", group, "(N=",nrow(group_data),")"))
            tryCatch({
                shapiro_test_result <- mshapiro.test(t(group_data))  
                print(shapiro_test_result)
                if (shapiro_test_result$p.value < 0.05) {
                    cat(paste("Peringatan: Normalitas multivariat mungkin dilanggar untuk grup", group))
                    normality_ok <- FALSE
                }
            }, error = function(e) {
                cat(paste("Tidak dapat melakukan mshapiro.test untuk grup", group, ":", e$message, ))
                cat("Ini sering terjadi jika jumlah observasi per grup sangat kecil atau varians nol pada prediktor.")
            })
        } else {
            cat(paste("Tidak cukup data atau prediktor untuk uji normalitas multivariat pada grup:", group, "(N=",nrow(group_data),", Prediktor=",length(predictor_cols),")"))
        }
    }
    if (normality_ok && any(sapply(groups, function(g) nrow(train_data[train_data$Anxiety.Label == g,]) >=3 ))) { # Cek jika ada grup yang diuji
         cat("Secara umum, jika p-value > 0.05, asumsi normalitas multivariat tidak ditolak.\n")
    } else if (!normality_ok) {
         cat("Setidaknya satu grup menunjukkan potensi pelanggaran normalitas multivariat.\n")
    } else {
         cat("Uji normalitas multivariat tidak dapat dilakukan pada semua grup karena N kecil.\n")
    }
} else {
    cat("Tidak ada prediktor yang valid untuk uji normalitas.\n")
}
## 
## Uji Normalitas Multivariat untuk grup: Mild Anxiety (N= 354 )
##  Shapiro-Wilk normality test
## 
## data:  Z
## W = 0.9454, p-value = 3.79e-10
## 
## Peringatan: Normalitas multivariat mungkin dilanggar untuk grup Mild Anxiety
## Uji Normalitas Multivariat untuk grup: Minimal Anxiety (N= 115 )
##  Shapiro-Wilk normality test
## 
## data:  Z
## W = 0.75764, p-value = 1.708e-12
## 
## Peringatan: Normalitas multivariat mungkin dilanggar untuk grup Minimal Anxiety
## Uji Normalitas Multivariat untuk grup: Moderate Anxiety (N= 433 )
##  Shapiro-Wilk normality test
## 
## data:  Z
## W = 0.97875, p-value = 5.699e-06
## 
## Peringatan: Normalitas multivariat mungkin dilanggar untuk grup Moderate Anxiety
## Uji Normalitas Multivariat untuk grup: Severe Anxiety (N= 520 )
##  Shapiro-Wilk normality test
## 
## data:  Z
## W = 0.91232, p-value < 2.2e-16
## 
## Peringatan: Normalitas multivariat mungkin dilanggar untuk grup Severe AnxietySetidaknya satu grup menunjukkan potensi pelanggaran normalitas multivariat.

5.2. Uji Homogenitas Matriks Kovarians

if (length(predictor_cols) > 0 && ncol(train_data[, predictor_cols, drop = FALSE]) > 0 && nrow(train_data) > length(predictor_cols)) {
    min_group_size_for_boxM <- min(table(train_data$Anxiety.Label))
    if (min_group_size_for_boxM > length(predictor_cols)) {
        tryCatch({
            box_m_result <- biotools::boxM(train_data[, predictor_cols, drop = FALSE], train_data$Anxiety.Label)
            print(box_m_result)
            if (box_m_result$p.value < 0.05) {
                cat("Peringatan: Asumsi homogenitas matriks kovarians mungkin dilanggar (p < 0.05).")
                cat("Pertimbangkan QDA jika ini terjadi, namun QDA membutuhkan lebih banyak data.")
            } else {
                cat("Asumsi homogenitas matriks kovarians tidak ditolak (p >= 0.05).")
            }
        }, error = function(e) {
            cat(paste("Tidak dapat melakukan Box's M test:", e$message, "\n"))
            cat("Ini sering terjadi jika jumlah observasi per grup sangat kecil relatif terhadap jumlah prediktor atau ada varians nol.")
        })
    } else {
        cat("Tidak dapat melakukan Box's M test karena ukuran grup terlalu kecil relatif terhadap jumlah prediktor")
        cat(paste("Ukuran grup terkecil:", min_group_size_for_boxM, "Jumlah prediktor:", length(predictor_cols) ))
    }
} else {
    cat("Tidak cukup data atau prediktor yang valid untuk Box's M Test.")
}
## 
##  Box's M-test for Homogeneity of Covariance Matrices
## 
## data:  train_data[, predictor_cols, drop = FALSE]
## Chi-Sq (approx.) = 680.26, df = 84, p-value < 2.2e-16
## 
## Peringatan: Asumsi homogenitas matriks kovarians mungkin dilanggar (p < 0.05).Pertimbangkan QDA jika ini terjadi, namun QDA membutuhkan lebih banyak data.

6. Pemodelan Analisis Diskriminan Linear (LDA)

Membangun model klasifikasi LDA berdasarkan data pelatihan.

if (length(predictor_cols) > 0 && ncol(train_data[, predictor_cols, drop = FALSE]) > 0) {
    train_data$Anxiety.Label <- droplevels(train_data$Anxiety.Label)
    near_zero_var_check <- nearZeroVar(train_data[, predictor_cols, drop = FALSE], saveMetrics = TRUE)
    if(any(near_zero_var_check$zeroVar)) {
        cat("Ada prediktor dengan varians nol di data training. Ini akan menyebabkan error pada LDA.")
        print(predictor_cols[near_zero_var_check$zeroVar])
        cat("Anda mungkin perlu menghapus prediktor ini atau memeriksa data Anda")
        lda_model <- NULL 
    } else {
         formula_lda <- as.formula(paste("Anxiety.Label ~", paste(predictor_cols, collapse = " + ")))
         cat("Formula untuk LDA:", deparse(formula_lda), "\n")
         tryCatch({
            lda_model <- lda(formula_lda, data = train_data)
            cat("Model LDA berhasil dibangun.")
            print(lda_model)
         }, error = function(e){
            cat("Error saat membangun model LDA:", e$message)
            cat("Ini bisa terjadi karena kolinearitas sempurna atau masalah data lainnya, terutama dengan N kecil")
            lda_model <- NULL
         })
    }
} else {
    cat("Tidak ada prediktor yang valid untuk membangun model LDA")
    lda_model <- NULL
}
## Formula untuk LDA: Anxiety.Label ~ X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure.. +      X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs.. +      X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure.. +      X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure. +      X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs.. +      X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still. +      X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen. 
## Model LDA berhasil dibangun.Call:
## lda(formula_lda, data = train_data)
## 
## Prior probabilities of groups:
##     Mild Anxiety  Minimal Anxiety Moderate Anxiety   Severe Anxiety 
##       0.24894515       0.08087201       0.30450070       0.36568214 
## 
## Group means:
##                  X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure..
## Mild Anxiety                                                                                         1.101695
## Minimal Anxiety                                                                                      0.226087
## Moderate Anxiety                                                                                     1.750577
## Severe Anxiety                                                                                       2.621154
##                  X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs..
## Mild Anxiety                                                                                            1.0480226
## Minimal Anxiety                                                                                         0.2782609
## Moderate Anxiety                                                                                        1.5866051
## Severe Anxiety                                                                                          2.3096154
##                  X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure..
## Mild Anxiety                                                                                 1.0988701
## Minimal Anxiety                                                                              0.3304348
## Moderate Anxiety                                                                             1.7482679
## Severe Anxiety                                                                               2.4961538
##                  X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure.
## Mild Anxiety                                                                                                1.0762712
## Minimal Anxiety                                                                                             0.2695652
## Moderate Anxiety                                                                                            1.7367206
## Severe Anxiety                                                                                              2.6346154
##                  X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs..
## Mild Anxiety                                                                           1.0903955
## Minimal Anxiety                                                                        0.3217391
## Moderate Anxiety                                                                       1.8775982
## Severe Anxiety                                                                         2.7230769
##                  X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still.
## Mild Anxiety                                                                                                         1.0225989
## Minimal Anxiety                                                                                                      0.3478261
## Moderate Anxiety                                                                                                     1.7898383
## Severe Anxiety                                                                                                       2.6423077
##                  X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen.
## Mild Anxiety                                                                                  0.8954802
## Minimal Anxiety                                                                               0.2608696
## Moderate Anxiety                                                                              1.6766744
## Severe Anxiety                                                                                2.6230769
## 
## Coefficients of linear discriminants:
##                                                                                                                     LD1
## X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure..                  0.6387812
## X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs..              0.4525089
## X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure..                         0.4863428
## X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure.          0.5523989
## X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs..                               0.6486723
## X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still. 0.6149262
## X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen.                        0.5004955
##                                                                                                                      LD2
## X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure..                   0.7718029
## X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs..               0.4062940
## X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure..                          0.2450205
## X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure.           0.2987172
## X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs..                               -0.1729659
## X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still. -0.4859820
## X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen.                        -0.9118508
##                                                                                                                      LD3
## X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure..                   0.2475721
## X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs..               0.1396166
## X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure..                         -0.5773500
## X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure.           0.9332691
## X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs..                               -1.2301636
## X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still. -0.1738745
## X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen.                         0.6356386
## 
## Proportion of trace:
##    LD1    LD2    LD3 
## 0.9984 0.0011 0.0005

7. Analisis Signifikansi dan Kontribusi Variabel

Mengevaluasi pentingnya setiap variabel prediktor dalam membedakan antar kelompok.

if (!is.null(lda_model)) {
  cat("nKoefisien Fungsi Diskriminan Linear (Scaling):")
  print(lda_model$scaling)
  cat("Nilai absolut yang lebih besar menunjukkan kontribusi variabel yang lebih besar terhadap fungsi diskriminan tersebut.")
  
  prop_trace <- lda_model$svd^2 / sum(lda_model$svd^2)
  cat("nProporsi varians yang dijelaskan oleh fungsi diskriminan")
  for (i in 1:length(prop_trace)) {
    cat(paste("LD", i, ": ", round(prop_trace[i] * 100, 2), "%\n", sep = ""))
  }

  lda_pred_train <- predict(lda_model, train_data)
  train_data_lda <- data.frame(train_data, lda_pred_train$x)
  if (ncol(lda_pred_train$x) >= 2) {
    p_lda_scatter <- ggplot(train_data_lda, aes(x = LD1, y = LD2, color = Anxiety.Label)) +
      geom_point(size = 2.5) +
      stat_ellipse(aes(group = Anxiety.Label), type = "norm", level = 0.68)
      labs(title = "Plot Fungsi Diskriminan (Data Training)",
           x = paste0("LD1 (", round(prop_trace[1]*100,1),"%)"),
           y = paste0("LD2 (", round(prop_trace[2]*100,1),"%)")) +
      theme_minimal()
    print(p_lda_scatter)
  } else if (ncol(lda_pred_train$x) == 1) {
    p_lda_density <- ggplot(train_data_lda, aes(x = LD1, fill = Anxiety.Label)) +
      geom_density(alpha = 0.7) +
      labs(title = "Densitas Fungsi Diskriminan Pertama (Data Training)",
           x = paste0("LD1 (", round(prop_trace[1]*100,1),"%)"), y = "Densitas") +
      theme_minimal()
    print(p_lda_density)
  }
  
} else {
  cat("Model LDA tidak dibangun, tidak ada analisis signifikansi variabel")
}
## nKoefisien Fungsi Diskriminan Linear (Scaling):                                                                                                                    LD1
## X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure..                  0.6387812
## X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs..              0.4525089
## X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure..                         0.4863428
## X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure.          0.5523989
## X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs..                               0.6486723
## X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still. 0.6149262
## X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen.                        0.5004955
##                                                                                                                      LD2
## X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure..                   0.7718029
## X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs..               0.4062940
## X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure..                          0.2450205
## X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure.           0.2987172
## X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs..                               -0.1729659
## X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still. -0.4859820
## X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen.                        -0.9118508
##                                                                                                                      LD3
## X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure..                   0.2475721
## X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs..               0.1396166
## X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure..                         -0.5773500
## X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure.           0.9332691
## X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs..                               -1.2301636
## X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still. -0.1738745
## X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen.                         0.6356386
## Nilai absolut yang lebih besar menunjukkan kontribusi variabel yang lebih besar terhadap fungsi diskriminan tersebut.nProporsi varians yang dijelaskan oleh fungsi diskriminanLD1: 99.84%
## LD2: 0.11%
## LD3: 0.05%

8. Evaluasi Performa Model

cat("\n--- 6. Akurasi Model ---\n")
## 
## --- 6. Akurasi Model ---
if (!is.null(lda_model)) {
  # Prediksi pada data test (atau data training jika N sangat kecil)
  lda_pred_test <- predict(lda_model, newdata = test_data)
  
  # Membuat confusion matrix
  cat("\nConfusion Matrix (Data ", ifelse(identical(train_data, test_data), "Training/Evaluasi", "Testing"), "):\n")
  # Pastikan level prediksi dan aktual sama
  predicted_classes <- lda_pred_test$class
  actual_classes <- test_data$Anxiety.Label
  
  # Jika ada level di actual_classes yang tidak ada di predicted_classes (karena tidak terprediksi),
  # atau sebaliknya, confusionMatrix mungkin butuh penyesuaian level.
  # Ini bisa terjadi jika N sangat kecil.
  all_levels <- levels(data_diskriminan$Anxiety.Label) # Gunakan semua level asli
  predicted_classes_factor <- factor(predicted_classes, levels = all_levels)
  actual_classes_factor <- factor(actual_classes, levels = all_levels)
  
  # Hindari error jika salah satu faktor kosong setelah filtering
  if(length(predicted_classes_factor) > 0 && length(actual_classes_factor) > 0){
      cm <- confusionMatrix(data = predicted_classes_factor, reference = actual_classes_factor)
      print(cm)
      
      cat(paste("\nAkurasi Keseluruhan (Overall Accuracy):", round(cm$overall["Accuracy"] * 100, 2), "%\n"))
  } else {
      cat("Tidak dapat membuat confusion matrix karena data prediksi atau aktual kosong.\n")
  }
  
} else {
  cat("Model LDA tidak dibangun, tidak ada evaluasi akurasi.\n")
}
## 
## Confusion Matrix (Data  Testing ):
## Confusion Matrix and Statistics
## 
##                   Reference
## Prediction         Mild Anxiety Minimal Anxiety Moderate Anxiety Severe Anxiety
##   Mild Anxiety              151              11                5              0
##   Minimal Anxiety             0              36                0              0
##   Moderate Anxiety            0               1              180             13
##   Severe Anxiety              0               0                0            209
## 
## Overall Statistics
##                                           
##                Accuracy : 0.9505          
##                  95% CI : (0.9301, 0.9664)
##     No Information Rate : 0.3663          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.9295          
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: Mild Anxiety Class: Minimal Anxiety
## Sensitivity                       1.0000                0.75000
## Specificity                       0.9648                1.00000
## Pos Pred Value                    0.9042                1.00000
## Neg Pred Value                    1.0000                0.97895
## Prevalence                        0.2492                0.07921
## Detection Rate                    0.2492                0.05941
## Detection Prevalence              0.2756                0.05941
## Balanced Accuracy                 0.9824                0.87500
##                      Class: Moderate Anxiety Class: Severe Anxiety
## Sensitivity                           0.9730                0.9414
## Specificity                           0.9667                1.0000
## Pos Pred Value                        0.9278                1.0000
## Neg Pred Value                        0.9879                0.9673
## Prevalence                            0.3053                0.3663
## Detection Rate                        0.2970                0.3449
## Detection Prevalence                  0.3201                0.3449
## Balanced Accuracy                     0.9699                0.9707
## 
## Akurasi Keseluruhan (Overall Accuracy): 95.05 %

9. Visualisasi Batas Keputusan

if (!is.null(lda_model)) {
  cat("Interpretasi hasil analisis diskriminan:")
  cat("1.Asumsi Model: Periksa kembali hasil uji asumsi. Jika asumsi penting (seperti homogenitas matriks kovarians untuk LDA) dilanggar secara signifikan, interpretasi model harus dilakukan dengan hati-hati, terutama dengan N kecil dimana uji bisa tidak stabil.\n")
  cat("2.Fungsi Diskriminan: Lihat bagian 'Koefisien Fungsi Diskriminan Linear (Scaling)'. Variabel dengan koefisien (absolut) terbesar pada suatu fungsi diskriminan memiliki pengaruh paling kuat dalam membedakan grup pada dimensi fungsi tersebut.\n")
  cat("    Proporsi varians yang dijelaskan menunjukkan seberapa baik masing-masing fungsi diskriminan memisahkan grup.\n")
  cat("3.Plot Fungsi Diskriminan: Jika dibuat, plot ini secara visual menunjukkan bagaimana grup-grup terpisah (atau tumpang tindih) dalam ruang diskriminan. Idealnya, titik-titik dari grup yang sama akan mengelompok bersama dan terpisah dari grup lain.\n")
  cat("4.Akurasi Klasifikasi: Confusion matrix dan akurasi keseluruhan (serta metrik per kelas jika ada) menunjukkan seberapa baik model dapat mengklasifikasikan observasi ke dalam grup 'Anxiety.Label' yang benar.\n")
  cat("    Ingat bahwa akurasi yang dievaluasi pada data training (terutama dengan N kecil) cenderung optimistik dan mungkin tidak mencerminkan performa pada data baru.\n")
  cat("5.Peringatan N Kecil: Semua interpretasi harus mempertimbangkan ukuran sampel yang sangat kecil (N=", nrow(data_diskriminan), "). Hasil mungkin tidak stabil dan generalisasinya terbatas. Model bisa jadi sangat dipengaruhi oleh beberapa observasi tertentu.\n")
} else {
  cat("Model LDA tidak berhasil dibangun, sehingga tidak ada interpretasi model yang dapat diberikan.\n")
}
## Interpretasi hasil analisis diskriminan:1.Asumsi Model: Periksa kembali hasil uji asumsi. Jika asumsi penting (seperti homogenitas matriks kovarians untuk LDA) dilanggar secara signifikan, interpretasi model harus dilakukan dengan hati-hati, terutama dengan N kecil dimana uji bisa tidak stabil.
## 2.Fungsi Diskriminan: Lihat bagian 'Koefisien Fungsi Diskriminan Linear (Scaling)'. Variabel dengan koefisien (absolut) terbesar pada suatu fungsi diskriminan memiliki pengaruh paling kuat dalam membedakan grup pada dimensi fungsi tersebut.
##     Proporsi varians yang dijelaskan menunjukkan seberapa baik masing-masing fungsi diskriminan memisahkan grup.
## 3.Plot Fungsi Diskriminan: Jika dibuat, plot ini secara visual menunjukkan bagaimana grup-grup terpisah (atau tumpang tindih) dalam ruang diskriminan. Idealnya, titik-titik dari grup yang sama akan mengelompok bersama dan terpisah dari grup lain.
## 4.Akurasi Klasifikasi: Confusion matrix dan akurasi keseluruhan (serta metrik per kelas jika ada) menunjukkan seberapa baik model dapat mengklasifikasikan observasi ke dalam grup 'Anxiety.Label' yang benar.
##     Ingat bahwa akurasi yang dievaluasi pada data training (terutama dengan N kecil) cenderung optimistik dan mungkin tidak mencerminkan performa pada data baru.
## 5.Peringatan N Kecil: Semua interpretasi harus mempertimbangkan ukuran sampel yang sangat kecil (N= 2028 ). Hasil mungkin tidak stabil dan generalisasinya terbatas. Model bisa jadi sangat dipengaruhi oleh beberapa observasi tertentu.

Logistic Ordinal Regression

1. Pre-Processing

data <- read.csv("C:\\Users\\dimas\\Desktop\\Rstudi\\anxiety_baru.csv")
kolom_yang_dihapus <- c(
  "X1..Age", # Perhatikan bahwa R mungkin mengganti spasi dan karakter khusus di nama kolom
  "X2..Gender",
  "X3..University",
  "X4..Department",
  "X5..Academic.Year",
  "X6..Current.CGPA",
  "X7..Did.you.receive.a.waiver.or.scholarship.at.your.university.",
  "Anxiety.Value"
)
data_setelah_dihapus <- data[, !colnames(data) %in% kolom_yang_dihapus]
print(head(data_setelah_dihapus))
##   X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure..
## 1                                                                                            2
## 2                                                                                            1
## 3                                                                                            0
## 4                                                                                            2
## 5                                                                                            3
## 6                                                                                            0
##   X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs..
## 1                                                                                                2
## 2                                                                                                2
## 3                                                                                                0
## 4                                                                                                1
## 5                                                                                                0
## 6                                                                                                1
##   X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure..
## 1                                                                                     3
## 2                                                                                     2
## 3                                                                                     0
## 4                                                                                     1
## 5                                                                                     3
## 6                                                                                     1
##   X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure.
## 1                                                                                                    2
## 2                                                                                                    1
## 3                                                                                                    0
## 4                                                                                                    1
## 5                                                                                                    3
## 6                                                                                                    2
##   X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs..
## 1                                                                               2
## 2                                                                               1
## 3                                                                               0
## 4                                                                               2
## 5                                                                               1
## 6                                                                               1
##   X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still.
## 1                                                                                                             2
## 2                                                                                                             3
## 3                                                                                                             0
## 4                                                                                                             1
## 5                                                                                                             1
## 6                                                                                                             1
##   X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen.
## 1                                                                                      2
## 2                                                                                      2
## 3                                                                                      0
## 4                                                                                      2
## 5                                                                                      3
## 6                                                                                      0
##      Anxiety.Label
## 1  Minimal Anxiety
## 2 Moderate Anxiety
## 3  Minimal Anxiety
## 4 Moderate Anxiety
## 5  Minimal Anxiety
## 6     Mild Anxiety
level_order <- c("Minimal Anxiety", "Mild Anxiety", "Moderate Anxiety", "Severe Anxiety")
data_setelah_dihapus$Anxiety.Label <- factor(data_setelah_dihapus$Anxiety.Label,
                                             levels = level_order,
                                             ordered = TRUE)

2. Pemodelan Regresi Logistik Ordinal

Membangun model regresi logistik ordinal menggunakan fungsi polr() dengan semua prediktor yang tersisa terhadap Anxiety.Label

model_ordinal <- polr(Anxiety.Label ~ ., data = data_setelah_dihapus, Hess = TRUE)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
cat("\nModel ordinal logistic regression berhasil dibangun.\n")
## 
## Model ordinal logistic regression berhasil dibangun.

3.Interpretasi dan Evaluasi Parameter Model

cat("\nRingkasan Model (Koefisien dan Intercepts):")
## 
## Ringkasan Model (Koefisien dan Intercepts):
print(summary(model_ordinal))
## Call:
## polr(formula = Anxiety.Label ~ ., data = data_setelah_dihapus, 
##     Hess = TRUE)
## 
## Coefficients:
##                                                                                                               Value
## X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure..                  3.891
## X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs..              3.789
## X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure..                         3.755
## X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure.          3.848
## X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs..                               3.863
## X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still. 3.930
## X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen.                        3.654
##                                                                                                               Std. Error
## X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure..                      0.2855
## X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs..                  0.2723
## X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure..                             0.2688
## X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure.              0.2903
## X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs..                                   0.2929
## X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still.     0.2806
## X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen.                            0.2686
##                                                                                                               t value
## X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure..                    13.63
## X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs..                13.91
## X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure..                           13.97
## X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure.            13.26
## X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs..                                 13.19
## X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still.   14.01
## X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen.                          13.60
## 
## Intercepts:
##                                 Value   Std. Error t value
## Minimal Anxiety|Mild Anxiety    17.4202  1.0995    15.8431
## Mild Anxiety|Moderate Anxiety   36.3868  2.1549    16.8852
## Moderate Anxiety|Severe Anxiety 55.5954  3.2747    16.9771
## 
## Residual Deviance: 453.8465 
## AIC: 473.8465
cat("Koefisien (log-odds):")
## Koefisien (log-odds):
koefisien <- coef(model_ordinal)
print(koefisien)
##                  X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure.. 
##                                                                                                      3.890880 
##              X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs.. 
##                                                                                                      3.788577 
##                         X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure.. 
##                                                                                                      3.754837 
##          X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure. 
##                                                                                                      3.847989 
##                               X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs.. 
##                                                                                                      3.863318 
## X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still. 
##                                                                                                      3.930274 
##                        X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen. 
##                                                                                                      3.653530
# Odds Ratios
cat("nOdds Ratios (eksponensial dari koefisien):")
## nOdds Ratios (eksponensial dari koefisien):
print(exp(koefisien))
##                  X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure.. 
##                                                                                                      48.95393 
##              X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs.. 
##                                                                                                      44.19346 
##                         X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure.. 
##                                                                                                      42.72726 
##          X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure. 
##                                                                                                      46.89866 
##                               X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs.. 
##                                                                                                      47.62310 
## X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still. 
##                                                                                                      50.92093 
##                        X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen. 
##                                                                                                      38.61074
cat("Interpretasi Odds Ratio: Untuk setiap kenaikan satu unit pada variabel prediktor, odds untuk berada di kategori yang lebih tinggi dari Anxiety.Label dikalikan dengan nilai Odds Ratio (dengan asumsi variabel lain konstan).")
## Interpretasi Odds Ratio: Untuk setiap kenaikan satu unit pada variabel prediktor, odds untuk berada di kategori yang lebih tinggi dari Anxiety.Label dikalikan dengan nilai Odds Ratio (dengan asumsi variabel lain konstan).
cat("nIntercepts (thresholds/cut-points) pada skala log-odds:")
## nIntercepts (thresholds/cut-points) pada skala log-odds:
print(model_ordinal$zeta)
##    Minimal Anxiety|Mild Anxiety   Mild Anxiety|Moderate Anxiety 
##                        17.42016                        36.38682 
## Moderate Anxiety|Severe Anxiety 
##                        55.59541
if (requireNamespace("DescTools", quietly = TRUE)) {
  cat("\nPseudo R-squared values:\n")

  null_model_for_r2 <- polr(Anxiety.Label ~ 1, data = data_setelah_dihapus, Hess = TRUE)
  mcfadden_r2 <- 1 - (model_ordinal$deviance / null_model_for_r2$deviance) 
  loglik_full <- as.numeric(logLik(model_ordinal))
  loglik_null <- as.numeric(logLik(null_model_for_r2))
  mcfadden_r2_corrected <- 1 - (loglik_full / loglik_null)
  cat(paste("McFadden's Pseudo R-squared:", round(mcfadden_r2_corrected, 4), "\n"))
  n <- nrow(data_setelah_dihapus)
  cox_snell_r2 <- 1 - exp((null_model_for_r2$deviance - model_ordinal$deviance) / n)
  cat(paste("Cox & Snell Pseudo R-squared:", round(cox_snell_r2, 4)))
  nagelkerke_r2 <- cox_snell_r2 / (1 - exp(null_model_for_r2$deviance / n))
  cat(paste("Nagelkerke Pseudo R-squared:", round(nagelkerke_r2, 4)))
} else {
  cat("Install package 'DescTools' untuk perhitungan Pseudo R-squared yang lebih lengkap")
}
## 
## Pseudo R-squared values:
## McFadden's Pseudo R-squared: 0.9125 
## Cox & Snell Pseudo R-squared: -9.3175Nagelkerke Pseudo R-squared: 0.7826

4.Uji Signifikansi Variabel

Melakukan Likelihood Ratio Test (LRT) untuk menguji signifikansi model secara keseluruhan dibandingkan model null (hanya intercept).Menampilkan hasil Wald test (dari ringkasan model) untuk menguji signifikansi masing-masing variabel prediktor, termasuk perhitungan p-value jika tidak otomatis ditampilkan.

null_model <- polr(Anxiety.Label ~ 1, data = data_setelah_dihapus, Hess = TRUE)
lrt_statistic <- null_model$deviance - model_ordinal$deviance
df_lrt <- length(coef(model_ordinal))
p_value_lrt <- pchisq(lrt_statistic, df = df_lrt, lower.tail = FALSE)
cat("\n Uji Signifikansi Parsial (Wald test dari summary model):")
## 
##  Uji Signifikansi Parsial (Wald test dari summary model):
cat(paste("Test Statistic (Chi-squared):", round(lrt_statistic, 3)))
## Test Statistic (Chi-squared): 4733.023
cat(paste("Degrees of Freedom:", df_lrt))
## Degrees of Freedom: 7
cat(paste("P-value:", round(p_value_lrt, 5)))
## P-value: 0
if (p_value_lrt < 0.05) {
  cat("Kesimpulan: Model secara keseluruhan signifikan (p < 0.05), setidaknya satu prediktor berpengaruh signifikan")
} else {
  cat("Kesimpulan: Model secara keseluruhan tidak signifikan (p >= 0.05)")
}
## Kesimpulan: Model secara keseluruhan signifikan (p < 0.05), setidaknya satu prediktor berpengaruh signifikan
cat("Uji Signifikansi Parsial (Wald test dari summary model):")
## Uji Signifikansi Parsial (Wald test dari summary model):
koef_summary <- summary(model_ordinal)$coefficients
p_values_wald <- 2 * (1 - pnorm(abs(koef_summary[, "t value"])))

cat("Tabel koefisien, Std. Error, z-value (t value), dan P-value (Wald test):")
## Tabel koefisien, Std. Error, z-value (t value), dan P-value (Wald test):
coef_table <- as.data.frame(koef_summary)
if (!("Pr(>|t|)" %in% colnames(coef_table)) && !("p.value" %in% colnames(coef_table))) {
   coef_table$"p.value" <- 2 * (1 - pnorm(abs(coef_table$"t value")))
}
print(coef_table)
##                                                                                                                   Value
## X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure..                   3.890880
## X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs..               3.788577
## X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure..                          3.754837
## X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure.           3.847989
## X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs..                                3.863318
## X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still.  3.930274
## X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen.                         3.653530
## Minimal Anxiety|Mild Anxiety                                                                                  17.420157
## Mild Anxiety|Moderate Anxiety                                                                                 36.386818
## Moderate Anxiety|Severe Anxiety                                                                               55.595405
##                                                                                                               Std. Error
## X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure..                   0.2855340
## X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs..               0.2723112
## X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure..                          0.2688003
## X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure.           0.2902582
## X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs..                                0.2928978
## X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still.  0.2805857
## X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen.                         0.2685551
## Minimal Anxiety|Mild Anxiety                                                                                   1.0995440
## Mild Anxiety|Moderate Anxiety                                                                                  2.1549495
## Moderate Anxiety|Severe Anxiety                                                                                3.2747262
##                                                                                                                t value
## X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure..                  13.62668
## X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs..              13.91267
## X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure..                         13.96887
## X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure.          13.25713
## X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs..                               13.18999
## X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still. 14.00739
## X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen.                        13.60440
## Minimal Anxiety|Mild Anxiety                                                                                  15.84307
## Mild Anxiety|Moderate Anxiety                                                                                 16.88523
## Moderate Anxiety|Severe Anxiety                                                                               16.97712
##                                                                                                               p.value
## X1..In.a.semester..how.often.you.felt.nervous..anxious.or.on.edge.due.to.academic.pressure..                        0
## X2..In.a.semester..how.often.have.you.been.unable.to.stop.worrying.about.your.academic.affairs..                    0
## X3..In.a.semester..how.often.have.you.had.trouble.relaxing.due.to.academic.pressure..                               0
## X4..In.a.semester..how.often.have.you.been.easily.annoyed.or.irritated.because.of.academic.pressure.                0
## X5..In.a.semester..how.often.have.you.worried.too.much.about.academic.affairs..                                     0
## X6..In.a.semester..how.often.have.you.been.so.restless.due.to.academic.pressure.that.it.is.hard.to.sit.still.       0
## X7..In.a.semester..how.often.have.you.felt.afraid..as.if.something.awful.might.happen.                              0
## Minimal Anxiety|Mild Anxiety                                                                                        0
## Mild Anxiety|Moderate Anxiety                                                                                       0
## Moderate Anxiety|Severe Anxiety                                                                                     0
cat(" Interpretasi Uji Parsial: Variabel dengan p-value < 0.05 dianggap signifikan secara statistik dalam mempengaruhi log-odds dari Anxiety.Label pada tingkat signifikansi 0.05")
##  Interpretasi Uji Parsial: Variabel dengan p-value < 0.05 dianggap signifikan secara statistik dalam mempengaruhi log-odds dari Anxiety.Label pada tingkat signifikansi 0.05

5. Evaluasi Akurasi Model

Melakukan prediksi kelas pada data yang digunakan untuk training (karena ukuran sampel kecil).Membuat matriks konfusi (confusionMatrix dari paket caret) untuk membandingkan hasil prediksi dengan nilai aktual.Menampilkan matriks konfusi beserta metrik evaluasi keseluruhan (Akurasi) dan metrik per kelas (Sensitivitas, Spesifisitas, dll.).

cat("Akurasi Model ")
## Akurasi Model
predicted_classes <- predict(model_ordinal, newdata = data_setelah_dihapus, type = "class")
actual_classes <- data_setelah_dihapus$Anxiety.Label

cat("\nConfusion Matrix:\n")
## 
## Confusion Matrix:
if (requireNamespace("caret", quietly = TRUE)) {
  confusion_matrix_caret <- confusionMatrix(data = predicted_classes, 
                                            reference = actual_classes)
  print(confusion_matrix_caret)
  
  overall_accuracy <- confusion_matrix_caret$overall["Accuracy"]
  cat(paste("\nAkurasi Keseluruhan (Overall Accuracy):", round(overall_accuracy * 100, 2), "%\n"))
  
  cat("\nMetrik per Kelas (Sensitivity, Specificity, etc.):")
  print(confusion_matrix_caret$byClass)
} else {
  confusion_matrix_manual <- table(Predicted = predicted_classes, Actual = actual_classes)
  print(confusion_matrix_manual)
  accuracy_manual <- sum(diag(confusion_matrix_manual)) / sum(confusion_matrix_manual)
  cat(paste("\nAkurasi Keseluruhan (Overall Accuracy - Manual):", round(accuracy_manual * 100, 2), "%\n"))
  cat("Install package 'caret' untuk metrik evaluasi yang lebih lengkap seperti Sensitivity, Specificity, dll.")
}
## Confusion Matrix and Statistics
## 
##                   Reference
## Prediction         Minimal Anxiety Mild Anxiety Moderate Anxiety Severe Anxiety
##   Minimal Anxiety              159            0                0              0
##   Mild Anxiety                   0          505                0              0
##   Moderate Anxiety               2            0              618              0
##   Severe Anxiety                 2            0                0            742
## 
## Overall Statistics
##                                          
##                Accuracy : 0.998          
##                  95% CI : (0.995, 0.9995)
##     No Information Rate : 0.3659         
##     P-Value [Acc > NIR] : < 2.2e-16      
##                                          
##                   Kappa : 0.9972         
##                                          
##  Mcnemar's Test P-Value : NA             
## 
## Statistics by Class:
## 
##                      Class: Minimal Anxiety Class: Mild Anxiety
## Sensitivity                         0.97546               1.000
## Specificity                         1.00000               1.000
## Pos Pred Value                      1.00000               1.000
## Neg Pred Value                      0.99786               1.000
## Prevalence                          0.08037               0.249
## Detection Rate                      0.07840               0.249
## Detection Prevalence                0.07840               0.249
## Balanced Accuracy                   0.98773               1.000
##                      Class: Moderate Anxiety Class: Severe Anxiety
## Sensitivity                           1.0000                1.0000
## Specificity                           0.9986                0.9984
## Pos Pred Value                        0.9968                0.9973
## Neg Pred Value                        1.0000                1.0000
## Prevalence                            0.3047                0.3659
## Detection Rate                        0.3047                0.3659
## Detection Prevalence                  0.3057                0.3669
## Balanced Accuracy                     0.9993                0.9992
## 
## Akurasi Keseluruhan (Overall Accuracy): 99.8 %
## 
## Metrik per Kelas (Sensitivity, Specificity, etc.):                        Sensitivity Specificity Pos Pred Value Neg Pred Value
## Class: Minimal Anxiety    0.9754601   1.0000000      1.0000000      0.9978598
## Class: Mild Anxiety       1.0000000   1.0000000      1.0000000      1.0000000
## Class: Moderate Anxiety   1.0000000   0.9985816      0.9967742      1.0000000
## Class: Severe Anxiety     1.0000000   0.9984448      0.9973118      1.0000000
##                         Precision    Recall        F1 Prevalence Detection Rate
## Class: Minimal Anxiety  1.0000000 0.9754601 0.9875776 0.08037475     0.07840237
## Class: Mild Anxiety     1.0000000 1.0000000 1.0000000 0.24901381     0.24901381
## Class: Moderate Anxiety 0.9967742 1.0000000 0.9983845 0.30473373     0.30473373
## Class: Severe Anxiety   0.9973118 1.0000000 0.9986541 0.36587771     0.36587771
##                         Detection Prevalence Balanced Accuracy
## Class: Minimal Anxiety            0.07840237         0.9877301
## Class: Mild Anxiety               0.24901381         1.0000000
## Class: Moderate Anxiety           0.30571992         0.9992908
## Class: Severe Anxiety             0.36686391         0.9992224
cat("Selesai ")
## Selesai