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
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 y- pred. 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.