library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.2.2
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.3.6      ✔ purrr   0.3.5 
## ✔ tibble  3.1.8      ✔ dplyr   1.0.10
## ✔ tidyr   1.2.1      ✔ stringr 1.4.1 
## ✔ readr   2.1.4      ✔ forcats 0.5.2
## Warning: package 'readr' was built under R version 4.2.3
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
library(modelr)
## Warning: package 'modelr' was built under R version 4.2.2

Residu

Bagian yang sangat penting dari pemodelan statistik adalah menilai keefektifan model kami. Kami ingin memastikan model kami menangkap perilaku fenomena yang dimodelkan, dan kami ingin memilih variabel prediktor yang memiliki pengaruh signifikan terhadap variabel respon. Di bagian ini dan selanjutnya, kita akan membahas poin pertama dari poin-poin ini. .

Residu titik data relatif terhadap model adalah selisih antara nilai respons sebenarnya dari titik tersebut dan nilai respons yang diprediksi . Dengan kata lain, residual = aktual−−diprediksi.

Mari kita hitung beberapa sisa titik sim1relatif terhadap sim1_model. Salah satu titik data di sim1adalah x = 2, y = 11.3. Jadi 11,3 adalah nilai respons aktual saat x = 2. Untuk mendapatkan nilai respons yang diprediksi, kita harus memasukkan 2 untuk xmodel kita: y= 2,052( x) + 4,221. Nilai prediksinya yadalah 2,052(2) + 4,221 = 8,325. Maka residualnya adalah 11,3 - 8,325 = 2,975. Model kami meremehkan ynilai sebesar 2,975.

Titik data kita yang lain sim1adalah x = 4, y = 12.4. Nilai prediksinya yadalah 2,052(4) + 4,221 = 12,429. Residualnya adalah 12,4 - 12,429 = -0,029. Modelnya nyaris melebih-lebihkan nilainya y.

Idealnya kita ingin semua residu mendekati 0. Pustaka modelr mencakup dua fungsi yang sangat berguna yang akan membantu kita memeriksa residu: add_residualsdan add_predictions. Nama mereka menggambarkan dengan tepat apa yang mereka lakukan:

sim1_model <- lm(y ~ x, data = sim1)
sim1_w_pred_resids <- sim1 %>%
  add_predictions(sim1_model) %>%
  add_residuals(sim1_model)

sim1_w_pred_resids
## # A tibble: 30 × 4
##        x     y  pred    resid
##    <int> <dbl> <dbl>    <dbl>
##  1     1  4.20  6.27 -2.07   
##  2     1  7.51  6.27  1.24   
##  3     1  2.13  6.27 -4.15   
##  4     2  8.99  8.32  0.665  
##  5     2 10.2   8.32  1.92   
##  6     2 11.3   8.32  2.97   
##  7     3  7.36 10.4  -3.02   
##  8     3 10.5  10.4   0.130  
##  9     3 10.5  10.4   0.136  
## 10     4 12.4  12.4   0.00763
## # … with 20 more rows

Kolom tersebut predberisi hasil memasukkan xnilai ke dalam model kita. Kolom tersebut residberisi residu, yang nilainya sama dengan ypred. Dengan menelusuri residkolom, kita melihat bahwa banyak residu sebenarnya mendekati 0. Kita dapat lebih mudah melihatnya dengan mendapatkan plot residual menggunakan residkolom:

ggplot(sim1_w_pred_resids) +
  geom_point(aes(x, resid))

Karena kita tertarik pada kedekatan residu dengan 0, kita juga dapat menambahkan garis referensi horizontal pada 0 dengan geom_hline:

ggplot(sim1_w_pred_resids) +
  geom_point(aes(x, resid)) +
  geom_hline(yintercept = 0)

Pengelompokan residual di sekitar 0 adalah pertanda baik, tetapi plot residual juga mengungkapkan alasan lain untuk meyakini bahwa model kita bekerja dengan baik: Plot residual tidak memiliki pola yang jelas.

Untuk menjelaskan hal ini, pertimbangkan fakta bahwa dalam setiap proses statistik, akan ada unsur keacakan yang sama sekali tidak dapat diprediksi. Ini disebut kebisingan . Tidak ada model yang harus memprediksi kebisingan. Namun, jika ada hubungan mendasar yang nyata di antara variabel yang berperan dalam proses statistik, model yang baik akan mendeteksi hubungan tersebut. Jadi, kami ingin model kami mendeteksi hubungan nyata tetapi bukan noise.

Apa hubungannya ini dengan plot sisa kita? Nah, jika model kita dapat menjelaskan semua perilaku data kita kecuali noise acak, maka satu-satunya alasan perbedaan antara nilai aktual dan prediksi adalah noise tersebut. Dengan kata lain, residu hanya akan mengukur kebisingan. Karena noise benar-benar acak, ini berarti model yang baik akan memiliki plot sisa yang terlihat benar-benar acak, seperti yang terlihat di atas.

Untuk membedakan situasi ini, pertimbangkan kumpulan data berikut. (Itu tidak terpasang, itulah sebabnya kami mengimpornya.)

sim1a <- readr::read_csv("https://raw.githubusercontent.com/jafox11/MS282/main/sim1_a.csv")
## Rows: 10 Columns: 2
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (2): x, y
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
sim1a
## # A tibble: 10 × 2
##        x     y
##    <dbl> <dbl>
##  1     1  8.34
##  2     2  9.91
##  3     3 10.6 
##  4     4 11.2 
##  5     5 12.5 
##  6     6 14.7 
##  7     7 17.2 
##  8     8 19.0 
##  9     9 19.9 
## 10    10 20.5

Melihat plot pencar, sepertinya model linier akan sesuai:

ggplot(sim1a) +
  geom_point(aes(x, y))

Namun, kita harus memastikan bahwa residunya acak. Mari membangun model linear pada sim1a, tambahkan kolom residual yang dihasilkan ke sim1a, dan kemudian dapatkan plot residual:

sim1a_model <- lm(y ~ x, data = sim1a)

sim1a_w_resid <- sim1a %>%
  add_residuals(sim1a_model)

ggplot(sim1a_w_resid) +
  geom_point(aes(x, resid)) +
  geom_hline(yintercept = 0)

Ada pola yang pasti di plot sisa. Ini berarti ada hubungan antara xdan yyang sim1a_modeltidak terdeteksi; kekuatan prediktifnya tidak sebaik yang seharusnya. Namun, hanya satu nilai sisa yang jaraknya lebih dari 1 unit dari 0, sehingga terlepas dari kekurangannya, model kami masih cukup baik dalam memprediksi ydari x.