Model Regresi
Soal Anstat
Data
Data yang digunakan adalah data Body Fat dengan 3 variabel independent
- 3 Variabel independent tersebut adalah :
- Triceps Skinfold Thickness
- Thigh Circumference
- Midarm Circumference
<- read.xlsx("BodyFat.xlsx") # reading file from class.
DataBodyFat kbl(DataBodyFat)%>% kable_styling() %>% scroll_box(height = "300px")
Triceps | Thigh | Midarm | BodyFat |
---|---|---|---|
19.5 | 43.1 | 29.1 | 11.9 |
24.7 | 49.8 | 28.2 | 22.8 |
30.7 | 51.9 | 37.0 | 18.7 |
29.8 | 54.3 | 31.1 | 20.1 |
19.1 | 42.2 | 30.9 | 12.9 |
25.6 | 53.9 | 23.7 | 21.7 |
31.4 | 58.5 | 27.6 | 27.1 |
27.9 | 52.1 | 30.6 | 25.4 |
22.1 | 49.9 | 23.2 | 21.3 |
25.5 | 53.5 | 24.8 | 19.3 |
31.1 | 56.6 | 30.0 | 25.4 |
30.4 | 56.7 | 28.3 | 27.2 |
18.7 | 46.5 | 23.0 | 11.7 |
19.7 | 44.2 | 28.6 | 17.8 |
14.6 | 42.7 | 21.3 | 12.8 |
29.5 | 54.4 | 30.1 | 23.9 |
27.7 | 55.3 | 25.7 | 22.6 |
30.2 | 58.6 | 24.6 | 25.4 |
22.7 | 48.2 | 27.1 | 14.8 |
25.2 | 51.0 | 27.5 | 21.1 |
str(DataBodyFat)
## 'data.frame': 20 obs. of 4 variables:
## $ Triceps: num 19.5 24.7 30.7 29.8 19.1 25.6 31.4 27.9 22.1 25.5 ...
## $ Thigh : num 43.1 49.8 51.9 54.3 42.2 53.9 58.5 52.1 49.9 53.5 ...
## $ Midarm : num 29.1 28.2 37 31.1 30.9 23.7 27.6 30.6 23.2 24.8 ...
## $ BodyFat: num 11.9 22.8 18.7 20.1 12.9 21.7 27.1 25.4 21.3 19.3 ...
<-DataBodyFat DataBodyFat
Plot Data
ggpairs(DataBodyFat)
Berdasarkan pola diatas dimana titik-titik membentuk suatu garis lurus, diduga variabel
Triceps
memiliki hubungan linier dengan VariabelBodyFat
Berdasarkan pola diatas dimana titik-titik membentuk suatu garis lurus, diduga variabel
Thigh
memiliki hubungan linier dengan VariabelBodyFat
Berdasarkan pola diatas, titik-titik menyebar dan tidak membentuk suatu garis lurus, diduga variabel
Midarm
tidak memiliki hubungan linier dengan VariabelBodyFat
Model Linier (3 Variabel)
<- lm(formula = BodyFat ~ Triceps + Thigh + Midarm, data=DataBodyFat)
Model1 summary(Model1)
##
## Call:
## lm(formula = BodyFat ~ Triceps + Thigh + Midarm, data = DataBodyFat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.7263 -1.6111 0.3923 1.4656 4.1277
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 117.085 99.782 1.173 0.258
## Triceps 4.334 3.016 1.437 0.170
## Thigh -2.857 2.582 -1.106 0.285
## Midarm -2.186 1.595 -1.370 0.190
##
## Residual standard error: 2.48 on 16 degrees of freedom
## Multiple R-squared: 0.8014, Adjusted R-squared: 0.7641
## F-statistic: 21.52 on 3 and 16 DF, p-value: 7.343e-06
<- lm(Triceps ~ Thigh + Midarm, data=DataBodyFat)
Model12 ::vif(Model1) car
## Triceps Thigh Midarm
## 708.8429 564.3434 104.6060
Dari hasil pemodelan tersebut didapatkan nilai Adjusted R-squared sebesar 0.7641. Nilai tersebut menunjukkan adanya hubungan linear dalam model tersebut.
Pengujian parameter koefisien β
- H0 : β1 = β2 = β3 = 0
- H1 : setidaknya ada satu βi yang tidak sama dengan 0
Dari hasil pengujian tersebut, terlihat bahwa nilai p sangat kecil yaitu 7.343e-06. Sehingga cukup bukti untuk menolah Ho dan dapat disimpulkan bahwa secara simultan model signifikan mempengaruhi
Uji Parsial
Ho : βi = 0 H1 : βi ≠0
Hasil uji pada masing masing koefisien menunjukkan nilai t yang kecil sehingga tidak signifikan untuk masing masing koefisien.
Ketika R-Squared tinggi, tetapi koefisien tidak nyata, maka patut dicuragai adanya kolinearitas antara variabel penjelas.
Pemeriksaan Model
VIF
Kolinieritas akan diuji dengan VIF (Variance Inflation Factor). Jika, nilai VIF > 5, maka terjadi multikolinieritas.
vif(Model1)
## Triceps Thigh Midarm
## 708.8429 564.3434 104.6060
Ketiga variabel (Triceps, Thigh, dan Midarm) memiliki nilai VIF > 5 dan nilainya sangat besar sehingga mengindikasikan bahwa ada multikolinieritas
Matriks Korelasi
Uji multikolinieritas dengan VIF > 5 menunjukkan adanya multikolinieritas. Pada data juga sudah diketahui bahwa ada 2 variabel yang berkorelasi kuat. Akan diuji variabel mana yang berkorelasi dengan menggunakan matrik korelasi
<- DataBodyFat
BodyFat <- cor(BodyFat)
mk round(mk,2)
## Triceps Thigh Midarm BodyFat
## Triceps 1.00 0.92 0.46 0.84
## Thigh 0.92 1.00 0.08 0.88
## Midarm 0.46 0.08 1.00 0.14
## BodyFat 0.84 0.88 0.14 1.00
Jika dilihat dari matriksnya, ketiga variabel ini secara berpasangan saling berkorelasi.
ggcorr(DataBodyFat,label = T, size=3, label_size = 3, hjust=0.95)+
labs(
title="Matriks Korelasi Data set"
+
)theme_minimal()+
theme(
plot.title = element_text(hjust = 0.5),
axis.title=element_text(size=8,face="bold"),
axis.text.y=element_blank()
)
Linieritas
=resid(Model1)
residuals<- data.frame(residual = residuals, fitted = DataBodyFat$BodyFat)
linearity %>%
linearity ggplot(aes(fitted, residual)) +
geom_point() +
geom_smooth(method = lm) +
geom_hline(aes(yintercept = 0)) +
theme_minimal()+
labs(
title="Residual Vs Fitted",
caption = "")
## `geom_smooth()` using formula 'y ~ x'
Normalitas Residual
Kenormalan sisaan akan diuji dengan qqplot dan Shapiro Wilk Test
- qq plot
qqPlot(residuals,distribution="norm",main="Normal QQ Plot")
## [1] 14 19
- Uji Shapiro Wilk
shapiro.test(residuals)
##
## Shapiro-Wilk normality test
##
## data: residuals
## W = 0.96603, p-value = 0.6698
Kehomogenan Ragam
Untuk menguji Homoskedastisitas akan digunakan uji Breusch Pagan
bptest(Model1, data=DataBodyFat)
##
## studentized Breusch-Pagan test
##
## data: Model1
## BP = 5.1452, df = 3, p-value = 0.1615
<- data.frame(residual = residuals, fitted = DataBodyFat$BodyFat)
homogen %>%
homogen ggplot(aes(fitted, residual)) +
geom_point() +
geom_smooth(method = "h") +
geom_hline(aes(yintercept = 0)) +
theme_minimal()+
labs(
title="Residual Vs Fitted",
caption = "")
## `geom_smooth()` using formula 'y ~ x'
## Warning: Computation failed in `stat_smooth()`:
## object 'h' of mode 'function' was not found
Outlier
Hat Values
hatvalues(Model1)
## 1 2 3 4 5 6 7
## 0.34120920 0.15653638 0.44042770 0.11242972 0.36109984 0.13151364 0.19433721
## 8 9 10 11 12 13 14
## 0.16418081 0.19278940 0.24051819 0.13935816 0.10929380 0.21357666 0.18808377
## 15 16 17 18 19 20
## 0.34830629 0.11439069 0.12532943 0.22828343 0.13235798 0.06597771
= data.frame(hatv=hatvalues(Model1)) %>% mutate(idx=1:20)
hatval hatval
## hatv idx
## 1 0.34120920 1
## 2 0.15653638 2
## 3 0.44042770 3
## 4 0.11242972 4
## 5 0.36109984 5
## 6 0.13151364 6
## 7 0.19433721 7
## 8 0.16418081 8
## 9 0.19278940 9
## 10 0.24051819 10
## 11 0.13935816 11
## 12 0.10929380 12
## 13 0.21357666 13
## 14 0.18808377 14
## 15 0.34830629 15
## 16 0.11439069 16
## 17 0.12532943 17
## 18 0.22828343 18
## 19 0.13235798 19
## 20 0.06597771 20
= ggplot(data=hatval,
plot aes(x=idx,y=hatv))+ylim(0,0.8)+
geom_point()+
labs(x ="Observation",y="Hat Value ke-i", title = "Hat Values") +
geom_abline(aes(intercept =12/20,slope=0))
plot
Berdasarkan nilai HatValues, tidak ditemukan adanya observation yang melebihi dari 12/20 sehingga tidak mengandung pencilan
Residual Plot
=residuals(Model1)
residualspar(mfrow=c(2,2))
plot(Model1)
Perbaikan Model
Dengan menggunakan regsubsets
maka model yang diajukan ada dua model, yaitu model dengan 1 variabel thigh
dan model dengan 2 variabel prediktor yaitu triceps
dan midarm
<- regsubsets(BodyFat~.,data=DataBodyFat, nvmax = 2)
models summary(models)
## Subset selection object
## Call: regsubsets.formula(BodyFat ~ ., data = DataBodyFat, nvmax = 2)
## 3 Variables (and intercept)
## Forced in Forced out
## Triceps FALSE FALSE
## Thigh FALSE FALSE
## Midarm FALSE FALSE
## 1 subsets of each size up to 2
## Selection Algorithm: exhaustive
## Triceps Thigh Midarm
## 1 ( 1 ) " " "*" " "
## 2 ( 1 ) "*" " " "*"
<- summary(models)
res.sum data.frame(
Adj.R2 = which.max(res.sum$adjr2),
CP = which.min(res.sum$cp),
BIC = which.min(res.sum$bic)
)
## Adj.R2 CP BIC
## 1 2 1 1
# Pemodelan regresi
<- lm(formula = BodyFat ~ Triceps + Midarm, data=DataBodyFat)
Model2 <- lm(formula = BodyFat ~ Thigh , data=DataBodyFat) Model3
# kriteria pemilihan model
=c(AIC(Model1),AIC(Model2),AIC(Model3))
AIC=c(BIC(Model1),BIC(Model2),BIC(Model3))
BIC=c(summary(Model1)[[9]],summary(Model2)[[9]],summary(Model3)[[9]])
AdjRsquared=c(summary(Model1)[[6]],summary(Model2)[[6]],summary(Model3)[[6]])
RSE=c("Model1","Model2","Model3")
Model
=data.frame(Model,AdjRsquared,RSE,AIC,BIC)
Kriteria Kriteria
## Model AdjRsquared RSE AIC BIC
## 1 Model1 0.7641133 2.479981 98.62471 103.6034
## 2 Model2 0.7610022 2.496282 98.09925 102.0822
## 3 Model3 0.7583215 2.510242 97.46550 100.4527
Apabila menginginkan model dengan R-squared yang lebih besar maka dapat menggunakan 2 variabel prediktor, namun jika mencari nilai CP dan BIC yang lebih kecil dapat menggunakan satu variabel prediktor.
Pemilihan Model Baru
Model 2 Variabel
Dengan menggunakan regsubsets
salah satu alternatif yang diberikan adalah model dengan 2 variabel prediktor yaitu triceps
dan midarms
# Pemodelan regresi
<- lm(formula = BodyFat ~ Triceps + Midarm, data=DataBodyFat)
Model2 summary(Model2)
##
## Call:
## lm(formula = BodyFat ~ Triceps + Midarm, data = DataBodyFat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.8794 -1.9627 0.3811 1.2688 3.8942
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.7916 4.4883 1.513 0.1486
## Triceps 1.0006 0.1282 7.803 5.12e-07 ***
## Midarm -0.4314 0.1766 -2.443 0.0258 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.496 on 17 degrees of freedom
## Multiple R-squared: 0.7862, Adjusted R-squared: 0.761
## F-statistic: 31.25 on 2 and 17 DF, p-value: 2.022e-06
Model tersebut dapat dituliskan dengan persamaan:
Y = β0 + β1X1 + β2X2
Body fat
= 6.7916 + 1.006 * Triceps Skinfold Thickness
- 0.4314 * Midarm Circumference
Model memiliki nilai Adjusted R-Squared sebesar 0.761 dan nilai BIC sebesar 102.0822
Residual Plot
=residuals(Model2)
residualspar(mfrow=c(2,2))
plot(Model2)
Model 1 Variabel
Rekomendasi lain yang adalah memasukkan satu variabel prediktor yaitu Thigh
. Sehingga modelnya menjadi:
# Pemodelan regresi
<- lm(formula = BodyFat ~ Thigh , data=DataBodyFat)
Model3summary(Model3)
##
## Call:
## lm(formula = BodyFat ~ Thigh, data = DataBodyFat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4.4949 -1.5671 0.1241 1.3362 4.4084
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -23.6345 5.6574 -4.178 0.000566 ***
## Thigh 0.8565 0.1100 7.786 3.6e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.51 on 18 degrees of freedom
## Multiple R-squared: 0.771, Adjusted R-squared: 0.7583
## F-statistic: 60.62 on 1 and 18 DF, p-value: 3.6e-07
Model tersebut dapat dituliskan dengan persamaan:
Y = β0 + β1X1
Body fat
= -23.6345 + 0.8565 * Thigh Circumference
Model memiliki nilai Adjusted R-Squared sebesar 0.7582 dan nilai BIC sebesar 100.4527
Residual Plot
=residuals(Model3)
residualspar(mfrow=c(2,2))
plot(Model3)
Linieritas
=resid(Model3)
residuals<- data.frame(residual = residuals, fitted = DataBodyFat$BodyFat)
linearity %>%
linearity ggplot(aes(fitted, residual)) +
geom_point() +
geom_smooth(method = lm) +
geom_hline(aes(yintercept = 0)) +
theme_minimal()+
labs(
title="Residual Vs Fitted",
caption = "")
## `geom_smooth()` using formula 'y ~ x'
Normalitas
Kenormalan sisaan akan diuji dengan Shapiro Wilk Test dan qqplot.
- qq plot
qqPlot(residuals,distribution="norm",main="Normal QQ Plot")
## [1] 13 8
- Uji Shapiro Wilk
shapiro.test(residuals)
##
## Shapiro-Wilk normality test
##
## data: residuals
## W = 0.97401, p-value = 0.8363
Kehomogenan Ragam
Untuk menguji Homoskedastisitas akan digunakan uji Breusch Pagan
bptest(Model3, data=DataBodyFat)
##
## studentized Breusch-Pagan test
##
## data: Model3
## BP = 0.85834, df = 1, p-value = 0.3542
<- data.frame(residual = residuals, fitted = DataBodyFat$BodyFat)
homogen %>%
homogen ggplot(aes(fitted, residual)) +
geom_point() +
geom_smooth(method = "h") +
geom_hline(aes(yintercept = 0)) +
theme_minimal()+
labs(
title="Residual Vs Fitted",
caption = "")
## `geom_smooth()` using formula 'y ~ x'
## Warning: Computation failed in `stat_smooth()`:
## object 'h' of mode 'function' was not found
Outlier
Hat Values
hatvalues(Model3)
## 1 2 3 4 5 6 7
## 0.17509056 0.05360511 0.05102358 0.06881768 0.20454764 0.06431538 0.15320136
## 8 9 10 11 12 13 14
## 0.05166128 0.05309803 0.06042772 0.10663399 0.10873916 0.09189009 0.14331319
## 15 16 17 18 19 20
## 0.18779844 0.07003930 0.08276254 0.15603643 0.06694300 0.05005551
= data.frame(hatv=hatvalues(Model3)) %>% mutate(idx=1:20)
hatva hatva
## hatv idx
## 1 0.17509056 1
## 2 0.05360511 2
## 3 0.05102358 3
## 4 0.06881768 4
## 5 0.20454764 5
## 6 0.06431538 6
## 7 0.15320136 7
## 8 0.05166128 8
## 9 0.05309803 9
## 10 0.06042772 10
## 11 0.10663399 11
## 12 0.10873916 12
## 13 0.09189009 13
## 14 0.14331319 14
## 15 0.18779844 15
## 16 0.07003930 16
## 17 0.08276254 17
## 18 0.15603643 18
## 19 0.06694300 19
## 20 0.05005551 20
= ggplot(data=hatva,
plot aes(x=idx,y=hatv))+ylim(0,0.4)+
geom_point()+
labs(x ="Observation",y="Hat Value ke-i", title = "Hat Values") +
geom_abline(aes(intercept =6/20,slope=0))
plot