● DATA

Dataset yang kita gunakan untuk analisis regresi sederhana kali ini adalah dataset rmr. Dataset rmr adalah data yang berisi kolom berat badan (body weight) dan kolom tingkat metabolisme (metabolic rate). Kita akan menganalisis apakah ada hubungan linear antara berat badan (X) dengan tingkat metabolisme (Y)

Kalian dapat mendownload dataset nya di sini:

Input Data

rmr <- read.csv('C:/dataset/rmr.csv') #Menginput dan menyimpan data menjadi sebuah variabel
head(rmr) #Melihat 6 baris pertama pada data
##   body.weight metabolic.rate
## 1        49.9           1079
## 2        50.8           1146
## 3        51.8           1115
## 4        52.6           1161
## 5        57.6           1325
## 6        61.4           1351

Pada dataset terdapat dua variabel, yaitu Body Weight dan Metabolic Rate, di mana;

  • Body Weight : variabel independen / variabel bebas (X)
  • Metabolic Rate : variabel dependen / variabel terikat (Y)

Identifikasi Kelengkapan Baris

complete.cases(rmr)
##  [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [16] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [31] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

Semua baris TRUE, yang berarti semua baris lengkap alias tidak ada baris yang berisi data hilang (NA)

Scatter Plot

plot(rmr$body.weight, 
     rmr$metabolic.rate,
     xlab="Body Weight",
     ylab="Metabolic Rate",
     pch=21,
     main = "Body Weight vs Metabolic Rate",
     panel.first = rect(par("usr")[1], #sumbu x kiri
                        par("usr")[3], #sumbu y bawah
                        par("usr")[2], #sumbu x kanan
                        par("usr")[4], #sumbu y atas
                        col = "lightpink"),
     bg = "lightblue",
     col = "red2",
     col.main = "lightpink3",
     col.lab = "lightblue3",
     col.axis = "red2")

● PERSAMAAN REGRESI DUGAAN

Estimasi Parameter Regresi dengan Metode MKT Manual

rmr$xdif <- rmr$body.weight-mean(rmr$body.weight)           #Xi - X mean
rmr$ydif <- rmr$metabolic.rate-mean(rmr$metabolic.rate)     #Yi - Y mean
rmr$crp <- rmr$xdif * rmr$ydif                              #(Xi - X mean)(Yi - Y mean)
rmr$xsq <- rmr$xdif^2                                       #(Xi - X mean)^2
head(rmr)
##   body.weight metabolic.rate      xdif       ydif       crp      xsq
## 1        49.9           1079 -24.97955 -260.84091 6515.6873 623.9777
## 2        50.8           1146 -24.07955 -193.84091 4667.6010 579.8245
## 3        51.8           1115 -23.07955 -224.84091 5189.2260 532.6654
## 4        52.6           1161 -22.27955 -178.84091 3984.4942 496.3781
## 5        57.6           1325 -17.27955  -14.84091  256.4442 298.5827
## 6        61.4           1351 -13.47955   11.15909 -150.4195 181.6981
b1 <- sum(rmr$crp)/sum(rmr$xsq) #Slope
b1
## [1] 7.059528
b0 <- mean(rmr$metabolic.rate) - (b1*mean(rmr$body.weight)) #Intercept
b0
## [1] 811.2267
persamaan_regresi_dugaan <- cat("persamaan regresi dugaan dari data tersebut adalah :", "\n","y =", b0,"+", b1,"x")
## persamaan regresi dugaan dari data tersebut adalah : 
##  y = 811.2267 + 7.059528 x

Estimasi Parameter Regresi dengan Fungsi Bawaan R

regresi_rmr <- lm(metabolic.rate ~ body.weight, data=rmr)
summary(regresi_rmr)
## 
## Call:
## lm(formula = metabolic.rate ~ body.weight, data = rmr)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -245.74 -113.99  -32.05  104.96  484.81 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 811.2267    76.9755  10.539 2.29e-13 ***
## body.weight   7.0595     0.9776   7.221 7.03e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 157.9 on 42 degrees of freedom
## Multiple R-squared:  0.5539, Adjusted R-squared:  0.5433 
## F-statistic: 52.15 on 1 and 42 DF,  p-value: 7.025e-09

Estimasi parameter regresi nya :

regresi_rmr
## 
## Call:
## lm(formula = metabolic.rate ~ body.weight, data = rmr)
## 
## Coefficients:
## (Intercept)  body.weight  
##      811.23         7.06
persamaan_regresi_dugaan <- cat("persamaan regresi dugaan dari data tersebut adalah :", "\n","y =", regresi_rmr$coefficients[1],"+", regresi_rmr$coefficients[2],"x")
## persamaan regresi dugaan dari data tersebut adalah : 
##  y = 811.2267 + 7.059528 x

