0Pricing
R Academy · Pelajaran

set.seed() dan Reproduksibilitas

Pastikan pembuatan bilangan acak dapat direproduksi pada setiap eksekusi dengan set.seed().

set.seed() dan Reproduksibilitas adalah pelajaran R Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar R Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus R Academy mencakup 4 pelajaran total.

Mengapa Reproduktibilitas Penting

Pembangkitan bilangan acak bersifat pseudoacak: algoritme deterministik yang diinisialisasi oleh nilai awal. Menetapkan seed membuat simulasi Anda dapat direproduksi — kode yang sama selalu menghasilkan hasil yang sama, yang penting untuk penelusuran kesalahan, publikasi, dan pengajaran.

# Without set.seed: different every run
runif(3)  # e.g., 0.21, 0.57, 0.89 (changes each run)
runif(3)  # different again!

# With set.seed: always identical
set.seed(42)
runif(3)  # always: 0.9148060 0.9370754 0.2861395

set.seed(42)  # reset seed
runif(3)  # exactly the same three numbers again

cat('set.seed() is your reproducibility guarantee')

Mekanisme set.seed()

set.seed(n) menginisialisasi keadaan pembangkit bilangan acak (RNG). Bilangan bulat positif apa pun dapat digunakan. Seed menentukan seluruh urutan bilangan acak berikutnya sampai seed diatur ulang. Gunakan angka tetap untuk reproduktibilitas.

# Different seeds give different sequences
set.seed(1)
seq1 <- rnorm(5)

set.seed(99)
seq2 <- rnorm(5)

print(seq1)
print(seq2)
identical(seq1, seq2)  # FALSE

# Same seed always gives same sequence
set.seed(1)
seq1_again <- rnorm(5)
identical(seq1, seq1_again)  # TRUE

# Common seed choices
set.seed(123)   # popular convention
set.seed(2024)  # use year for temporal clarity

RNGkind(): Algoritme RNG

RNGkind() menampilkan (atau menetapkan) algoritme RNG. Nilai bawaan R adalah Mersenne-Twister dengan metode distribusi normal Inversion. Algoritme memengaruhi urutan bilangan, jadi dokumentasikan seed dan RNGkind untuk reproduktibilitas penuh.

# Check current RNG settings
RNGkind()
# [1] 'Mersenne-Twister' 'Inversion' 'Rejection'
# [1] kind, normal.kind, sample.kind

# Set explicitly for maximum reproducibility
RNGkind('Mersenne-Twister', 'Inversion', 'Rejection')
set.seed(42)
runif(3)

# Alternative RNG algorithms (rarely needed)
# RNGkind('L'Ecuyer-CMRG') # for parallel RNG
# RNGkind('Super-Duper')   # older algorithm

cat('Default Mersenne-Twister has period 2^19937 - 1')

Memeriksa .Random.seed

.Random.seed adalah vektor bilangan bulat global yang menyimpan seluruh keadaan RNG. Vektor ini diperbarui secara otomatis setelah setiap pengambilan bilangan acak. Anda dapat menyimpan dan memulihkannya untuk memutar ulang suatu urutan dari titik mana pun.

set.seed(42)
# .Random.seed is created in .GlobalEnv after first use
length(.Random.seed)  # 626 integers for Mersenne-Twister
.Random.seed[1]       # encodes RNG type

# Generate one number (state advances)
x1 <- runif(1)
state_after <- .Random.seed

# Generate another
x2 <- runif(1)

# Restore state to after x1
.Random.seed <<- state_after
x2_replay <- runif(1)

identical(x2, x2_replay)  # TRUE - we replayed the state
cat('x2:', x2, 'x2_replay:', x2_replay)

Menyimpan dan Memulihkan Keadaan RNG

Simpan keadaan RNG sebelum suatu blok kode, lalu pulihkan nanti untuk memutar ulang blok tersebut secara persis. Cara ini lebih fleksibel daripada set.seed() ketika Anda perlu melanjutkan dari tengah urutan.

