Latihan S2

# Membuat data
set.seed(12345)

n <- 100

# Membangkitkan X1, X2, dan X3 dari Normal(mu = 2, sigma^2 = 1.5)
X1 <- rnorm(n, mean = 2, sd = sqrt(1.5))
X2 <- rnorm(n, mean = 2, sd = sqrt(1.5))
X3 <- rnorm(n, mean = 2, sd = sqrt(1.5))

# Membangkitkan error berdistribusi Normal(0,1)
eps4 <- rnorm(n, mean = 0, sd = 1)
eps5 <- rnorm(n, mean = 0, sd = 1)
epsY <- rnorm(n, mean = 0, sd = 1)

# Membentuk X4 dan X5
X4 <- (0.6 * X1)^2 + eps4
X5 <- 0.7 * X1 + eps5

# Menentukan nilai koefisien regresi
beta0 <- 1
beta1 <- 3
beta2 <- 3
beta3 <- 0
beta4 <- 4
beta5 <- 4

# Membentuk variabel Y
Y <- beta0 + beta1*X1 + beta2*X2 +
  beta3*X3 + beta4*X4 + beta5*X5 + epsY

# Menyimpan data sebagai DATAKU
DATAKU <- data.frame(Y, X1, X2, X3, X4, X5)

# Melihat beberapa data pertama
head(DATAKU)
##           Y         X1        X2        X3         X4          X5
## 1 37.393909  2.7171234 2.2742515 0.2410879 3.18007565 2.529951505
## 2 28.824451  2.8689149 0.5839214 1.2293175 2.97283586 2.010384357
## 3 24.250471  1.8661313 2.5173549 2.2982520 0.81315441 1.590669651
## 4 13.368997  1.4445817 0.3775128 3.2962237 1.95074336 0.009428078
## 5 34.641469  2.7420576 2.1727923 3.0181902 2.58932818 1.302218359
## 6  7.093114 -0.2265322 1.3434780 2.1288576 0.05668386 0.669621666
# Melihat ringkasan data
summary(DATAKU)
##        Y                X1                X2                X3         
##  Min.   :-6.081   Min.   :-0.9153   Min.   :-0.6008   Min.   :-0.8047  
##  1st Qu.:16.556   1st Qu.: 1.2773   1st Qu.: 1.3718   1st Qu.: 1.2074  
##  Median :31.225   Median : 2.5924   Median : 2.0318   Median : 2.0165  
##  Mean   :31.521   Mean   : 2.3003   Mean   : 2.0554   Mean   : 1.9434  
##  3rd Qu.:45.303   3rd Qu.: 3.1027   3rd Qu.: 2.8553   3rd Qu.: 2.7731  
##  Max.   :76.204   Max.   : 5.0338   Max.   : 5.2527   Max.   : 5.3649  
##        X4                X5         
##  Min.   :-2.1853   Min.   :-1.7363  
##  1st Qu.: 0.8335   1st Qu.: 0.5684  
##  Median : 2.4555   Median : 1.7569  
##  Mean   : 2.7845   Mean   : 1.5630  
##  3rd Qu.: 4.1171   3rd Qu.: 2.5431  
##  Max.   : 9.0648   Max.   : 4.0981
# Least Squares
# Membentuk model regresi linear dengan seluruh prediktor
LS <- lm(Y ~ X1 + X2 + X3 + X4 + X5,
         data = DATAKU)

# Melihat hasil model Least Squares
summary(LS)
## 
## Call:
## lm(formula = Y ~ X1 + X2 + X3 + X4 + X5, data = DATAKU)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.6085 -0.6144 -0.0071  0.7052  3.3449 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.73007    0.35205   2.074   0.0408 *  
## X1           2.79490    0.20286  13.778   <2e-16 ***
## X2           3.11461    0.09108  34.197   <2e-16 ***
## X3           0.05665    0.10019   0.565   0.5731    
## X4           4.05465    0.09353  43.353   <2e-16 ***
## X5           4.19708    0.12597  33.317   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.094 on 94 degrees of freedom
## Multiple R-squared:  0.9968, Adjusted R-squared:  0.9967 
## F-statistic:  5907 on 5 and 94 DF,  p-value: < 2.2e-16
# Melihat koefisien Least Squares
coef(LS)
## (Intercept)          X1          X2          X3          X4          X5 
##  0.73007015  2.79490198  3.11460931  0.05665268  4.05464915  4.19708036
# Ridge Regression
# Memanggil paket glmnet
library(glmnet)
## Warning: package 'glmnet' was built under R version 4.5.3
## Loading required package: Matrix
## Loaded glmnet 5.0
# Menentukan matriks prediktor dan variabel respon
X <- as.matrix(DATAKU[, c("X1", "X2", "X3", "X4", "X5")])
Y <- DATAKU$Y