● Analisis Variansi

rmr$ytopi <- regresi_rmr$fitted.values #Metabolic Rate dugaan dari persamaan regresi dugaan yang didapat
rmr$Galat <- regresi_rmr$residuals #selisih antara nilai aktual (data pengamatan) dan nilai prediksi yang dihasilkan oleh model regresi
head(rmr)
##   body.weight metabolic.rate      xdif       ydif       crp      xsq    ytopi
## 1        49.9           1079 -24.97955 -260.84091 6515.6873 623.9777 1163.497
## 2        50.8           1146 -24.07955 -193.84091 4667.6010 579.8245 1169.851
## 3        51.8           1115 -23.07955 -224.84091 5189.2260 532.6654 1176.910
## 4        52.6           1161 -22.27955 -178.84091 3984.4942 496.3781 1182.558
## 5        57.6           1325 -17.27955  -14.84091  256.4442 298.5827 1217.855
## 6        61.4           1351 -13.47955   11.15909 -150.4195 181.6981 1244.682
##       Galat
## 1 -84.49711
## 2 -23.85069
## 3 -61.91022
## 4 -21.55784
## 5 107.14452
## 6 106.31832
JKR <- sum((rmr$ytopi - mean(rmr$metabolic.rate))^2) #Jumlah Kuadrat Regresi
JKR
## [1] 1300241
JKG <- sum((rmr$metabolic.rate - rmr$ytopi)^2) #Jumlah Kuadrat Galat
JKG
## [1] 1047231
JKT <- JKG + JKR #Jumlah Kuadrat Total

n <- nrow(rmr)
df_regesi <- 1 #Derajat bebas regresi
df_galat <- n - 2 #Derajat bebas galat

KTR <- JKR / df_regesi #Kuadrat Tengah Regresi
KTR
## [1] 1300241
KTG <- JKG / df_galat #Kuadrat Tengah Galat
KTG
## [1] 24934.06
Fhitung <- KTR / KTG
Fhitung
## [1] 52.14718
anova(regresi_rmr)
## Analysis of Variance Table
## 
## Response: metabolic.rate
##             Df  Sum Sq Mean Sq F value    Pr(>F)    
## body.weight  1 1300241 1300241  52.147 7.025e-09 ***
## Residuals   42 1047231   24934                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

● UJI KETIDAKPASAN

library(alr3)
## Loading required package: car
## Loading required package: carData
uji_ketidakpasan <- pureErrorAnova(regresi_rmr)
uji_ketidakpasan
## Analysis of Variance Table
## 
## Response: metabolic.rate
##              Df  Sum Sq Mean Sq F value   Pr(>F)   
## body.weight   1 1300241 1300241 45.7825 0.002489 **
## Residuals    42 1047231   24934                    
##  Lack of fit 38  933629   24569  0.8651 0.654551   
##  Pure Error   4  113601   28400                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Fhitung <- uji_ketidakpasan$`F value`[3]
Fhitung
## [1] 0.8651009
n <- nrow(rmr)
n
## [1] 44
k <- length(unique(rmr$body.weight))
k
## [1] 40
Ftabel <- qf(0.99,k-2,n-k)
Ftabel
## [1] 13.76001
if (Fhitung > Ftabel) {
  print("H0 di tolak, model regresi linear tidak cocok digunakan.")
} else{
  print("H0 diterima, model regresi linear cocok digunakan.")
}
## [1] "H0 diterima, model regresi linear cocok digunakan."

Pada taraf signifikan 0.01 tidak terdapat bukti yang cukup untuk menyatakan ada ketidakpasan model regresi linear dengan data sehingga modle regresi linear cocok untuk digunakan

● UJI ASUMSI REGRESI

Uji Asumsi Rata-Rata Galat Bernilai Nol

plot(regresi_rmr$fitted.values, 
     regresi_rmr$residuals,
     xlab="Fiitted Value",
     ylab="Residuals",
     pch=21,
     main = "Plot Uji Asumsi Rata-rata Galat bernilai nol",
     panel.first = rect(par("usr")[1], #sumbu x kiri
                        par("usr")[3], #sumbu y bawah
                        par("usr")[2], #sumbu x kanan
                        par("usr")[4], #sumbu y atas
                        col = "lightpink"),
     bg = "lightblue",
     col = "red2",
     col.main = "lightpink3",
     col.lab = "lightblue3",
     col.axis = "red2")
abline(h = 0,lty = 2, col="red2")

Berdasarkan plot antara fitted value vs residual, terlihat bahwa titik-titik residual menyebar secara acak di sekitar garis nol dan tidak membentuk pola tertentu. Sehingga asumsi rata-rata galat bernilai nol telah terpenuhi.

