Seluruh fungsi pemodelan di R berbicara dengan satu bahasa yang sama, yaitu bahasa formula (formula) berbentuk umum y ~ x. Topik ini membahas sintaksis bahasa tersebut secara utuh, mulai dari makna tanda tilde, penambahan prediktor dengan +, interaksi dengan : dan *, pembuangan intersep dengan -1, hingga pemakaian formula pada fungsi di luar pemodelan seperti aggregate(). Anatomi pemanggilan lm() juga dibedah bersama keluaran ringkasnya, sehingga setiap pemanggilan model di R dapat dibaca bentuk dan batasannya dengan tepat.
Data contoh#
Seluruh contoh topik ini memakai satu tabel kecil berisi hasil belajar sepuluh siswa. Kolom jam mencatat jam belajar per minggu, kolom kehadiran mencatat persentase kehadiran di kelas, dan kolom nilai mencatat nilai ujian dengan skala 0 sampai 100. Ukurannya yang kecil membuat setiap angka keluaran mudah diperiksa ulang dengan mata.
library(tidyverse)
belajar <- tibble(
siswa = c("Ali", "Budi", "Citra", "Dewi", "Eka", "Fajar", "Gita", "Hana", "Indra", "Joko"),
jam = c(2, 4, 1, 5, 3, 6, 4, 2, 7, 5),
kehadiran = c(80, 85, 70, 90, 75, 88, 82, 78, 92, 86),
nilai = c(58, 66, 55, 68, 62, 72, 65, 59, 76, 70)
)
belajar── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.2.1 ✔ readr 2.2.0
✔ forcats 1.0.1 ✔ stringr 1.6.0
✔ ggplot2 4.0.3 ✔ tibble 3.3.1
✔ lubridate 1.9.5 ✔ tidyr 1.3.2
✔ purrr 1.2.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# A tibble: 10 × 4
siswa jam kehadiran nilai
<chr> <dbl> <dbl> <dbl>
1 Ali 2 80 58
2 Budi 4 85 66
3 Citra 1 70 55
4 Dewi 5 90 68
5 Eka 3 75 62
6 Fajar 6 88 72
7 Gita 4 82 65
8 Hana 2 78 59
9 Indra 7 92 76
10 Joko 5 86 70Tanda tilde dan objek formula#
Tanda tilde (~) adalah inti bahasa formula dan dibaca “dijelaskan oleh”. Ekspresi nilai ~ jam menyatakan bahwa variabel nilai di sisi kiri dijelaskan oleh variabel jam di sisi kanannya. Sisi kiri disebut variabel respons (response variable), sedangkan sisi kanan memuat prediktor (predictor), yaitu variabel yang dipakai untuk menjelaskan variasi respons.
Formula ternyata juga merupakan objek R tersendiri yang dapat disimpan ke dalam variabel. Kelas objeknya adalah "formula", dan isinya berupa ekspresi yang belum dihitung.
f <- nilai ~ jam
f
class(f)nilai ~ jam
[1] "formula"Karena formula hanya menyimpan ekspresi tanpa mengevaluasinya, pembuatan f tidak menuntut kolom nilai sudah ada di memori. Perhitungan baru berjalan ketika formula diteruskan ke fungsi pemodelan bersama datanya. Desain ini memisahkan dua hal yang berbeda, yaitu deskripsi model dan eksekusi model.
Anatomi pemanggilan lm()#
Fungsi lm() menyesuaikan model linear (linear model) dan menerima dua argumen utama, yaitu formula pada argumen pertama dan tabel data pada argumen data. Pemanggilan lm(nilai ~ jam, data = belajar) dibaca “sesuaikan model linear dengan nilai dijelaskan oleh jam, gunakan tabel belajar untuk mencari kedua kolom tersebut”. Persamaan model yang diestimasi berbentuk
dengan sebagai intersep dan sebagai kemiringan garis. Menjalankan pemanggilan tersebut mengembalikan objek model yang dicetak secara ringkas.
lm(nilai ~ jam, data = belajar)
Call:
lm(formula = nilai ~ jam, data = belajar)
Coefficients:
(Intercept) jam
51.574 3.468 Bagian Call mengulang pemanggilan yang dijalankan, sedangkan bagian Coefficients menampilkan intersep 51,574 dan kemiringan 3,468. Keluaran sependek ini adalah perilaku print() bawaan objek lm, bukan seluruh isi modelnya. Ringkasan lengkap yang memuat nilai p-value dan R-squared diperoleh dengan summary(), dan pembahasannya menjadi inti topik regresi linear sederhana.
Menambah prediktor dan interaksi#
Tanda + pada sisi kanan tilde menambahkan prediktor baru ke dalam model. Model dengan dua prediktor ditulis nilai ~ jam + kehadiran dan dibaca bahwa nilai dijelaskan oleh jam sekaligus kehadiran.
lm(nilai ~ jam + kehadiran, data = belajar)
Call:
lm(formula = nilai ~ jam + kehadiran, data = belajar)
Coefficients:
(Intercept) jam kehadiran
54.289 3.598 -0.039 Pada data kecil ini, koefisien kehadiran bernilai -0,039 yang nyaris nol. Nilai ujian pada contoh memang disusun mengikuti jam belajar, sehingga kehadiran nyaris tidak menambah informasi baru. Contoh ini memperlihatkan perilaku yang normal, yaitu koefisien sebuah prediktor menjadi kecil apabila variabelnya tidak membawa penjelasan tambahan di luar prediktor yang sudah ada.
Kedua prediktor dapat diperiksa pula apakah pengaruh salah satunya berubah tergantung pada nilai prediktor lainnya. Hubungan semacam itu disebut interaksi (interaction). Tanda : menyatakan interaksi saja, sedangkan tanda * merupakan bentuk ringkas yang memperluas menjadi efek utama kedua prediktor beserta interaksinya, sehingga jam * kehadiran sama dengan jam + kehadiran + jam:kehadiran.
lm(nilai ~ jam * kehadiran, data = belajar)
Call:
lm(formula = nilai ~ jam * kehadiran, data = belajar)
Coefficients:
(Intercept) jam kehadiran jam:kehadiran
53.017313 4.190981 -0.024445 -0.006734 Interaksi muncul sebagai istilah jam:kehadiran pada bagian Coefficients. Nilainya -0,006734 yang sangat kecil, sejalan dengan data yang memang tidak memuat efek interaksi. Anatomi keluarannya itulah yang penting dicatat, karena model dengan interaksi selalu menampilkan istilah berpola a:b di samping efek utamanya.
Membuang intersep dengan -1#
Tanda -1 pada sisi kanan formula membuang intersep dari model. Tanpa intersep, garis model dipaksa melewati titik nol pada kedua sumbu, sehingga prediksi untuk jam = 0 pasti bernilai nol.
lm(nilai ~ jam - 1, data = belajar)
Call:
lm(formula = nilai ~ jam - 1, data = belajar)
Coefficients:
jam
14.34 Keluarannya hanya memuat satu koefisien bernama jam dengan nilai 14,34. Angka ini tidak boleh dibaca sama seperti kemiringan 3,468 pada model lengkap, karena maknanya berubah menjadi “nilai rata-rata per jam belajar tanpa garis dasar”. Nilai kemiringannya membesar tajam justru karena intersep yang hilang diserap oleh kemiringan.
Formula pada fungsi lain#
Bahasa formula tidak dimiliki lm() seorang diri. Banyak fungsi R menerima formula sebagai cara deklaratif untuk menyatakan hubungan antar kolom, dan fungsi-fungsi itu juga mengenali argumen data. Fungsi aggregate() menggunakan formula untuk menghitung statistik per kelompok tanpa perlu memanggil group_by() terlebih dahulu.
aggregate(nilai ~ jam, data = belajar, FUN = mean) jam nilai
1 1 55.0
2 2 58.5
3 3 62.0
4 4 65.5
5 5 69.0
6 6 72.0
7 7 76.0Formula nilai ~ jam di sini dibaca “hitung nilai dikelompokkan menurut jam”, dan hasilnya berupa rata-rata nilai untuk setiap kelompok jam yang berbeda pada data. Fungsi grafik bawaan R memakai bahasa yang sama, misalnya plot(nilai ~ jam, data = belajar) menggambar sebaran titik dan boxplot(nilai ~ kelompok, data = belajar) menggambar kotak per kelompok. Satu bahasa untuk banyak fungsi inilah alasan sintaksis formula layak dipelajari dengan sungguh-sungguh sebelum masuk ke detail modelnya.
Ringkasan#
- Formula
y ~ xmenempatkan variabel respons di kiri tilde dan prediktor di kanannya, serta dibaca “y dijelaskan oleh x”. - Formula adalah objek kelas
"formula"yang menyimpan ekspresi tanpa menghitungnya, dan perhitungan baru berjalan saat formula diteruskan ke fungsi pemodelan. - Tanda
+menambah prediktor, tanda:menyatakan interaksi saja, sedangkan tanda*memperluas menjadi efek utama beserta interaksinya. - Tanda
-1membuang intersep dan mengubah makna kemiringan, sehingga hanya dipakai bila teori menuntut garis melalui titik asal. - Fungsi lain seperti
aggregate(),plot(), danboxplot()menerima formula dengan argumendatayang sama.
Referensi#
- An Introduction to R — CRAN
— Bab Statistical models in R merumuskan bahasa formula yang dipakai
lm(),glm(), dan keluarga fungsi pemodelan lainnya. - R for Data Science, edisi ke-2 — Wickham, Çetinkaya-Rundel, Grolemund — Bab model menuntun pembentukan model dengan formula dan pembacaan koefisiennya.