Mengimport Data eksternal

Membaca data variabel yang akan digunakan

data <- read.csv("C:/Users/USER/Downloads/data liver.csv", header = TRUE, sep = ",")

dt <- data.frame(
  Y  = data$Y,
  X0 = 1,
  X1 = data$X1,
  X2 = data$X2,
  X4 = data$X4
)

head(dt)

Eksplorasi data

par(mfrow=c(1,2)) 
plot(data$X1, data$Y, pch=19) 
plot(data$X2, data$Y, pch=7) 

plot(data$X4, data$Y, pch=7) 

Pembentukan model (Perhitungan matriks manual)

mempersiapkan data dalam bentuk matriks sebelum melakukan regresi linier berganda.

Variabel Y dikonversi menjadi matriks sebagai respon (dependent variable), sementara variabel X0, X1, X2, dan X4 dikonversi menjadi matriks sebagai prediktor (independent variables).X0 diisi dengan angka 1 untuk menyertakan intersep dalam model regresi.

y <- as.matrix(data$Y)  
X0 <- rep(1, nrow(data))  
X1 <- as.matrix(data$X1)
X2 <- as.matrix(data$X2)
X4 <- as.matrix(data$X4)

menggabungkan variabel-variabel prediktor (X0, X1, X2, X4) menjadi satu matriks desain (X)

X <- as.matrix(cbind(X0, X1, X2, X4))

menghitung koefisien regresi linier berganda menggunakan metode least squares (OLS - Ordinary Least Squares)

b <- solve(t(X)%*%X)%*%t(X)%*%y;round(b,4)
##        [,1]
## X0 122.1006
##      0.9242
##      0.6180
##      3.9523

menyimpan dan menampilkan koefisien regresi

Y = 122.10 + 0.92X1 + 0.62X2 + 3.95X4

b0 <- b[1]
b1 <- b[2]
b2 <- b[3]
b3 <- b[4]
print(paste("b0:",b[1]))
## [1] "b0: 122.1006349907"
print(paste("b1:",b[2]))
## [1] "b1: 0.924234526233408"
print(paste("b2:",b[3]))
## [1] "b2: 0.617950334052231"
print(paste("b3:",b[4]))
## [1] "b3: 3.95233664011293"

interpretasi : b0 = 122.10 (Intercept) : Saat semua variabel independent X1, X2, X4 bernilai 0, nilai prediksi Y adalah 122.10
b1 = 0.92 (Koefisien X1) : Setiap kenaikan 1 unit pada X1 akan meningkatkan Y sebesar 0.92 unit, dengan asumsi variabel lain tetap konstan

b2 = 0.62 (Koefisien X2) : Setiap kenaikan 1 unit pada X2 akan meningkatkan Y sebesar 0.62 unit, dengan asumsi variabel lain tetap konstan.

b3 = 3.95 (Koefisien X4) : Setiap kenaikan 1 unit pada X4 akan meningkatkan Y sebesar 3.95 unit, dengan asumsi variabel lain tetap konstan.

Koefisien determinasi dan penyesuaiannya

Menyimpan jumlah baris dan kolom

n <- nrow(X)  
p <- ncol(X)

Koef. regresi dengan metode OLS

sigma_kuadrat <- (t(y)%*%y-t(b)%*%t(X)%*%y)/(n-p)
Res_se <- sqrt(sigma_kuadrat)
round(Res_se,3)
##        [,1]
## [1,] 26.966

Degree of freedom (derajat bebas)

df <- n-p
df
## [1] 32

Menghitung nilai y_duga

y_duga <- b[1] + b[2] * data$X1 + b[3] * data$X2 + b[4] * data$X4

Membuat data frame baru berisi nilai y dan nilai y_duga

Y <- data.frame(y = data$Y, y_duga = y_duga);head(Y)

Menghitung koefisien determinasi

R_squared <- (cor(y,y_duga))^2;round(R_squared,4)
##       [,1]
## [1,] 0.386

R^2mengukur proporsi variasi dalam variabel dependen y yang dapat dijelaskan oleh variabel independen dalam model. Nilai R^2 sebesar 0.386 menunjukkan bahwa sekitar 38.6% dari variasi dalam y dapat dijelaskan oleh model regresi. Ini menunjukkan bahwa model memiliki kecocokan yang belum cukup baik dengan data (belum cukup baik dalam menjelaskan hubungan antara variabel penjelas dan respons.)

