library(glmnet)
library(ggplot2)
library(tibble)
library(dplyr)
library(tidyr)

Data Dimensi Besar

set.seed(123)
n <- 50  # Jumlah observasi
p <- 100 # Jumlah variabel (dimensi)
X <- matrix(rnorm(n * p), nrow = n, ncol = p) # Data prediktor
y <- rnorm(n)  # Respon

Mengambil data 70% data training dan 30% data test

# Split data into training and testing sets
train_idx <- sample(1:n, size = 0.7 * n) #mengambil dari angka 1-n, ambil sebanyak 70%
X_train <- X[train_idx, ] #ambil data bangkitan dengan index train_idx (70%)
X_test <- X[-train_idx, ] #semua indeks KECUALI yang ada di train_idx (30%)
y_train <- y[train_idx]
y_test <- y[-train_idx]

Menentukan Lamda untuk Ridge Regression

OLS Regression tidak memiliki regularisasi, sehingga sering kali menghasilkan model yang terlalu kompleks terutama pada data dengan multicollinearity atau ketika jumlah variabel lebih besar daripada jumlah pengamatan.

Ridge Regression menambahkan penalti berdasarkan besar koefisien melalui lambda. Ketika lambda kecil, Ridge Regression mendekati OLS. Namun, saat lambda besar, koefisien Ridge Regression mendekati nol, sehingga mengurangi kompleksitas model dan risiko overfitting.

Melalui cross-validation, dapat menentukan nilai lambda yang memberikan keseimbangan terbaik antara bias dan variance. Ridge Regression sering kali berkinerja lebih baik daripada OLS ketika ada multicollinearity atau variabel yang berlebihan, karena regularisasi dapat menstabilkan perkiraan koefisien.
# Ridge Regression (menggunakan lambda terbaik dari CV)
ridge_model <- glmnet(X, y, alpha = 0)
best_lambda <- cv.glmnet(X, y, alpha = 0)$lambda.min
coef_ridge <- as.vector(coef(ridge_model, s = best_lambda))

# Plot cross-validation untuk pemilihan lambda terbaik
plot(cv.glmnet(X_train, y_train, alpha = 0), main = "Cross-validation Ridge Regression")

Membandingkan Koefisien regresi

# Regresi Linier (OLS)
lm_model <- lm(y ~ X)
coef_lm <- coef(lm_model)

# Tampilkan hasil dalam bentuk tabel
coef_comparison <- tibble(
  Variables = c("(Intercept)", paste0("X", 1:p)),
  OLS_Coef = coef_lm,
  Ridge_Coef = coef_ridge
)

coef_comparison
## # A tibble: 101 × 3
##    Variables   OLS_Coef  Ridge_Coef
##    <chr>          <dbl>       <dbl>
##  1 (Intercept)  -1.06   -0.0387    
##  2 X1           -0.338   0.00130   
##  3 X2           -1.11   -0.00000298
##  4 X3           -1.27    0.000851  
##  5 X4           -0.0262  0.000292  
##  6 X5            0.794   0.000514  
##  7 X6            0.467   0.000673  
##  8 X7           -0.287   0.000158  
##  9 X8            0.351  -0.000957  
## 10 X9            1.76    0.000105  
## # ℹ 91 more rows
# Tabel koefisien
coef_plot <- coef_comparison %>%
  pivot_longer(cols = c(OLS_Coef, Ridge_Coef), names_to = "Model", values_to = "Coefficient")

# Plot koefisien OLS dan Ridge secara berdampingan
ggplot(coef_plot, aes(x = Variables, y = Coefficient, fill = Model)) +
  geom_bar(stat = "identity", position = "dodge") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, size = 5)) +
  labs(title = "Perbandingan Koefisien: OLS vs Ridge", y = "Koefisien", x = "Variabel")

KETERANGAN:

1. Koefisien Ridge Regression

Terlihat pada grafik bahwa koefisien Ridge regression dari 100 variabel semua variabel dapat dihitung koefisiennya.

Ridge Regression menambahkan penalti pada nilai koefisien untuk mengurangi overfitting, terutama ketika ada multicollinearity (hubungan antar variabel) atau ketika ada terlalu banyak variabel dibandingkan jumlah pengamatan.

Penalti ini didasarkan pada ukuran kuadrat koefisien, dan semakin besar nilai lambda (parameter regulasi), semakin kuat penalti yang diterapkan. Akibatnya, koefisien yang kurang signifikan akan diperkecil atau mendekati nol, tetapi tidak sepenuhnya dihilangkan (seperti yang terjadi di Lasso Regression).

