0Pricing
R Academy · Pelajaran

Pengambilan Sampel MCMC dan Diagnostik

Jalankan pengambilan sampel, periksa rantai, dan tafsirkan diagnostik Rhat serta ESS.

Pengambilan Sampel MCMC dan Diagnostik adalah pelajaran R Academy gratis di CoddyKit. Ini adalah pelajaran 3 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.

Apa Itu MCMC?

Markov Chain Monte Carlo (MCMC) adalah keluarga algoritme untuk mengambil sampel dari distribusi probabilitas ketika pengambilan sampel langsung tidak memungkinkan. Dalam statistika Bayesian, MCMC mengambil sampel dari distribusi posterior P(parameter | data).

RStan menerapkan No-U-Turn Sampler (NUTS), algoritme MCMC mutakhir.

Model Stan Sederhana

Model Stan adalah blok teks yang mendefinisikan jenis data, parameter, dan log-posterior. Model paling sederhana mengestimasi mean distribusi normal dengan varians yang diketahui.

# library(rstan)
#
# stan_code <- '
# data {
#   int<lower=0> N;
#   vector[N] y;
# }
# parameters {
#   real mu;
#   real<lower=0> sigma;
# }
# model {
#   mu    ~ normal(0, 10);   // prior
#   sigma ~ exponential(1);   // prior
#   y     ~ normal(mu, sigma); // likelihood
# }
# '

Memanggil stan() untuk Mengambil Sampel

stan(model_code=..., data=..., chains=4, iter=2000, warmup=1000) mengompilasi model (sekali), lalu mengambil sampel. Dengan iter=2000 dan warmup=1000, setiap rantai menghasilkan 1000 sampel setelah warmup — total 4000 sampel dari 4 rantai.

# library(rstan)
# options(mc.cores = parallel::detectCores())
#
# y <- c(2.1, 1.8, 2.4, 1.9, 2.3, 2.0, 1.7, 2.2)
# stan_data <- list(N = length(y), y = y)
#
# fit <- stan(
#   model_code = stan_code,
#   data       = stan_data,
#   chains     = 4,
#   iter       = 2000,
#   warmup     = 1000,
#   seed       = 42
# )

print(fit) — Tabel Ringkasan

print(fit) menampilkan tabel ringkasan untuk setiap parameter yang berisi mean posterior, simpangan baku, kuantil, Rhat, dan n_eff. Kedua diagnostik ini adalah hal pertama yang perlu diperiksa.

# print(fit)
#
# Example output:
#       mean se_mean   sd  2.5%   25%   50%   75%  97.5%  n_eff Rhat
# mu    2.05    0.00 0.15  1.76  1.95  2.05  2.15   2.34   3842    1
# sigma 0.22    0.00 0.06  0.13  0.18  0.21  0.25   0.37   3521    1
# lp__  4.38    0.02 1.01  1.60  3.91  4.71  5.18   5.50   2148    1

Kriteria Konvergensi Rhat

Rhat (faktor reduksi skala potensial) membandingkan varians di dalam rantai dengan varians antar-rantai. Nilai yang mendekati 1.0 menunjukkan bahwa semua rantai telah berkonvergensi ke distribusi yang sama.

  • Rhat < 1.01 — telah konvergen (standar saat ini)
  • Rhat > 1.01 — rantai belum bercampur; jalankan lebih banyak iterasi
  • Rhat > 1.1 — masalah konvergensi serius
# Check Rhat for all parameters:
# s <- summary(fit)$summary
# rhat_vals <- s[, 'Rhat']
# cat('Max Rhat:', max(rhat_vals, na.rm = TRUE), '
')
# if (any(rhat_vals > 1.01, na.rm = TRUE)) {
#   warning('Convergence issue detected!')
# } else {
#   cat('All Rhat < 1.01 — chains converged
')
# }

n_eff — Ukuran Sampel Efektif

n_eff (ukuran sampel efektif) memperhitungkan autokorelasi antara sampel MCMC yang berurutan. Sampel berkorelasi membawa lebih sedikit informasi daripada sampel independen.

  • n_eff mendekati total iterasi — sampel hampir independen, sangat baik
  • n_eff / total_samples > 0.1 — umumnya dapat diterima
  • n_eff sangat rendah — autokorelasi tinggi; pertimbangkan untuk memparametrisasi ulang model
# s <- summary(fit)$summary
# n_eff_vals <- s[, 'n_eff']
# total_samples <- 4 * 1000   # chains * post-warmup iter
# ratio <- n_eff_vals / total_samples
# cat('n_eff ratio (mu)   :', round(ratio['mu'], 2), '
')
# cat('n_eff ratio (sigma):', round(ratio['sigma'], 2), '
')

traceplot() untuk Konvergensi Visual

traceplot(fit, pars = 'mu') memplot nilai sampel mu di seluruh iterasi untuk setiap rantai. Rantai yang telah konvergen tampak seperti ulat berbulu — semua rantai saling bertumpang tindih tanpa tren atau pergeseran. Rantai yang divergen bergerak tanpa arah atau tetap terpisah.

