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 1Kriteria 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 chainPerbaikan Konvergensi yang Umum
Jika Rhat > 1.01 atau Anda melihat divergensi:
- Tingkatkan
iterdanwarmup - Tingkatkan
adapt_deltamendekati 1.0 (misalnya, 0.95) dalamcontrol - 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 modelprint(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 posteriorextract(fit, pars='mu')$mu— mengakses sampel posterior mentahshinystan::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
- Pengantar Pemikiran Bayesian
- Menulis Model Stan di R
- Pengambilan Sampel MCMC dan Diagnostik
- Pemeriksaan Prediktif Posterior