set.seed() Lebih Dulu
Nilai acak yang berubah di setiap eksekusi tidak berguna untuk mengajar, menilai, debugging, atau sains: kalau simulasimu bilang 0.146 hari ini dan 0.153 besok, angka mana yang masuk ke laporan? set.seed() menetapkan titik awal generator, sehingga seluruh aliran "keacakan" sesudahnya bisa diulang persis:
Seed yang sama, nilai yang identik, setiap kali, di setiap komputer. Angkanya pseudo-acak: barisan deterministik yang dirancang lolos setiap uji statistik keacakan, dengan seed yang memilih dari titik mana di barisan itu kamu mulai. Nilai seed-nya sendiri tidak punya arti apa-apa (42, 7, 20260807); pilih apa saja, lalu catat. Kebiasaan yang perlu dibangun: satu set.seed() di bagian atas setiap script yang memakai keacakan. (Perhatikan bahwa setiap pengambilan nilai memajukan state-nya, jadi urutan panggilan juga berpengaruh pada reprodusibilitas.)
Sistem d/p/q/r: Satu Tabel untuk Memahami Seluruh Library
R menamai setiap fungsi distribusi dengan awalan + keluarga, dan begitu kamu melihat polanya, kamu bisa membaca seluruh library statistiknya:
| Awalan | Pertanyaan yang dijawab | Contoh normal |
|---|---|---|
r | Beri aku nilai acak | rnorm(5) |
d | Densitas: seberapa tinggi kurva di x? | dnorm(0) |
p | Probabilitas: P(X ≤ x)? | pnorm(1.96) |
q | Kuantil: x mana yang ada di persentil ini? | qnorm(0.975) |
p dan q saling berkebalikan, dan keduanya pasangan yang kamu temui di selang kepercayaan sebagai qt(0.975, df):
Ganti nama keluarganya dan semuanya tetap berlaku: runif/dunif/punif/qunif, rbinom/..., rpois/..., rt/..., rexp/.... Pelajari empat awalan, dapatkan puluhan distribusi.
rnorm(): Nilai dari Distribusi Normal
rnorm(n, mean, sd) mengambil nilai dari kurva lonceng, andalan untuk menyimulasikan data yang mirip hasil pengukuran:
Rata-rata dan sd sampelnya mendarat di dekat 100 dan 15, tetapi tidak persis di sana: selisih itu adalah noise sampling, yang mengecil seiring bertambahnya n. Baris terakhir adalah trik yang layak kamu tiru: mean() dari vector logika adalah proporsi TRUE, dan porsi di atas 130 keluar di dekat nilai teoretis 1 - pnorm(130, 100, 15) ≈ 2.3%. Default-nya mean = 0, sd = 1 (normal standar). Histogram dari iq memperlihatkan bentuk lonceng yang sudah kamu kenal.
runif(), rbinom(), rpois()
Tiga keluarga lagi mencakup sebagian besar kebutuhan simulasi:
runif() menyebarkan nilai secara merata di sebuah rentang ("uniform", bukan "run if"; semua orang pernah salah membacanya sekali). rbinom(n, size, prob) menyimulasikan n eksperimen yang masing-masing terdiri dari size percobaan, dan mengembalikan jumlah keberhasilan setiap eksperimen, jadi setiap nilai di atas adalah jumlah sisi angka dari 10 lemparan koin. rpois(n, lambda) menghasilkan jumlah kejadian yang terjadi secara independen dengan rata-rata yang diketahui: tiket dukungan per jam, salah ketik per halaman.
sample(): Sampling dan Mengacak
Kalau fungsi r* membuat nilai baru dari sebuah distribusi, sample() mengambil dari nilai yang sudah kamu punya:
Argumen replace adalah inti ceritanya: FALSE (default) seperti membagikan kartu, setiap nilai hanya bisa muncul sekali, dan meminta lebih banyak dari yang ada menghasilkan error; TRUE seperti melempar dadu, setiap pengambilan dimulai dari awal lagi. Sampling dengan pengembalian dari datamu sendiri adalah mesin di balik bootstrapping. Kalau dipanggil hanya dengan sebuah vector, sample(x) mengembalikan permutasi acak, idiom untuk mengacak urutan.
Mengambil sampel baris dari data frame memakai sample() di dalam pengindeksan baris:
sample(nrow(mtcars), 5) memilih 5 nomor baris secara acak; pengindeksan mengambil baris-baris itu. Ini langkah standar untuk memeriksa sekilas dataset besar atau membagi data menjadi set train/test.
Simulasi Monte Carlo Mini
Inilah hasil dari seluruh perangkat ini. Pertanyaannya: sebuah proses menghasilkan pengukuran yang berdistribusi N(100, 15); kamu merata-ratakan 10 di antaranya. Berapa probabilitas rata-rata itu melebihi 105? Alih-alih menurunkan jawabannya, simulasikan saja: lakukan eksperimennya 10.000 kali lalu hitung:
Hasil simulasinya hanya berselisih beberapa perseribu dari nilai eksaknya (sekitar 0.146). Itulah Monte Carlo dalam satu tarikan napas: tulis satu percobaan sebagai fungsi, ulangi ribuan kali dengan replicate(), ambil mean() dari keberhasilannya. Jawaban eksaknya ada di sini karena susunannya sesederhana buku pelajaran. Begitu pertanyaannya jadi rumit (distribusi yang aneh, maksimum dari nilai yang berkorelasi, permainan berbasis aturan), jalan analitis tertutup, dan resep simulasi tetap bekerja tanpa perubahan. Perhatikan 15 / sqrt(10) di pemeriksaannya: rata-rata bergoyang lebih sedikit daripada nilai individual, hukum akar kuadrat yang sama yang menentukan lebar selang kepercayaan.
Kelas Simulasi, Bukan Kelas Rahasia
Satu batas yang perlu dihormati: generator default R (Mersenne Twister) dibuat untuk kualitas statistik dan kecepatan, bukan kerahasiaan. Output-nya deterministik jika seed-nya diketahui, dan state internalnya bisa direkonstruksi dari output yang teramati: kelemahan fatal untuk password, token, atau apa pun yang berkaitan dengan keamanan. Untuk simulasi, bootstrapping, dan pengajaran, generator ini sangat baik; untuk kriptografi, pakai library yang memang dibuat untuk itu (misalnya package openssl), jangan pernah sample() atau runif().
Yang Perlu Kamu Ingat
- Satu
set.seed()di bagian atas membuat setiap hasil "acak" bisa diulang: seed yang sama, nilai yang sama. - Awalan d/p/q/r membuka seluruh library distribusi: nilai acak, densitas, probabilitas kumulatif, kuantil.
rnorm(n, mean, sd),runif(n, min, max),rbinom(n, size, prob),rpois(n, lambda)mencakup sebagian besar kebutuhan simulasi.sample()mengambil dari nilai milikmu sendiri:replace = TRUEuntuk dadu, default untuk kartu, tanpasizeuntuk mengacak;df[sample(nrow(df), k), ]mengambil sampel baris.- Monte Carlo = fungsi satu percobaan +
replicate()+mean(), resep yang menjawab pertanyaan probabilitas yang sulit dijangkau matematika. - RNG R untuk simulasi, bukan kriptografi.
Berikutnya: debugging, yaitu arti sebenarnya pesan error R dan cara membaca traceback.
Pertanyaan yang sering diajukan
Apa fungsi set.seed() di R?
Fungsi ini menetapkan titik awal generator angka acak R, sehingga nilai "acak" yang diambil sesudahnya selalu identik di setiap eksekusi. Panggil sekali di bagian atas setiap script yang memakai keacakan, misalnya set.seed(42), dan simulasimu menjadi reproducible: rekan kerja, penilai, dan dirimu di masa depan semuanya melihat angka yang sama.
Bagaimana cara membuat angka acak di R?
Pilih distribusinya: rnorm(n, mean, sd) untuk nilai normal, runif(n, min, max) untuk seragam, rbinom(n, size, prob) untuk jumlah keberhasilan, rpois(n, lambda) untuk jumlah kejadian. Untuk mengambil sampel dari nilai yang sudah ada, pakai sample(x, size).
Apa bedanya rnorm, dnorm, pnorm, dan qnorm?
Satu distribusi, empat awalan: r mengambil nilai acak, d memberi tinggi kurva densitas, p memberi probabilitas kumulatif P(X ≤ x), dan q adalah kebalikannya, yaitu nilai pada persentil tertentu. Empat awalan yang sama berlaku untuk setiap distribusi yang dikenal R: runif/dunif/punif/qunif, rbinom/dbinom/pbinom/qbinom, dan seterusnya.
Bagaimana cara mengambil sampel acak baris dari data frame di R?
Indeks barisnya dengan sample(): df[sample(nrow(df), 5), ] memilih 5 baris tanpa pengembalian. Tambahkan replace = TRUE untuk sampling dengan pengembalian (langkah di balik bootstrapping).