# library(rstan)
#
# traceplot(fit, pars = c('mu', 'sigma'), inc_warmup = FALSE)
#
# Good traceplot characteristics:
# - All 4 chains overlapping completely (same range)
# - No visible drift or trend
# - Rapid mixing (values jump around quickly)
# - No flat regions (stuck sampler)
cat('A healthy traceplot looks like a fuzzy caterpillar
')

pairs() untuk Korelasi Posterior

pairs(fit, pars = c('mu', 'sigma')) menampilkan matriks plot sebaran sampel posterior. Plot ini mengungkapkan korelasi antarparameter dan menyoroti transisi divergen (yang diplot dengan warna merah), yang menunjukkan wilayah yang sulit ditangani oleh pengambil sampel.

# pairs(fit, pars = c('mu', 'sigma'))
#
# What to look for:
# - Elliptical clouds: mild correlation (OK)
# - Banana / funnel shapes: reparameterization needed
# - Red dots (divergences): geometry problem in posterior
#   => increase adapt_delta: stan(..., control=list(adapt_delta=0.95))
cat('Red dots in pairs() indicate divergent transitions — investigate!
')

Mengekstrak Sampel Posterior

extract(fit, pars = 'mu')$mu mengembalikan vektor numerik berisi semua sampel setelah warmup untuk mu. Gunakan sampel ini untuk menghitung ringkasan posterior apa pun: mean, interval kredibel, atau probabilitas suatu kondisi.

# mu_samples <- extract(fit, pars = 'mu')$mu
# cat('Posterior mean :', mean(mu_samples), '
')
# cat('95% CI:', quantile(mu_samples, c(0.025, 0.975)), '
')
# cat('P(mu > 2):', mean(mu_samples > 2), '
')
# hist(mu_samples, main = 'Posterior of mu', xlab = 'mu', col = 'steelblue')

Menjalankan ShinyStan untuk Diagnostik Interaktif

shinystan::launch_shinystan(fit) membuka aplikasi Shiny interaktif dengan plot jejak, distribusi posterior, plot pasangan, dan diagnostik NUTS dalam satu tempat. Ini adalah alat paling komprehensif untuk mengeksplorasi hasil penyesuaian RStan.

# install.packages('shinystan')
# library(shinystan)
#
# shinystan::launch_shinystan(fit)
#
# ShinyStan tabs:
# - Diagnose: Rhat, n_eff, divergences, energy
# - Explore:  marginal posteriors, scatter plots
# - Model:    Stan code, data
# - NUTS:     step size, tree depth per chain

Perbaikan Konvergensi yang Umum

Jika Rhat > 1.01 atau Anda melihat divergensi:

  • Tingkatkan iter dan warmup
  • Tingkatkan adapt_delta mendekati 1.0 (misalnya, 0.95) dalam control
  • Parametrisasikan ulang — gunakan parametrisasi tanpa pemusatan untuk model hierarkis
  • Perketat prior jika terlalu menyebar
  • Periksa data — pencilan atau perbedaan skala menyebabkan masalah pada pengambil sampel
# Re-run with higher adapt_delta to reduce divergences:
# fit2 <- stan(
#   model_code = stan_code,
#   data       = stan_data,
#   chains     = 4,
#   iter       = 4000,
#   warmup     = 2000,
#   control    = list(adapt_delta = 0.95, max_treedepth = 12),
#   seed       = 42
# )

Pemeriksaan Cepat: Ambang Rhat

Berapakah ambang standar saat ini untuk Rhat yang menunjukkan bahwa model Stan telah konvergen?

Rangkuman Pengambilan Sampel dan Diagnostik MCMC

Alur kerja MCMC RStan yang utama:

  • stan(model_code=..., data=..., chains=4, iter=2000, warmup=1000) menyesuaikan model
  • print(fit) menampilkan Rhat dan n_eff — diagnostik konvergensi utama
  • Rhat < 1.01 dan n_eff / total > 0.1 menunjukkan sampel yang berperilaku baik
  • traceplot() — pemeriksaan pencampuran secara visual; pairs() — mengungkap masalah geometri posterior
  • extract(fit, pars='mu')$mu — mengakses sampel posterior mentah
  • shinystan::launch_shinystan(fit) — diagnostik interaktif yang komprehensif

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pengambilan Sampel MCMC dan Diagnostik” gratis?

Ya — teks lengkap “Pengambilan Sampel MCMC dan Diagnostik” 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 “Pengambilan Sampel MCMC dan Diagnostik”?

Jalankan pengambilan sampel, periksa rantai, dan tafsirkan diagnostik Rhat serta ESS. 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 3 dari 4.

Berapa lama pelajaran “Pengambilan Sampel MCMC dan Diagnostik” 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. Pengantar Pemikiran Bayesian
  2. Menulis Model Stan di R
  3. Pengambilan Sampel MCMC dan Diagnostik
  4. Pemeriksaan Prediktif Posterior
← Kembali ke R Academy