Uji Asumsi Rata-Rata Galat Saling Bebas

Run <-(1:nrow(rmr))
rmr <-cbind(rmr,Run)
head(rmr)
##   body.weight metabolic.rate      xdif       ydif       crp      xsq    ytopi
## 1        49.9           1079 -24.97955 -260.84091 6515.6873 623.9777 1163.497
## 2        50.8           1146 -24.07955 -193.84091 4667.6010 579.8245 1169.851
## 3        51.8           1115 -23.07955 -224.84091 5189.2260 532.6654 1176.910
## 4        52.6           1161 -22.27955 -178.84091 3984.4942 496.3781 1182.558
## 5        57.6           1325 -17.27955  -14.84091  256.4442 298.5827 1217.855
## 6        61.4           1351 -13.47955   11.15909 -150.4195 181.6981 1244.682
##       Galat Run
## 1 -84.49711   1
## 2 -23.85069   2
## 3 -61.91022   3
## 4 -21.55784   4
## 5 107.14452   5
## 6 106.31832   6
plot(rmr$Run,
     regresi_rmr$residuals,
     xlab="Run",
     ylab="Residuals",
     type = "l",
     main = "Plot Uji Asumsi Galat Saling Bebas",
     panel.first = rect(par("usr")[1], #sumbu x kiri
                        par("usr")[3], #sumbu y bawah
                        par("usr")[2], #sumbu x kanan
                        par("usr")[4], #sumbu y atas
                        col = "lightpink"),
     col = "red2",
     col.main = "lightpink3",
     col.lab = "lightblue3",
     col.axis = "red2")

Berdasarkan plot antara urutan pengamatan vs residual, terlihat bahwa residual berfluktuasi secara acak tanpa membentuk pola tertentu seperti tren atau siklus. Sehingga asumsi galat saling bebas terpenuhi.

Uji Asumsi Galat Berdistribusi Normal

qqnorm(regresi_rmr$residuals,ylab = "Raw Residuals")

shapiro.test(regresi_rmr$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  regresi_rmr$residuals
## W = 0.95657, p-value = 0.09681

Berdasarkan Normal Q-Q plot, terlihat bahwa titik-titik residual cenderung mengikuti garis diagonal. Selain itu, hasil uji Shapiro-Wilk diperoleh p-value sebesar 0.09681 (> 0.05), sehingga asumsi normalitas galat terpenuhi.

Uji Asumsi Ragam Galat Konstan

plot(regresi_rmr$fitted.values,
     regresi_rmr$residuals,
     xlab="Nilai Dugaan",
     ylab="Residual",
     main = "Plot Uji Ragam Galat Konstan",
     panel.first = rect(par("usr")[1], #sumbu x kiri
                        par("usr")[3], #sumbu y bawah
                        par("usr")[2], #sumbu x kanan
                        par("usr")[4], #sumbu y atas
                        col = "lightpink"),
     col = "red2",
     col.main = "lightpink3",
     col.lab = "lightblue3",
     col.axis = "red2")
abline(h=0,lty=2,col="red2")

Berdasarkan plot antara nilai dugaan (fitted values) vs residual, terlihat bahwa titik-titik residual menyebar secara acak di atas dan di bawah garis nol serta tidak membentuk pola tertentu seperti pola menyempit atau melebar. Sehingga asumsi ragam galat konstan terpenuhi.

● KOEFISIEN DETERMINASI & KOEFISIEN KORELASI

Koefisien Determinasi

regresi_rmr <- lm(metabolic.rate~body.weight,data=rmr)
summary(regresi_rmr)
## 
## Call:
## lm(formula = metabolic.rate ~ body.weight, data = rmr)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -245.74 -113.99  -32.05  104.96  484.81 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 811.2267    76.9755  10.539 2.29e-13 ***
## body.weight   7.0595     0.9776   7.221 7.03e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 157.9 on 42 degrees of freedom
## Multiple R-squared:  0.5539, Adjusted R-squared:  0.5433 
## F-statistic: 52.15 on 1 and 42 DF,  p-value: 7.025e-09
koef_det <- summary(regresi_rmr)$r.squared
koef_det
## [1] 0.55389

Koefisien determinasi, \(R^2\) = 0.5539 berarti 55.39% keragaman dari metabolic rate dapat dijelaskan oleh keragaman body weight.

Koefisien Korelasi

koef_kor <- cor(rmr$body.weight,rmr$metabolic.rate)
koef_kor
## [1] 0.7442379

Koefisien Korelasi (r) = 0.7442 , 0.5 ≤ |r| ≤ 0.8 berarti ada hubungan linear yang moderat.