Pada bagian ini, kita menggunakan fungsi read_excel()
dari paket readxl untuk memasukkan data dari file Excel ke
dalam R. Data yang dimasukkan akan diperiksa dengan fungsi
str() untuk melihat struktur data dan dim()
untuk mengecek dimensi dataset yang dimuat. Hal ini penting untuk
memastikan bahwa data yang digunakan dalam analisis regresi sudah
terimpor dengan benar. Peubah yang digunakan adalah sebagai berikut:
\(Y\) = Pertumbuhan Ekonomi
\(X_1\) = Ekspor
\(X_2\) = Investasi
\(X_3\) = Konsumsi Lembaga Sosial Nirlaba
\(X_4\) = Konsumsi Rumah Tangga
\(X_5\) = Pengeluaran Pemerintah
\(X_6\) = Perubahan Inventori
library(readxl) #Memasukkan Data ke R (Excel)
Data <- read_excel("D:/Pertumbuhan Ekonomi SS - 3.xlsx", sheet = "Sheet1")
as.data.frame(Data)
## PertumbuhanEkonomi Ekspor Investasi KonsumsiLSNirlaba KonsumsiRT
## 1 24407.10 15443.83 6070.14 123.15 11919.53
## 2 25835.93 18961.48 5996.57 121.72 12057.78
## 3 26564.60 19064.53 6694.59 133.51 12360.51
## 4 27807.45 19400.01 7164.88 135.14 12394.40
## 5 26831.47 20312.28 4576.75 133.58 12414.77
## 6 28066.35 20089.67 5706.60 132.44 12528.48
## 7 28260.83 17901.09 7936.27 136.87 12866.39
## 8 28607.48 18055.58 10047.08 145.35 12901.03
## 9 29267.50 20468.57 6324.85 152.14 12948.86
## 10 29932.46 20470.82 6627.83 160.82 13072.90
## 11 30164.96 19766.90 7146.25 155.19 13432.43
## 12 30626.52 20225.28 8018.24 157.87 13469.81
## 13 30676.87 23085.90 5684.30 156.79 13477.12
## 14 31217.95 22886.98 6357.61 159.73 13634.46
## 15 31509.67 21722.74 7297.29 165.10 14002.85
## 16 31632.92 20778.02 8495.45 171.97 14020.96
## 17 31779.84 22767.92 6375.99 159.67 14069.16
## 18 32345.92 22689.53 6606.96 163.04 14256.73
## 19 32757.23 22858.57 7529.49 169.51 14630.15
## 20 33618.14 22840.99 8526.54 176.70 14653.54
## 21 33109.12 23727.00 6959.50 160.67 14676.13
## 22 33721.56 24337.50 7091.61 170.95 14946.31
## 23 34301.23 27288.60 7819.14 172.95 15273.60
## 24 35369.80 25198.34 8257.28 181.98 15270.03
## 25 34640.01 26152.61 7285.04 183.54 15292.48
## 26 35338.86 25271.13 7380.88 195.63 15687.74
## 27 35902.43 27907.24 7825.32 198.64 15883.81
## 28 37087.00 29358.29 8274.75 207.66 15921.27
## 29 36263.42 27566.04 7310.77 216.38 15924.14
## 30 37055.64 26926.97 7800.59 221.85 16251.61
## 31 37525.67 28608.31 8215.83 204.03 16490.36
## 32 38419.88 28916.06 8553.74 202.95 16631.70
## PengeluaranPemerintah PerubahanInventori
## 1 1388.04 1617.14
## 2 2083.34 -242.78
## 3 2267.53 -342.07
## 4 3243.64 417.87
## 5 1265.14 754.61
## 6 2137.20 -246.67
## 7 2355.18 681.65
## 8 3438.23 -2357.23
## 9 1540.24 850.70
## 10 2203.98 705.31
## 11 2490.68 809.50
## 12 3565.75 -897.09
## 13 1531.38 514.47
## 14 1792.01 708.80
## 15 2459.89 657.67
## 16 4058.88 -581.94
## 17 1550.05 470.39
## 18 1969.64 691.85
## 19 2244.14 645.95
## 20 3990.58 -551.56
## 21 1563.40 -259.63
## 22 2250.48 784.71
## 23 2393.26 -533.63
## 24 4025.44 689.47
## 25 1357.97 203.52
## 26 2653.49 279.64
## 27 2687.63 589.70
## 28 4043.09 -1070.49
## 29 1407.21 768.28
## 30 2890.90 859.11
## 31 3174.94 -816.81
## 32 4047.44 416.50
str(Data)
## tibble [32 × 7] (S3: tbl_df/tbl/data.frame)
## $ PertumbuhanEkonomi : num [1:32] 24407 25836 26565 27807 26831 ...
## $ Ekspor : num [1:32] 15444 18961 19065 19400 20312 ...
## $ Investasi : num [1:32] 6070 5997 6695 7165 4577 ...
## $ KonsumsiLSNirlaba : num [1:32] 123 122 134 135 134 ...
## $ KonsumsiRT : num [1:32] 11920 12058 12361 12394 12415 ...
## $ PengeluaranPemerintah: num [1:32] 1388 2083 2268 3244 1265 ...
## $ PerubahanInventori : num [1:32] 1617 -243 -342 418 755 ...
dim(Data)
## [1] 32 7
Pada tahap ini, data distandarisasi menggunakan fungsi
scale() untuk mengubah setiap peubah ke dalam skala yang
sama, yaitu rata-rata 0 dan standar deviasi 1. Standarisasi penting
dilakukan terutama jika data memiliki skala yang sangat berbeda-beda,
agar tidak ada peubah yang dominan dalam model analisis.
Data <- as.data.frame(scale(Data))
Data
## PertumbuhanEkonomi Ekspor Investasi KonsumsiLSNirlaba KonsumsiRT
## 1 -2.01351024 -2.028181931 -1.08734228 -1.59791967 -1.59271589
## 2 -1.62930451 -1.064257350 -1.15521863 -1.65064899 -1.49476539
## 3 -1.43336854 -1.036019058 -0.51121909 -1.21590864 -1.28028036
## 4 -1.09917197 -0.944089099 -0.07732530 -1.15580459 -1.25626920
## 5 -1.36160844 -0.694104172 -2.46515734 -1.21332749 -1.24183700
## 6 -1.02955496 -0.755104912 -1.42274756 -1.25536345 -1.16127316
## 7 -0.97726020 -1.354830882 0.63436606 -1.09201318 -0.92186300
## 8 -0.88404763 -1.312496736 2.58181836 -0.77932462 -0.89732047
## 9 -0.70657133 -0.651276781 -0.85234454 -0.52895252 -0.86343278
## 10 -0.52776668 -0.650660225 -0.57281247 -0.20888923 -0.77555010
## 11 -0.46524852 -0.843552011 -0.09451351 -0.41648789 -0.52082212
## 12 -0.34113718 -0.717944361 0.70999232 -0.31766650 -0.49433829
## 13 -0.32759830 0.065937474 -1.44332174 -0.35749005 -0.48915913
## 14 -0.18210441 0.011428390 -0.82211987 -0.24908151 -0.37768332
## 15 -0.10366226 -0.307602654 0.04483736 -0.05107001 -0.11667800
## 16 -0.07052091 -0.566479697 1.15027056 0.20225198 -0.10384701
## 17 -0.03101481 -0.021197044 -0.80516232 -0.25129393 -0.06969718
## 18 0.12120147 -0.042677876 -0.59206732 -0.12702973 0.06319667
## 19 0.23180081 0.003643336 0.25906717 0.11154279 0.32776576
## 20 0.46329549 -0.001174027 1.17895447 0.37666435 0.34433764
## 21 0.32642239 0.241615000 -0.26681074 -0.21442028 0.36034271
## 22 0.49110465 0.408907356 -0.14492486 0.16464085 0.55176598
## 23 0.64697521 1.217582987 0.52630086 0.23838815 0.78365183
## 24 0.93430871 0.644799169 0.93053277 0.57135722 0.78112248
## 25 0.73807158 0.906293152 0.03353540 0.62888012 0.79702836
## 26 0.92598908 0.664745460 0.12195824 1.07468256 1.07707115
## 27 1.07753043 1.387105908 0.53200259 1.18567225 1.21598728
## 28 1.39605578 1.784730107 0.94665075 1.51827258 1.24252779
## 29 1.17459896 1.293608525 0.05727413 1.83981082 1.24456119
## 30 1.38762323 1.118487270 0.50918647 2.04150969 1.47657458
## 31 1.51401210 1.579216722 0.89229063 1.38442123 1.64572960
## 32 1.75446100 1.663547963 1.20404944 1.34459769 1.74586938
## PengeluaranPemerintah PerubahanInventori
## 1 -1.23378386 1.8044167
## 2 -0.46383967 -0.5542618
## 3 -0.25987589 -0.6801775
## 4 0.82102476 0.2835490
## 5 -1.36987784 0.7105896
## 6 -0.40419751 -0.5591949
## 7 -0.16281619 0.6180646
## 8 1.03650504 -3.2357254
## 9 -1.06524438 0.8324472
## 10 -0.33024832 0.6480692
## 11 -0.01276954 0.7801990
## 12 1.17771500 -1.3840324
## 13 -1.07505554 0.4060534
## 14 -0.78644551 0.6524951
## 15 -0.04686501 0.5876540
## 16 1.72378515 -0.9843714
## 17 -1.05438122 0.3501528
## 18 -0.58974598 0.6309998
## 19 -0.28577693 0.5727912
## 20 1.64815278 -0.9458446
## 21 -1.03959803 -0.5756303
## 22 -0.27875630 0.7487613
## 23 -0.12064810 -0.9231065
## 24 1.68675519 0.6279816
## 25 -1.26708204 0.0117186
## 26 0.16751899 0.1082510
## 27 0.20532410 0.5014571
## 28 1.70630001 -1.6039315
## 29 -1.21255586 0.7279254
## 30 0.43041623 0.8431125
## 31 0.74494945 -1.2822244
## 32 1.71111701 0.2818116
Pada bagian ini, dilakukan analisis regresi berganda menggunakan
fungsi lm() untuk membangun model regresi dengan
PertumbuhanEkonomi sebagai peubah respons dan beberapa peubah penjelas.
Hasil model akan diperiksa melalui fungsi summary() untuk
menilai seberapa baik model dalam menjelaskan variasi dalam peubah
respons.
x <- data.matrix(Data[, c('Ekspor', 'Investasi', 'KonsumsiRT','PengeluaranPemerintah'
, 'KonsumsiLSNirlaba', 'PerubahanInventori')])
head(x)
## Ekspor Investasi KonsumsiRT PengeluaranPemerintah KonsumsiLSNirlaba
## [1,] -2.0281819 -1.0873423 -1.592716 -1.2337839 -1.597920
## [2,] -1.0642573 -1.1552186 -1.494765 -0.4638397 -1.650649
## [3,] -1.0360191 -0.5112191 -1.280280 -0.2598759 -1.215909
## [4,] -0.9440891 -0.0773253 -1.256269 0.8210248 -1.155805
## [5,] -0.6941042 -2.4651573 -1.241837 -1.3698778 -1.213327
## [6,] -0.7551049 -1.4227476 -1.161273 -0.4041975 -1.255363
## PerubahanInventori
## [1,] 1.8044167
## [2,] -0.5542618
## [3,] -0.6801775
## [4,] 0.2835490
## [5,] 0.7105896
## [6,] -0.5591949
y <- Data$PertumbuhanEkonomi
head(y)
## [1] -2.013510 -1.629305 -1.433369 -1.099172 -1.361608 -1.029555
model_coba1 <- lm (y~x)
summary (model_coba1)
##
## Call:
## lm(formula = y ~ x)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.31133 -0.07305 0.01199 0.09625 0.15641
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.284e-16 2.331e-02 0.000 1.000
## xEkspor 1.779e-01 1.050e-01 1.694 0.103
## xInvestasi 1.279e-02 6.105e-02 0.209 0.836
## xKonsumsiRT 6.743e-01 1.373e-01 4.910 4.7e-05 ***
## xPengeluaranPemerintah 6.195e-02 3.882e-02 1.596 0.123
## xKonsumsiLSNirlaba 1.257e-01 8.376e-02 1.501 0.146
## xPerubahanInventori 1.315e-02 3.654e-02 0.360 0.722
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1319 on 25 degrees of freedom
## Multiple R-squared: 0.986, Adjusted R-squared: 0.9826
## F-statistic: 293 on 6 and 25 DF, p-value: < 2.2e-16
Regresi terpenalti adalah teknik regresi yang menambahkan penalti (atau regularisasi) pada model untuk mencegah overfitting dan multikolinieritas. Salah satu paket yang sering digunakan untuk analisis regresi terpenalti di R adalah paket glmnet, yang memungkinkan penerapan beberapa jenis regresi terpenalti, seperti Ridge, LASSO, dan Elastic Net. Pada bagian ini, kita akan memulai dengan memuat paket glmnet untuk melakukan analisis regresi terpenalti.
#install.packages("glmnet")
library(glmnet)
## Loading required package: Matrix
## Loaded glmnet 4.1-8
Pada bagian ini, kita menggunakan cross-validation untuk menemukan
nilai parameter penalti lambda yang optimal, yang
meminimalkan Mean Squared Error (MSE). Parameter alpha = 0
menandakan penggunaan Ridge regression dalam model
glmnet.
cv_model <- cv.glmnet(x, y, alpha = 0)
cv_model
##
## Call: cv.glmnet(x = x, y = y, alpha = 0)
##
## Measure: Mean-Squared Error
##
## Lambda Index Measure SE Nonzero
## min 0.09742 100 0.02496 0.006610 6
## 1se 0.22506 91 0.03127 0.008021 6
Kita dapat memvisualisasikan hasil k-fold cross-validation dengan menghasilkan plot yang menunjukkan MSE terhadap nilai lambda yang berbeda. Plot ini membantu untuk melihat bagaimana perubahan nilai lambda mempengaruhi performa model.
plot(cv_model)
Nilai lambda.min adalah nilai lambda yang meminimalkan
MSE. Nilai ini sangat penting untuk memastikan model yang dibangun tidak
terlalu kompleks dan terhindar dari overfitting.
best_lambda <- cv_model$lambda.min
best_lambda
## [1] 0.09742356
Setelah menemukan nilai lambda yang optimal, kita membangun model Ridge menggunakan lambda tersebut dan menganalisis koefisien model yang dihasilkan. Koefisien ini menunjukkan pengaruh relatif dari setiap peubah dalam model.
Model_Ridge <- glmnet(x, y, alpha = 0, lambda = best_lambda)
coef(Model_Ridge)
## 7 x 1 sparse Matrix of class "dgCMatrix"
## s0
## (Intercept) 2.344370e-16
## Ekspor 3.052732e-01
## Investasi 7.807767e-02
## KonsumsiRT 3.732289e-01
## PengeluaranPemerintah 4.618967e-02
## KonsumsiLSNirlaba 2.480943e-01
## PerubahanInventori 3.343132e-02
LASSO (Least Absolute Shrinkage and Selection Operator) adalah metode regresi terpenalti yang menggunakan penalti L1, yang dapat memaksa beberapa koefisien regresi menjadi nol. Ini sangat berguna dalam pemilihan peubah, karena hanya peubah yang penting yang dipertahankan dalam model. ### Melakukan k-fold cross-validation untuk menemukan nilai lambda yang optimal eperti pada regresi Ridge, kita melakukan k-fold cross-validation untuk menemukan nilai lambda yang optimal yang meminimalkan Mean Squared Error (MSE). Pada regresi LASSO, kita menetapkan alpha = 1 untuk menggunakan penalti L1.
cv_model <- cv.glmnet(x, y, alpha = 1)
cv_model
##
## Call: cv.glmnet(x = x, y = y, alpha = 1)
##
## Measure: Mean-Squared Error
##
## Lambda Index Measure SE Nonzero
## min 0.01120 49 0.01981 0.004882 4
## 1se 0.04522 34 0.02432 0.007782 4
Kita dapat memvisualisasikan plot MSE terhadap nilai lambda untuk melihat bagaimana nilai lambda mempengaruhi performa model regresi LASSO.
plot(cv_model)
Nilai lambda.min adalah nilai lambda yang menghasilkan
MSE terendah, yang akan digunakan untuk membangun model final.
best_lambda <- cv_model$lambda.min
best_lambda
## [1] 0.01120134
Dengan nilai lambda optimal, kita membangun model LASSO dan mengekstrak koefisien-koefisien yang menggambarkan kontribusi setiap peubah dalam model.
Model_LASSO <- glmnet(x, y, alpha = 1, lambda = best_lambda)
coef(Model_LASSO)
## 7 x 1 sparse Matrix of class "dgCMatrix"
## s0
## (Intercept) 6.848647e-17
## Ekspor 1.450649e-01
## Investasi .
## KonsumsiRT 6.974179e-01
## PengeluaranPemerintah 5.162239e-02
## KonsumsiLSNirlaba 1.314667e-01
## PerubahanInventori .
Elastic Net adalah kombinasi dari Ridge dan LASSO, di mana penalti L1 dan L2 digabungkan. Ini memberikan fleksibilitas yang lebih besar dalam menangani data dengan banyak peubah berkorelasi. ### Melakukan k-fold cross-validation untuk menemukan nilai lambda yang optimal Seperti sebelumnya, kita melakukan k-fold cross-validation untuk menemukan nilai lambda terbaik, tetapi kali ini menggunakan nilai alpha antara 0 dan 1. Pada regresi Elastic Net, kita biasanya menggunakan nilai alpha sekitar 0.75 untuk menggabungkan aspek penalti L1 dan L2.
cv_model <- cv.glmnet(x, y, alpha = 0.75)
cv_model
##
## Call: cv.glmnet(x = x, y = y, alpha = 0.75)
##
## Measure: Mean-Squared Error
##
## Lambda Index Measure SE Nonzero
## min 0.01639 48 0.01825 0.005417 5
## 1se 0.06617 33 0.02350 0.007792 5
Plot MSE terhadap nilai lambda akan membantu kita untuk melihat bagaimana nilai lambda mempengaruhi performa model Elastic Net.
plot(cv_model)
Sama seperti metode sebelumnya, kita mencari nilai lambda yang meminimalkan MSE dan menggunakannya untuk membangun model final.
best_lambda <- cv_model$lambda.min
best_lambda
## [1] 0.01639128
Setelah menemukan nilai lambda yang optimal, kita membangun model Elastic Net dan mengevaluasi koefisien-koefisiennya untuk memahami kontribusi masing-masing peubah.
Model_Elastic_Net <- glmnet(x, y, alpha = 0.75, lambda = best_lambda)
coef(Model_Elastic_Net)
## 7 x 1 sparse Matrix of class "dgCMatrix"
## s0
## (Intercept) 8.968630e-17
## Ekspor 1.663381e-01
## Investasi 3.033560e-03
## KonsumsiRT 6.502682e-01
## PengeluaranPemerintah 5.086067e-02
## KonsumsiLSNirlaba 1.544110e-01
## PerubahanInventori .