menghitung Adjusted koefisien determinasi

R_squared_adj <- 1-((1-R_squared)*(n-1)/(n-p));round(R_squared_adj,4)
##        [,1]
## [1,] 0.3284

Adjusted R^2 memperhitungkan jumlah variabel independen dalam model dan memberikan penalti untuk model yang terlalu kompleks. Nilai adjusted R^2 sebesar 0.3284 menunjukkan bahwa ada penalti untuk jumlah variabel, model hanya mampu menjelaskan 32.84% dari variasi dalam y (Model ini memiliki kemampuan prediksi yang cukup lemah karena hanya menjelaskan sekitar sepertiga dari variasi dalam data).

#Uji F dan Std.Error parameter regresi

Menghitung galat dan kuadrat tengah regresi

galat <- data$Y - (b[1] + b[2]*data$X1 + b[3]*data$X2 + b[4]*data$X4)
KTReg <- sum((y_duga-mean(y))^2)/(p-1);print(paste("KTR:",KTReg))
## [1] "KTR: 4876.19884277776"

Menghitung kuadrat tengah galat

KTG <- sum(galat^2)/(n-p);print(paste("KTG",KTG))
## [1] "KTG 727.147978975695"

Menghitung F hitung

Fhit <- KTReg/KTG;print(paste("Fhit:",round(Fhit,0)))
## [1] "Fhit: 7"

Menghitung derajat bebas regresi

dbreg <- p-1;print(paste("dbr:",dbreg))
## [1] "dbr: 3"

Menghitung derajat bebas galat

dbg <- n-p;print(paste("dbg:",dbg))
## [1] "dbg: 32"

Menghitung p-value

pf(Fhit, dbreg, dbg, lower.tail = F)
## [1] 0.001223205

H0 : b1 = b2 = b3 = 0 (peubah penjelas xj tidak berpengaruh terhadap peubah respon)

H1 : bj != 0, j = 1,2,3 (setidaknya ada satu peubah penjelas xj yang berpengaruh secara signifikan terhadap peubah respon)

P-value = 0.0012 P-value < 0,05, maka tolak H0, artinya cukup bukti untuk menyatakan setidaknya ada satu peubah penjelas yang berpengaruh secara signifikan terhadap peubah respon)

Standar error koefisien regresi

se_b <- sqrt(sigma_kuadrat[1]*solve(t(X)%*%X))
## Warning in sqrt(sigma_kuadrat[1] * solve(t(X) %*% X)): NaNs produced
se_b
##           X0                             
## X0 11.998293       NaN 1.1829188      NaN
##          NaN 0.8126577       NaN      NaN
##     1.182919       NaN 0.9055069      NaN
##          NaN       NaN       NaN 1.811898
se_b0 <- se_b[1,1];print(paste("se_b0:",round(se_b0,4)))
## [1] "se_b0: 11.9983"
se_b1 <- se_b[2,2];print(paste("se_b1:",round(se_b1,4)))
## [1] "se_b1: 0.8127"
se_b2 <- se_b[3,3];print(paste("se_b2:",round(se_b2,4)))
## [1] "se_b2: 0.9055"
se_b3 <- se_b[4,4];print(paste("se_b3:",round(se_b3,4)))
## [1] "se_b3: 1.8119"

Signifikansi Parameter (nilai-t)

t-value

t_b0 <- b0/se_b0;print(paste("t_b0:",round(t_b0,2)))
## [1] "t_b0: 10.18"
t_b1 <- b1/se_b1;print(paste("t_b1:",round(t_b1,2)))
## [1] "t_b1: 1.14"
t_b2 <- b2/se_b2;print(paste("t_b2:",round(t_b2,2)))
## [1] "t_b2: 0.68"
t_b2 <- b2/se_b2;print(paste("t_b2:",round(t_b2,2)))
## [1] "t_b2: 0.68"
t_b3 <- b2/se_b3;print(paste("t_b3:",round(t_b3,2)))
## [1] "t_b3: 0.34"

p-value

print(paste("p_b0:",2*pt(-abs(t_b0),df <- n-p)))
## [1] "p_b0: 1.47506344832897e-11"
print(paste("p_b1:",2*pt(-abs(t_b1),df <- n-p)))
## [1] "p_b1: 0.263858037514289"
print(paste("p_b2:",2*pt(-abs(t_b2),df <- n-p)))
## [1] "p_b2: 0.499874045483506"
print(paste("p_b3:",2*pt(-abs(t_b3),df <- n-p)))
## [1] "p_b3: 0.735294176287717"

