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)
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)
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)
X <- as.matrix(cbind(X0, X1, X2, X4))
b <- solve(t(X)%*%X)%*%t(X)%*%y;round(b,4)
## [,1]
## X0 122.1006
## 0.9242
## 0.6180
## 3.9523
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.
n <- nrow(X)
p <- ncol(X)
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
df <- n-p
df
## [1] 32
y_duga <- b[1] + b[2] * data$X1 + b[3] * data$X2 + b[4] * data$X4
Y <- data.frame(y = data$Y, y_duga = y_duga);head(Y)
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.)
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
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"
KTG <- sum(galat^2)/(n-p);print(paste("KTG",KTG))
## [1] "KTG 727.147978975695"
Fhit <- KTReg/KTG;print(paste("Fhit:",round(Fhit,0)))
## [1] "Fhit: 7"
dbreg <- p-1;print(paste("dbr:",dbreg))
## [1] "dbr: 3"
dbg <- n-p;print(paste("dbg:",dbg))
## [1] "dbg: 32"
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)
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"
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"
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"
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%.
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
anova(reg)
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
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.