# Membentuk model Ridge
# alpha = 0 menunjukkan Ridge
ridge <- glmnet(X, Y, alpha = 0)

# Plot jalur koefisien Ridge
plot(ridge)

# Cross-validation untuk menentukan lambda terbaik
cv.ridge <- cv.glmnet(X, Y, alpha = 0)

# Plot hasil cross-validation
plot(cv.ridge)

# Lambda terbaik Ridge
cv.ridge$lambda.min
## [1] 1.773819
# Membentuk model Ridge dengan lambda terbaik
ridge.best <- glmnet(X, Y,
                     alpha = 0,
                     lambda = cv.ridge$lambda.min)

# Melihat koefisien Ridge
coef(ridge.best)
## 6 x 1 sparse Matrix of class "dgCMatrix"
##                     s0
## (Intercept)  1.6576394
## X1           3.8775579
## X2           2.8708141
## X3          -0.1639049
## X4           3.3366325
## X5           3.8842437
# LASSO Regression
# Membentuk model LASSO
# alpha = 1 menunjukkan LASSO
lasso <- glmnet(X, Y, alpha = 1)

# Plot jalur koefisien LASSO
plot(lasso)

# Cross-validation untuk menentukan lambda terbaik
cv.lasso <- cv.glmnet(X, Y, alpha = 1)

# Plot hasil cross-validation
plot(cv.lasso)

# Lambda terbaik LASSO
cv.lasso$lambda.min
## [1] 0.0882834
# Membentuk model LASSO dengan lambda terbaik
lasso.best <- glmnet(X, Y,
                     alpha = 1,
                     lambda = cv.lasso$lambda.min)

# Melihat koefisien LASSO
coef(lasso.best)
## 6 x 1 sparse Matrix of class "dgCMatrix"
##                   s0
## (Intercept) 1.088174
## X1          2.837117
## X2          3.038536
## X3          .       
## X4          4.021203
## X5          4.135903
# Perbandingan koefisien ketiga metode
hasil_perbandingan <- data.frame(
  Variabel = c("(Intercept)", "X1", "X2", "X3", "X4", "X5"),
  Least_Squares = as.numeric(coef(LS)),
  Ridge = as.numeric(coef(ridge.best)),
  LASSO = as.numeric(coef(lasso.best))
)

# Menampilkan perbandingan koefisien
hasil_perbandingan
##      Variabel Least_Squares      Ridge    LASSO
## 1 (Intercept)    0.73007015  1.6576394 1.088174
## 2          X1    2.79490198  3.8775579 2.837117
## 3          X2    3.11460931  2.8708141 3.038536
## 4          X3    0.05665268 -0.1639049 0.000000
## 5          X4    4.05464915  3.3366325 4.021203
## 6          X5    4.19708036  3.8842437 4.135903
# Prediksi menggunakan ketiga metode
pred_LS <- predict(LS, newdata = DATAKU)
pred_Ridge <- predict(ridge.best, newx = X)
pred_LASSO <- predict(lasso.best, newx = X)

# Menghitung MSE
MSE_LS <- mean((Y - pred_LS)^2)
MSE_Ridge <- mean((Y - pred_Ridge)^2)
MSE_LASSO <- mean((Y - pred_LASSO)^2)

# Menghitung RMSE
RMSE_LS <- sqrt(MSE_LS)
RMSE_Ridge <- sqrt(MSE_Ridge)
RMSE_LASSO <- sqrt(MSE_LASSO)

# Membandingkan MSE dan RMSE
hasil_error <- data.frame(
  Metode = c("Least Squares", "Ridge", "LASSO"),
  MSE = c(MSE_LS, MSE_Ridge, MSE_LASSO),
  RMSE = c(RMSE_LS, RMSE_Ridge, RMSE_LASSO)
)

hasil_error
##          Metode      MSE     RMSE
## 1 Least Squares 1.125471 1.060882
## 2         Ridge 2.202041 1.483928
## 3         LASSO 1.146074 1.070548
# R-squared dan Adjusted R-squared untuk Least Squares
summary(LS)$r.squared
## [1] 0.9968274
summary(LS)$adj.r.squared
## [1] 0.9966587