set.seed(100)
# Generate some random numbers first
runif(10)

# Save current state
saved_state <- .Random.seed

# Generate block of interest
block1 <- rnorm(5)
print(block1)

# ... later, restore and replay
.Random.seed <<- saved_state
block1_replay <- rnorm(5)

identical(block1, block1_replay)  # TRUE!
cat('RNG state saved and restored successfully')

RNG Paralel dengan L'Ecuyer-CMRG

Saat menggunakan komputasi paralel, setiap proses memerlukan aliran RNG yang independen. Generator L'Ecuyer-CMRG menyediakan aliran panjang yang tidak saling tumpang tindih untuk pekerja paralel, sehingga hasilnya independen di seluruh inti.

# Set up L'Ecuyer-CMRG for parallel use
RNGkind('L\'Ecuyer-CMRG')
set.seed(42)

# Each parallel worker gets its own stream
# (parallel package handles this automatically)
# library(parallel)
# cl <- makeCluster(4)
# clusterSetRNGStream(cl, iseed = 42)

# Generate numbers with this generator
samples <- rnorm(5)
print(samples)

# Reset to default Mersenne-Twister
RNGkind('Mersenne-Twister', 'Inversion', 'Rejection')
cat('L\'Ecuyer-CMRG: safe for parallel simulation')

Menetapkan Seed dalam Pemanggilan Fungsi

Menetapkan seed di dalam fungsi tidak memengaruhi keadaan RNG pemanggil setelah fungsi selesai—karena pemanggilan seed oleh fungsi mengubah keadaan RNG global. Nyatakan pengelolaan seed secara eksplisit dalam fungsi yang dapat digunakan kembali.

# Function that optionally accepts a seed
simulate_data <- function(n, seed = NULL) {
  if (!is.null(seed)) set.seed(seed)
  list(
    x = rnorm(n),
    y = rnorm(n)
  )
}

# Reproducible call
result1 <- simulate_data(5, seed = 42)
result2 <- simulate_data(5, seed = 42)
identical(result1$x, result2$x)  # TRUE

# Without seed: different each time
result3 <- simulate_data(5)
result4 <- simulate_data(5)
identical(result3$x, result4$x)  # FALSE

Pengambilan Sampel yang Dapat Direproduksi

Argumen sample.kind pada RNGkind() secara khusus memengaruhi sample(). Sejak R 3.6.0, nilai bawaan diubah menjadi 'Rejection' untuk keseragaman yang lebih baik—gunakan pengaturan ini dalam alur kerja yang dapat direproduksi.

# R 3.6+ default sample kind
RNGkind(sample.kind = 'Rejection')  # default
set.seed(42)
sample(1:10, 5)
# [1] 1 5 10 8 2  (with Rejection)

# Old behavior (R < 3.6) for legacy code
RNGkind(sample.kind = 'Rounding')
set.seed(42)
sample(1:10, 5)
# Different result!

# Best practice: reset to modern defaults
RNGkind('Mersenne-Twister', 'Inversion', 'Rejection')
set.seed(42)
sample(1:10, 5)

Mendokumentasikan Keacakan

Praktik yang baik untuk penelitian yang dapat direproduksi: dokumentasikan versi R, nilai seed, dan RNGkind. Gunakan sessionInfo() untuk merekam seluruh lingkungan. Catat seed dalam komentar skrip atau berkas konfigurasi.

# Reproducibility header for analysis scripts:
# R version: R.version$version.string
# Seed: 42
# RNGkind: Mersenne-Twister / Inversion / Rejection

# Capture R version
R.version$version.string

# Capture full session info
# sessionInfo()  # shows all packages and versions

# In RMarkdown, set seed in setup chunk:
# ```{r setup}
# knitr::opts_chunk$set(echo = TRUE)
# set.seed(42)
# ```

# This ensures all chunks share the same RNG state
set.seed(42)
cat('R version:', R.version$version.string, '\n')
cat('Seed: 42, RNGkind: Mersenne-Twister')