Ridge Regression sangat penting karena dalam data dengan banyak variabel yang saling berkorelasi, OLS cenderung memberikan koefisien besar yang tidak stabil, sedangkan Ridge membuat estimasi lebih stabil dengan memberikan bobot yang lebih kecil pada variabel yang tidak terlalu penting.

2. Koefisien Linear Regression

Terlihat pada grafik bahwa koefisien OLS dari 100 variabel hanya ada 50 variabel saja yang muncul.

Ordinary Least Squares (OLS) tidak menggunakan regularisasi, sehingga ia berusaha meminimalkan error tanpa memperhatikan ukuran koefisien. Akibatnya, model OLS bisa memberikan koefisien besar, terutama jika variabel input berkorelasi tinggi atau datanya berisik.

Koefisien besar dalam OLS seringkali menunjukkan overfitting, di mana model sangat sesuai dengan data pelatihan tetapi mungkin tidak bekerja baik pada data baru. Hal ini terutama terjadi ketika jumlah variabel lebih banyak daripada jumlah observasi atau jika ada multicollinearity yang signifikan.

Dengan kata lain, koefisien yang besar di OLS tidak selalu mencerminkan kekuatan variabel dalam menjelaskan target, melainkan refleksi dari ketidakstabilan model.

Membandingkan nilai MSE

# Regresi Linier
lm_model <- lm(y_train ~ X_train)
y_pred_lm <- predict(lm_model, newdata = data.frame(X_train = X_test))
mse_lm <- mean((y_test - y_pred_lm)^2)

# Ridge Regression
ridge_model <- glmnet(X_train, y_train, alpha = 0)
y_pred_ridge <- predict(ridge_model, newx = X_test, s = best_lambda)
mse_ridge <- mean((y_test - y_pred_ridge)^2)

# Tampilkan hasil dalam bentuk tabel
mse_comparison <- tibble(
  Model = c("OLS", "Ridge"),
  MSE = c(mse_lm, mse_ridge)
)
mse_comparison
## # A tibble: 2 × 2
##   Model   MSE
##   <chr> <dbl>
## 1 OLS   2.06 
## 2 Ridge 0.929
# Tabel MSE
mse_plot <- mse_comparison

# Plot perbandingan MSE
ggplot(mse_plot, aes(x = Model, y = MSE, fill = Model)) +
  geom_bar(stat = "identity") +
  labs(title = "Perbandingan MSE: OLS vs Ridge", y = "MSE", x = "Model")

KETERANGAN:

MSE (Mean Squared Error) adalah metrik yang digunakan untuk mengukur seberapa baik model memprediksi data. Dalam konteks regresi, MSE mengukur rata-rata kuadrat dari kesalahan prediksi, yaitu selisih antara nilai aktual dan nilai prediksi yang dihasilkan oleh model. Nilai MSE yang lebih kecil menunjukkan bahwa model tersebut memiliki performa yang lebih baik dalam memprediksi data, sedangkan nilai MSE yang lebih besar menunjukkan model kurang akurat.

  1. Jika MSE Kecil

MSE kecil menunjukkan bahwa model memiliki kesalahan prediksi yang rendah dan berkinerja baik dalam menyesuaikan data. Untuk dataset tertentu, ini bisa berarti model memiliki generalisasi yang baik pada data uji dan tidak hanya mengikuti data pelatihan secara berlebihan.

Jika MSE pada Ridge Regression lebih kecil daripada OLS, ini menunjukkan bahwa Ridge berhasil menekan overfitting yang terjadi pada OLS, dan model lebih mampu menggeneralisasi pada data yang belum dilihat sebelumnya.

  1. Jika MSE Besar

MSE besar berarti model memiliki kesalahan prediksi yang tinggi, yang menunjukkan bahwa model tidak berkinerja baik dalam memprediksi nilai data uji. Ini bisa terjadi jika model mengalami overfitting (terlalu menyesuaikan data pelatihan) atau underfitting (model terlalu sederhana untuk menangkap hubungan antara variabel independen dan dependen).

Jika MSE pada OLS lebih besar, itu mungkin karena OLS tidak menggunakan regulasi, sehingga bisa overfit pada data pelatihan, terutama jika ada multicollinearity atau jumlah variabel yang sangat banyak.