Menggunakan dataset yang terdapat di R, yaitu dataset mtcars. Dataset mtcars merupakan kumpulan data bawaan di R yang berisi pengukuran pada 7 atribut berbeda untuk200 baris data yang digunakan:
y = Fartility (Kesuburan)
x1 =
Examination (telah menjalani pemeriksaan militer)
x2 = Agriculture (lahan pertanian)
x3 = Catholic(agama Catholic)
x4 =
Infant.Mortality (kematian bayi per 1000 kelahiran.))
data("swiss")
y <- swiss$Fertility
x1 <- swiss$Examination
x2 <- swiss$Agriculture
x3 <- swiss$Catholic
x4 <- swiss$Infant.Mortality
# Sebaran peubah y (Fertility)
hist(y, col = "navy")
boxplot(y, col = "navy")
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.2.3
## Warning: package 'ggplot2' was built under R version 4.2.3
## Warning: package 'tibble' was built under R version 4.2.3
## Warning: package 'tidyr' was built under R version 4.2.3
## Warning: package 'readr' was built under R version 4.2.3
## Warning: package 'dplyr' was built under R version 4.2.3
## Warning: package 'forcats' was built under R version 4.2.3
## Warning: package 'lubridate' was built under R version 4.2.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.2 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.4.2 ✔ tibble 3.2.1
## ✔ lubridate 1.9.2 ✔ tidyr 1.3.0
## ✔ purrr 1.0.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
df <- data.frame(y,x1,x2,x3,x4)
df %>%
as_tibble() %>%
cor() %>%
ggcorrplot::ggcorrplot(type = "upper", lab = TRUE, lab_size = 2, colors = "red") +
theme_minimal() +
labs(title = "Hubungan Antar Peubah",
subtitle = "Peubah respon : kesuburan",
x = NULL, y = NULL)
Dari eksplorasi menggunakan plot di atas, terlihat bahwa peubah
x1, x2, x3, dan x4
memiliki nilai korelasi yang cukup tinggi terhadap y.
Peubah-peubah tersebut yang akan digunakan sebagai peubah penjelas dalam
tahapan analisis berikutnya.Peubah responnya adalah y
modelreg <- lm(y ~ x1 + x2 + x3 + x4)
summary(modelreg)
##
## Call:
## lm(formula = y ~ x1 + x2 + x3 + x4)
##
## Residuals:
## Min 1Q Median 3Q Max
## -23.9194 -3.5530 -0.6489 6.5956 14.1767
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 59.60267 13.04246 4.570 4.25e-05 ***
## x1 -0.96805 0.25284 -3.829 0.000423 ***
## x2 -0.04759 0.08032 -0.593 0.556688
## x3 0.02611 0.03843 0.679 0.500551
## x4 1.39597 0.46259 3.018 0.004315 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8.82 on 42 degrees of freedom
## Multiple R-squared: 0.5448, Adjusted R-squared: 0.5014
## F-statistic: 12.57 on 4 and 42 DF, p-value: 8.272e-07
Didapatkan model regresi klasik dengan R-squared sebesar
54.48%. Model ini memiliki p-value < 0.05 artinya cukup bukti untuk
menyatakan bahwa minimal ada satu peubah penjelas yang berpengaruh
signifikan terhadap peubah respon. Berdasarkan hasil uji t, peubah
penjelas yang berpengaruh yaitu peubah x1 (Examination)
danx4 (catholic).
\[Y=59.60267-0.96805X1-0.04759X2+0.02611x3+1.39597X4\]
Interpretasi:
Intersep: nilai rataan peubah respon
(Fertility) ketika seluruh peubah penjelas bernilai 0
sebesar 40.82854
X1 (Examination): -0.96805, artinya jika
Examination bertambah satu satuan, maka
Fertility turun dengan rata-rata sebesar 0.96805
X2 (Agriculture): -0.04759, artinya jika
Agriculture bertambah satu satuan, maka
Fertility turun dengan rata-rata sebesar 0.04759
X3 (catholic): 0.02611, artinya jika
catholic bertambah satu satuan, maka Fertility
naik dengan rata-rata sebesar 0.02611
X4 (Infant.Mortality): 1.39597, artinya jika
Infant.Mortality bertambah satu satuan, maka
Fertility naik dengan rata-rata sebesa 1.39597
car::vif(modelreg)
## x1 x2 x3 x4
## 2.405776 1.967676 1.518401 1.073400
Metode VIF digunakan untuk mendeteksi multikolinearitas yang terjadi ketika VIF > 10. Diperoleh bahwa tidak terdapat multikolinearitas pada semua peubah.
plot(modelreg, 2);
Dari QQ-Plot tersebut terlihat bahwa titik-titiknya cenderung mengikuti
garis kenormalan. Sehingga dapat disimpulkan bahwa sisaan menyebar
normal
\(H_0 : E[\varepsilon]=0\) \(H_1 : E[\varepsilon]\ne0\)
# Uji t
t.test(resid(modelreg), mu = 0,)
##
## One Sample t-test
##
## data: resid(modelreg)
## t = 2.3297e-17, df = 46, p-value = 1
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -2.474618 2.474618
## sample estimates:
## mean of x
## 2.864139e-17
\(p-value=1 > 0.1\) (tak tolak \(H_0\)), artinya nilai harapan sisaan sama dengan nol
\(H_0: Var[\varepsilon]=\sigma^2I\) \(H_1: Var[\varepsilon]\ne \sigma^2I\)
# Uji Breusch-Pagan
lmtest::bptest(modelreg)
##
## studentized Breusch-Pagan test
##
## data: modelreg
## BP = 7.4079, df = 4, p-value = 0.1158
\(p-value=0.1158 > 0.1\) (tolak \(H_0\)), artinya ragam sisaan homogen
\(H_0 : Cov[\varepsilon_i,\varepsilon_j]=0\) (tidak terjadi autokorelasi pada sisaan) \(H_0 : Cov[\varepsilon_i,\varepsilon_j]\neq0\) (terjadi autokorelasi pada sisaan)
# Uji Durbin Watson
library(lmtest)
## Warning: package 'lmtest' was built under R version 4.2.3
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
dwtest(modelreg)
##
## Durbin-Watson test
##
## data: modelreg
## DW = 1.0238, p-value = 3.723e-05
## alternative hypothesis: true autocorrelation is greater than 0
#ACF dan PACF identifikasi autokorelasi
sisaan = modelreg$residuals
par(mfrow = c(1,2))
acf(sisaan)
pacf(sisaan)
\(p-value= 3.723e-05 < 0.1\) (tolak \(H_0\)), artinya terjadi autkorelasi pada sisaan pada taraf 5%.
backward <- step(modelreg, direction="backward", scope=formula(lm(y ~ x1+x2+x3+x4)), trace=1)
## Start: AIC=209.36
## y ~ x1 + x2 + x3 + x4
##
## Df Sum of Sq RSS AIC
## - x2 1 27.31 3294.9 207.75
## - x3 1 35.92 3303.5 207.87
## <none> 3267.6 209.36
## - x4 1 708.49 3976.1 216.58
## - x1 1 1140.44 4408.0 221.43
##
## Step: AIC=207.75
## y ~ x1 + x3 + x4
##
## Df Sum of Sq RSS AIC
## - x3 1 33.49 3328.4 206.22
## <none> 3294.9 207.75
## - x4 1 794.74 4089.7 215.91
## - x1 1 1507.71 4802.6 223.46
##
## Step: AIC=206.22
## y ~ x1 + x4
##
## Df Sum of Sq RSS AIC
## <none> 3328.4 206.22
## - x4 1 855.16 4183.6 214.97
## - x1 1 2604.04 5932.4 231.39
summary(backward)
##
## Call:
## lm(formula = y ~ x1 + x4)
##
## Residuals:
## Min 1Q Median 3Q Max
## -23.3107 -4.5149 -0.3636 6.5116 14.6796
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 56.0810 9.6026 5.840 5.79e-07 ***
## x1 -0.9493 0.1618 -5.867 5.29e-07 ***
## x4 1.4900 0.4432 3.362 0.00161 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8.697 on 44 degrees of freedom
## Multiple R-squared: 0.5363, Adjusted R-squared: 0.5152
## F-statistic: 25.44 on 2 and 44 DF, p-value: 4.541e-08
forward <- step(lm(y ~ 1), direction="forward", scope=formula(modelreg), trace=1)
## Start: AIC=238.35
## y ~ 1
##
## Df Sum of Sq RSS AIC
## + x1 1 2994.39 4183.6 214.97
## + x3 1 1543.29 5634.7 228.97
## + x4 1 1245.51 5932.4 231.39
## + x2 1 894.84 6283.1 234.09
## <none> 7178.0 238.34
##
## Step: AIC=214.97
## y ~ x1
##
## Df Sum of Sq RSS AIC
## + x4 1 855.16 3328.4 206.22
## <none> 4183.6 214.97
## + x2 1 110.83 4072.7 215.71
## + x3 1 93.91 4089.7 215.91
##
## Step: AIC=206.22
## y ~ x1 + x4
##
## Df Sum of Sq RSS AIC
## <none> 3328.4 206.22
## + x3 1 33.489 3294.9 207.75
## + x2 1 24.881 3303.5 207.87
summary(forward)
##
## Call:
## lm(formula = y ~ x1 + x4)
##
## Residuals:
## Min 1Q Median 3Q Max
## -23.3107 -4.5149 -0.3636 6.5116 14.6796
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 56.0810 9.6026 5.840 5.79e-07 ***
## x1 -0.9493 0.1618 -5.867 5.29e-07 ***
## x4 1.4900 0.4432 3.362 0.00161 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8.697 on 44 degrees of freedom
## Multiple R-squared: 0.5363, Adjusted R-squared: 0.5152
## F-statistic: 25.44 on 2 and 44 DF, p-value: 4.541e-08
stepwise <- step(lm(y ~ 1), direction="both", scope=formula(modelreg), trace=1)
## Start: AIC=238.35
## y ~ 1
##
## Df Sum of Sq RSS AIC
## + x1 1 2994.39 4183.6 214.97
## + x3 1 1543.29 5634.7 228.97
## + x4 1 1245.51 5932.4 231.39
## + x2 1 894.84 6283.1 234.09
## <none> 7178.0 238.34
##
## Step: AIC=214.97
## y ~ x1
##
## Df Sum of Sq RSS AIC
## + x4 1 855.16 3328.4 206.22
## <none> 4183.6 214.97
## + x2 1 110.83 4072.7 215.71
## + x3 1 93.91 4089.7 215.91
## - x1 1 2994.39 7178.0 238.34
##
## Step: AIC=206.22
## y ~ x1 + x4
##
## Df Sum of Sq RSS AIC
## <none> 3328.4 206.22
## + x3 1 33.49 3294.9 207.75
## + x2 1 24.88 3303.5 207.87
## - x4 1 855.16 4183.6 214.97
## - x1 1 2604.04 5932.4 231.39
summary(stepwise)
##
## Call:
## lm(formula = y ~ x1 + x4)
##
## Residuals:
## Min 1Q Median 3Q Max
## -23.3107 -4.5149 -0.3636 6.5116 14.6796
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 56.0810 9.6026 5.840 5.79e-07 ***
## x1 -0.9493 0.1618 -5.867 5.29e-07 ***
## x4 1.4900 0.4432 3.362 0.00161 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8.697 on 44 degrees of freedom
## Multiple R-squared: 0.5363, Adjusted R-squared: 0.5152
## F-statistic: 25.44 on 2 and 44 DF, p-value: 4.541e-08
Seleksi peubah menggunakan metode backward,
forward, dan stepwise hasilnya sama, yaitu menggunakan
peubah x1, x2, x3, dan
x4. \[R-square=
53,63\%\]
lapply(c("glmnet","lmridge"),library,character.only=T)[[1]]
## Warning: package 'glmnet' was built under R version 4.2.3
## Loading required package: Matrix
##
## Attaching package: 'Matrix'
## The following objects are masked from 'package:tidyr':
##
## expand, pack, unpack
## Loaded glmnet 4.1-8
## [1] "glmnet" "Matrix" "lmtest" "zoo" "lubridate" "forcats"
## [7] "stringr" "dplyr" "purrr" "readr" "tidyr" "tibble"
## [13] "ggplot2" "tidyverse" "stats" "graphics" "grDevices" "utils"
## [19] "datasets" "methods" "base"
x <- cbind(x1,x2,x3,x4)
y <- swiss$Fertility
cv.r <- cv.glmnet(x,y,alpha=0);plot(cv.r)
best.lr <- cv.r$lambda.min
bestridge <- glmnet(x,y,alpha=0,lambda=best.lr);coef(bestridge)
## 5 x 1 sparse Matrix of class "dgCMatrix"
## s0
## (Intercept) 57.09085071
## x1 -0.84677851
## x2 -0.02192213
## x3 0.03234276
## x4 1.34357923
Dugaan Model Regresi Ridge:
\[Y=57.09085071-0.84677851X1 -0.02192213X2+0.03234276X3+1.34357923X4\]
Interpretasi:
Intersep: tidak dapat diinterpretasikan nilai
tersebut tidak bermakna
X1 (Examination):-0.84677851, artinya jika
Examination bertambah satu satuan, maka
Fertility turun dengan rata-rata sebesar
-0.84677851
X2 (Agriculture): -0.02192213, artinya jika
Agriculture bertambah satu satuan, maka
Fertility turun dengan rata-rata sebesar
-0.02192213
X3 (catholic):0.03234276, artinya jika
catholic bertambah satu satuan, maka Fertility
naik dengan rata-rata sebesar 0.03234276
X4 (Infant.Mortality): 1.34357923, artinya jika
Infant.Mortality bertambah satu satuan, maka
Fertility naik dengan rata-rata sebesar 1.34357923
rsq <- function(bestmodel,bestlambda,x,y) {
# y duga
y.duga <- predict(bestmodel, s = bestlambda, newx = x)
#JKG dan JKT
jkt <- sum((y-mean(y))^2)
jkg <- sum((y.duga-y)^2)
#find R-Squared
rsq <- 1-jkg/jkt
return(rsq)
}
rsq(bestridge,best.lr,x,y)
## [1] 0.5418479
cv.l <- cv.glmnet(x,y,alpha=1);plot(cv.l)
best.ll <- cv.l$lambda.min
bestlasso <- glmnet(x,y,alpha=1,lambda=best.ll);coef(bestlasso)
## 5 x 1 sparse Matrix of class "dgCMatrix"
## s0
## (Intercept) 57.88784204
## x1 -0.82472514
## x2 .
## x3 0.01738481
## x4 1.26055196
Tidak ada koefisien yang ditampilkan untuk x2 prediktor
karena regresi lasso mengecilkan koefisien hingga nol. Artinya, peubah
tersebut dikeluarkan sepenuhnya dari model karena tidak cukup
berpengaruh. Dugaan Model Regresi Lasso: Lasso: \[Y= 57.33506810- 0.8247251x1+ 0.01738481x3+
1.26055196X4\]
rsq(bestlasso,best.ll ,x,y)
## [1] 0.5355897
lmr <- lmridge(Fertility~Examination+Agriculture+Catholic+Infant.Mortality,data=swiss,scaling="centered")
plot(lmr)
summary(lmr)
##
## Call:
## lmridge.default(formula = Fertility ~ Examination + Agriculture +
## Catholic + Infant.Mortality, data = swiss, scaling = "centered")
##
##
## Coefficients: for Ridge parameter K= 0
## Estimate Estimate (Sc) StdErr (Sc) t-value (Sc) Pr(>|t|)
## Intercept 59.6027 59.6027 11.0471 5.3953 <2e-16 ***
## Examination -0.9680 -0.9680 0.2499 -3.8740 0.0004 ***
## Agriculture -0.0476 -0.0476 0.0794 -0.5995 0.5520
## Catholic 0.0261 0.0261 0.0380 0.6875 0.4955
## Infant.Mortality 1.3960 1.3960 0.4572 3.0534 0.0039 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Ridge Summary
## R2 adj-R2 DF ridge F AIC BIC
## 0.54480 0.51300 3.99998 12.86457 207.35820 395.71569
## Ridge minimum MSE= 0.2792002 at K= 0
## P-value for F-test ( 3.99998 , 43.00004 ) = 5.703745e-07
## -------------------------------------------------------------------
summary(modelreg)$r.squared
## [1] 0.5447723
rsq(bestridge,best.lr,x,y)
## [1] 0.5418479
rsq(bestlasso,best.ll ,x,y)
## [1] 0.5355897
summary(modelreg)$sigma
## [1] 8.820436
# Prediksi model ridge pada data pelatihan
train_predictionsridge <- predict(bestridge,newx = x)
# Hitung residu (selisih antara prediksi dan nilai sebenarnya)
residualsridge <- y - train_predictionsridge
# Hitung varian residu
dfridge <- length(y) - length(bestridge$beta)
residual_varianceridge <- sum(residualsridge^2) / dfridge
# Hitung RSE
rseridge <- sqrt(residual_varianceridge)
# Tampilkan hasil RSE
print(paste("Residual Standard Error (RSE):",rseridge))
## [1] "Residual Standard Error (RSE): 8.74522508529952"
# Prediksi model Lasso pada data pelatihan
train_predictionsLasso <- predict(bestlasso,newx = x)
# Hitung residu (selisih antara prediksi dan nilai sebenarnya)
residualsLasso <- y - train_predictionsLasso
# Hitung varian residu
dfLasso <- length(y) - length(bestlasso$beta)
residual_varianceLasso <- sum(residualsLasso^2) / dfLasso
# Hitung RSE
rseLasso <- sqrt(residual_varianceLasso)
# Tampilkan hasil RSE
print(paste("Residual Standard Error (RSE):",rseLasso))
## [1] "Residual Standard Error (RSE): 8.80475052204174"
| Model | R-Square | Residual Standard Error |
|---|---|---|
| Regresi Klasik | \(54.47\%\) | \(8.820436\) |
| Regresi Ridge | \(54.18\%\) | \(8.74522508529952\) |
| Regresi Lasso | \(53.55\%\) | \(8.80475052204174\) |
Model Regresi klasik memiliki R-Square paling besar dan model ridge RSE paling kecil sehingga model ridge tersebut merupakan model terbaik. Hal tersebut karena adanya multikolinearitas dan tipe data peubah yang digunakan merupakan numerik. Berikut model terbaik yang diperoleh:
\[Y=57.09085071-0.84677851X1 -0.02192213X2+0.03234276X3+1.34357923X4\]
Intersep: nilai rataan peubah respon
(Fertility) ketika seluruh peubah penjelas bernilai 0
sebesar 57.0908507
X1 (Examination): -0.96805, artinya jika
Examination bertambah satu satuan, maka
Fertility turun dengan rata-rata sebesar
-0.84677851
X2 (Agriculture): -0.04759, artinya jika
Agriculture bertambah satu satuan, maka
Fertility turun dengan rata-rata sebesar
-0.02192213
X3 (catholic): 0.02611, artinya jika
catholic bertambah satu satuan, maka Fertility
naik dengan rata-rata sebesar 0.03234276
X4 (Infant.Mortality): 1.39597, artinya jika
Infant.Mortality bertambah satu satuan, maka
Fertility naik dengan rata-rata sebesa 1.343579