Seed dalam Studi Monte Carlo

Dalam studi simulasi berskala besar, gunakan satu seed utama untuk menghasilkan seed bagi setiap replikasi. Dengan demikian, setiap replikasi dapat direproduksi secara terpisah, sementara keseluruhan rancangan tetap deterministik.

# Generate per-replicate seeds from a master seed
set.seed(2024)
n_replicates <- 5
replicate_seeds <- sample.int(1e6, n_replicates)
print(replicate_seeds)

# Each replicate uses its own seed
run_replicate <- function(rep_id) {
  set.seed(replicate_seeds[rep_id])
  mean(rnorm(1000))  # estimate with this seed
}

results <- sapply(seq_len(n_replicates), run_replicate)
print(round(results, 4))

# Any single replicate can be re-run independently:
set.seed(replicate_seeds[3])
mean(rnorm(1000))  # exactly matches results[3]

Menguji Keacakan dengan withr

Paket withr menyediakan with_seed(seed, expr) yang menetapkan seed sementara, mengevaluasi ekspresi, lalu memulihkan keadaan RNG semula—sempurna untuk pengujian tanpa mengotori keadaan global.

# withr::with_seed - restore RNG state automatically
# library(withr)
# result <- with_seed(42, rnorm(5))

# Simulation without withr (manual state save)
old_seed <- if (exists('.Random.seed')) .Random.seed
old_kind <- RNGkind()

set.seed(42)
result <- rnorm(5)

# Restore
if (!is.null(old_seed)) .Random.seed <<- old_seed
cat('Result:', result, '\n')
cat('Caller\'s RNG state preserved')

# set.seed in tests ensures deterministic assertions:
set.seed(1)
stopifnot(round(rnorm(1), 6) == round(-0.6264538, 6))

Pemeriksaan Singkat

Uji pemahaman Anda tentang reproduktibilitas RNG di R.

Ringkasan: Seed dan Reproduktibilitas

Hal-hal penting: set.seed(n) membuat kode acak dapat direproduksi. RNGkind() menampilkan atau menetapkan algoritme—dokumentasikan seed dan jenisnya. .Random.seed menyimpan seluruh keadaan RNG dan dapat disimpan atau dipulihkan. Untuk komputasi paralel, gunakan L'Ecuyer-CMRG. Dalam fungsi, terima parameter seed. Dalam simulasi besar, gunakan seed per replikasi yang dihasilkan dari seed utama.

# Reproducibility checklist:
# 1. Set seed at script top
set.seed(42)

# 2. Document RNGkind
RNGkind()  # Mersenne-Twister / Inversion / Rejection

# 3. Save RNG state if needed
saved <- .Random.seed

# 4. For functions, accept seed argument
my_sim <- function(n, seed = NULL) {
  if (!is.null(seed)) set.seed(seed)
  rnorm(n)
}

# 5. For parallel: use L'Ecuyer-CMRG
# RNGkind('L\'Ecuyer-CMRG'); set.seed(42)

cat('Reproducibility = trust in your results')

Pertanyaan yang Sering Diajukan

Apakah pelajaran “set.seed() dan Reproduksibilitas” gratis?

Ya — teks lengkap “set.seed() dan Reproduksibilitas” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus R Academy, upgrade ke CoddyKit PRO. Kursus R Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “set.seed() dan Reproduksibilitas”?

Pastikan pembuatan bilangan acak dapat direproduksi pada setiap eksekusi dengan set.seed(). Kamu berlatih R Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai R Academy?

Tidak diperlukan pengalaman sebelumnya. R Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “set.seed() dan Reproduksibilitas” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran R Academy ini?

Ya. Setiap pelajaran R Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. set.seed() dan Reproduksibilitas
  2. Membangkitkan Distribusi Acak
  3. Dasar-Dasar Simulasi Monte Carlo
  4. Pengambilan Sampel Ulang Bootstrap di R
← Kembali ke R Academy