0Pricing
R Academy · درس

أخذ عينات MCMC وتشخيصها

شغّل أخذ العينات، وافحص السلاسل، وفسّر تشخيصات Rhat وESS

أخذ عينات MCMC وتشخيصها درس مجاني في R Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.

ما هو MCMC؟

يُعدّ مونتِ كارلو بسلاسل ماركوف (MCMC) عائلة من الخوارزميات لاستخراج عينات من توزيع احتمالي عندما يتعذر أخذ العينات مباشرةً. وفي الإحصاء البايزي، يستخرج MCMC عينات من التوزيع اللاحق P(parameters | data).

يطبّق RStan خوارزمية أخذ العينات No-U-Turn Sampler (NUTS)، وهي من خوارزميات MCMC المتقدمة.

نموذج Stan بسيط

نموذج Stan هو كتلة نصية تحدد أنواع البيانات والمعلمات والاحتمال اللوغاريتمي اللاحق. ويقدّر أبسط نموذج متوسط توزيع طبيعي ذي تباين معلوم.

# 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
# }
# '

استدعاء stan() لأخذ العينات

تترجم stan(model_code=..., data=..., chains=4, iter=2000, warmup=1000) النموذج (مرة واحدة)، ثم تستخرج العينات. ومع iter=2000 وwarmup=1000، تنتج كل سلسلة 1000 عينة بعد الإحماء، أي 4000 عينة إجمالًا عبر 4 سلاسل.

# 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) — جدول التلخيص

يعرض print(fit) جدول تلخيص لكل معلمة، يتضمن المتوسط اللاحق والانحراف المعياري والكميات وRhat وn_eff. ويُعد هذان التشخيصان أول ما ينبغي فحصه.

# 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

معيار تقارب Rhat

يقارن Rhat (عامل خفض مقياس التشتت المحتمل) التباين داخل السلاسل بالتباين بينها. وتشير القيم القريبة من 1.0 إلى تقارب جميع السلاسل نحو التوزيع نفسه.

  • Rhat < 1.01 — تقارب (المعيار الحالي)
  • Rhat > 1.01 — لم تمتزج السلاسل؛ شغّلوا مزيدًا من التكرارات
  • Rhat > 1.1 — مشكلة تقارب خطيرة
# 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 — حجم العينة الفعّال

يأخذ n_eff (حجم العينة الفعّال) في الحسبان الارتباط الذاتي بين عينات MCMC المتعاقبة. فالعينات المترابطة تحمل معلومات أقل من العينات المستقلة.

  • اقتراب n_eff من إجمالي التكرارات — عينات شبه مستقلة، ممتاز
  • n_eff / total_samples > 0.1 — مقبول عمومًا
  • انخفاض n_eff جدًا — ارتباط ذاتي مرتفع؛ فكّروا في إعادة تمثيل النموذج بالمعلمات
# 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() للتقارب البصري

يرسم traceplot(fit, pars = 'mu') القيم المأخوذة من عينات mu عبر التكرارات لكل سلسلة. وتبدو السلاسل المتقاربة كيرقة ضبابية؛ إذ تتراكب جميع السلاسل من دون اتجاهات أو انزياحات. أما السلاسل المتباعدة فتتجول أو تبقى منفصلة.

# 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() للارتباطات اللاحقة

يعرض pairs(fit, pars = c('mu', 'sigma')) مصفوفة مخططات تبعثر للعينات اللاحقة. ويكشف الارتباطات بين المعلمات، ويسلط الضوء على الانتقالات المتباعدة (الموضحة باللون الأحمر)، التي تشير إلى مناطق يواجه فيها مستخرج العينات صعوبة.

# 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!
')

استخراج العينات اللاحقة

يعيد extract(fit, pars = 'mu')$mu متجهًا عدديًا يضم جميع العينات بعد الإحماء للمعلمة mu. استخدموا هذه العينات لحساب أي تلخيص لاحق: المتوسط، أو فواصل المصداقية، أو احتمال تحقق شرط.

# 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')

تشغيل ShinyStan للتشخيص التفاعلي

يفتح shinystan::launch_shinystan(fit) تطبيق Shiny تفاعليًا يضم مخططات التتبع والتوزيعات اللاحقة ومخططات pairs وتشخيصات NUTS كلها في مكان واحد. وهو الأداة الأكثر شمولًا لاستكشاف ملاءمة 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

إصلاحات شائعة للتقارب

عندما تكون قيمة Rhat > 1.01 أو تلاحظون وجود تباعدات:

  • زيدوا iter وwarmup
  • زيدوا adapt_delta باتجاه 1.0 (مثلًا إلى 0.95) ضمن control
  • أعيدوا تمثيل المعلمات — استخدموا التمثيل غير المتمركز للنماذج الهرمية
  • ضيّقوا التوزيعات السابقة إذا كانت واسعة أكثر من اللازم
  • افحصوا البيانات — فالقيم الشاذة أو اختلافات المقياس تسبب مشكلات لمستخرج العينات
# 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
# )

تحقق سريع: حد Rhat

ما الحد المعياري الحالي لقيمة Rhat الذي يشير إلى تقارب نموذج Stan؟

مراجعة أخذ عينات MCMC وتشخيصها

سير عمل RStan الأساسي مع MCMC:

  • تُلائم stan(model_code=..., data=..., chains=4, iter=2000, warmup=1000) النموذج
  • يعرض print(fit) قيم Rhat وn_eff، وهما تشخيصا التقارب الأساسيان
  • تشير Rhat < 1.01 وn_eff / total > 0.1 إلى عينة مستقرة السلوك
  • traceplot() — فحص بصري للامتزاج؛ وpairs() — يكشف مشكلات هندسة التوزيع اللاحق
  • extract(fit, pars='mu')$mu — الوصول إلى العينات اللاحقة الخام
  • shinystan::launch_shinystan(fit) — تشخيص تفاعلي شامل

الأسئلة الشائعة

هل درس «أخذ عينات MCMC وتشخيصها» مجاني؟

نعم — نص درس «أخذ عينات MCMC وتشخيصها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.

ماذا ستتعلم في «أخذ عينات MCMC وتشخيصها»؟

شغّل أخذ العينات، وافحص السلاسل، وفسّر تشخيصات Rhat وESS تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟

لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «أخذ عينات MCMC وتشخيصها»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟

نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مقدمة إلى التفكير البايزي
  2. كتابة نماذج Stan في R
  3. أخذ عينات MCMC وتشخيصها
  4. فحوصات التنبؤ البعدي
← العودة إلى R Academy