Selang Kepercayaan (1-alfa)*100%

Menentukan titik kritis, menghitung batas bawah dan batas atas untuk koefisien regresi, dan menyusul hasil selang kepercayaan

t <- qt(.975, df <- n-p)

BB_b0 <- b0-t*se_b0
BA_b0 <- b0+t*se_b0

BB_b1 <- b1-t*se_b1
BA_b1 <- b1+t*se_b1

BB_b2 <- b2-t*se_b2
BA_b2 <- b2+t*se_b2

BB_b3 <- b2-t*se_b3
BA_b3 <- b2+t*se_b3

Batas.Bawah <- as.matrix(c(round(BB_b0,6),round(BB_b1,6),round(BB_b2,6),round(BB_b3,6)))
Batas.Atas <- as.matrix(c(round(BA_b0,6),round(BA_b1,6),round(BA_b2,6),round(BA_b3,6)))
Fit <- (c(round(b0,6),round(b1,6),round(b2,6),round(b3,6)))

Selang.Kepercayaan <- cbind(Batas.Bawah, Fit, Batas.Atas)
colnames(Selang.Kepercayaan ) <- c("Batas bawah Selang (2.5%)", "Fit", "Batas atas Selang (97.5%)")
rownames(Selang.Kepercayaan ) <- c("Intersep", "b1", "b2", "b3")
Selang.Kepercayaan
##          Batas bawah Selang (2.5%)        Fit Batas atas Selang (97.5%)
## Intersep                 97.660912 122.100635                146.540358
## b1                       -0.731095   0.924235                  2.579564
## b2                       -1.226507   0.617950                  2.462407
## b3                       -3.072766   3.952337                  4.308667

kesimpulan

b0 : Selang kepercayaan 95%: [97.661, 146.540], Artinya, jika kita mengambil banyak sampel dan menghitung regresi berulang kali, maka 95% dari selang kepercayaan tersebut akan mencakup nilai sebenarnya dari intersep

b1 : Selang kepercayaan 95%: [-0.731, 2.580], Karena selang kepercayaan mencakup nol, maka b1 tidak signifikan secara statistik pada tingkat kepercayaan 95%.

b2 : Selang kepercayaan 95%: [-1.227, 2.462],karena selang mencakup nol, maka b2 juga tidak signifikan secara statistik pada tingkat kepercayaan 95%.

b3 : Selang kepercayaan 95%: [-3.073, 4.309],karena selang mencakup nol, maka b2 juga tidak signifikan secara statistik pada tingkat kepercayaan 95%.

Pembentukan model (Fungsi lm())

reg <- lm(y~X1+X2+X4, data=dt)
summary(reg)
## 
## Call:
## lm(formula = y ~ X1 + X2 + X4, data = dt)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -45.799 -16.805  -1.352   9.696  51.355 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 122.1006    11.9983  10.177 1.48e-11 ***
## X1            0.9242     0.8127   1.137   0.2639    
## X2            0.6180     0.9055   0.682   0.4999    
## X4            3.9523     1.8119   2.181   0.0366 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 26.97 on 32 degrees of freedom
## Multiple R-squared:  0.386,  Adjusted R-squared:  0.3284 
## F-statistic: 6.706 on 3 and 32 DF,  p-value: 0.001223

Melakukan uji anova

anova(reg)

Menghitung selang kepercayaan 95%

confint(reg)
##                  2.5 %     97.5 %
## (Intercept) 97.6609117 146.540358
## X1          -0.7310951   2.579564
## X2          -1.2265068   2.462407
## X4           0.2616205   7.643053

Perbandingan manual (matriks) dan fungsi lm()

koef <- as.matrix(reg$coefficients)
penduga <- cbind(b, koef)
colnames(penduga) <- c('matriks', 'fungsi lm')
rownames(penduga) <- c("intersep", "b1", "b2", "b3")
penduga
##              matriks   fungsi lm
## intersep 122.1006350 122.1006350
## b1         0.9242345   0.9242345
## b2         0.6179503   0.6179503
## b3         3.9523366   3.9523366

Berdasar perbandingan ini diperoleh hasil yang sama yang artinya penggunaan matriks secara manual sudah tepat dalam memodelkan regresi linear berganda bergitu pula sebaliknya.