R Academy · บทเรียน

การตรวจสอบการทำนายภายหลัง

ตรวจสอบความสอดคล้องของโมเดลโดยเปรียบเทียบการแจกแจงข้อมูลที่จำลองกับข้อมูลที่สังเกตได้

บทเรียน 4 จาก 413 ขั้นตอน

การตรวจสอบการทำนายภายหลัง เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

การตรวจสอบการพยากรณ์จากการแจกแจงภายหลังคืออะไร

หลังจากปรับแบบจำลองแบบเบย์แล้ว คุณต้องถามว่า แบบจำลองนี้สร้างข้อมูลที่มีลักษณะเหมือนข้อมูลที่สังเกตได้หรือไม่ การตรวจสอบการพยากรณ์จากการแจกแจงภายหลัง (PPCs) ตอบคำถามนี้ด้วยการจำลองชุดข้อมูลซ้ำ yrep จากการแจกแจงภายหลัง แล้วเปรียบเทียบกับข้อมูลที่สังเกตได้ y ด้วยกราฟ

การดึงตัวอย่างจากการแจกแจงภายหลัง

extract(fit, pars='mu') จะส่งคืนรายการที่มีชื่อกำกับ โดย $mu คือเวกเตอร์ตัวเลขของตัวอย่างหลังช่วงวอร์มอัปทั้งหมดสำหรับพารามิเตอร์นั้น หากมี 4 สายโซ่และมี 1000 รอบหลังช่วงวอร์มอัป จะได้ตัวอย่าง 4000 ตัวอย่าง

# library(rstan)
# mu_samples    <- extract(fit, pars = 'mu')$mu
# sigma_samples <- extract(fit, pars = 'sigma')$sigma
#
# cat('Samples drawn:', length(mu_samples), '
')
# cat('Posterior mean of mu:', mean(mu_samples), '
')
# cat('90% CI:', quantile(mu_samples, c(0.05, 0.95)), '
')

การสร้าง yrep จากตัวอย่างการแจกแจงภายหลัง

สำหรับการสุ่มจากการแจกแจงภายหลังแต่ละครั้ง (mu_s, sigma_s) ให้จำลองชุดข้อมูลซ้ำที่มีขนาดเท่ากับข้อมูลเดิม แล้วจัดเก็บไว้ในเมทริกซ์ yrep โดยแต่ละแถวแทนชุดข้อมูลที่จำลองขึ้นหนึ่งชุด

# y <- c(2.1, 1.8, 2.4, 1.9, 2.3, 2.0, 1.7, 2.2)
# n_obs <- length(y)
# S     <- length(mu_samples)  # 4000 posterior draws
#
# yrep <- matrix(NA, nrow = S, ncol = n_obs)
# for (s in seq_len(S)) {
#   yrep[s, ] <- rnorm(n_obs, mean = mu_samples[s], sd = sigma_samples[s])
# }
# dim(yrep)  # [4000, 8]

ppc_dens_overlay() — การเปรียบเทียบความหนาแน่น

bayesplot::ppc_dens_overlay(y, yrep[1:50,]) จะแสดงความหนาแน่นแบบเคอร์เนลของข้อมูลที่สังเกตได้ (เส้นสีเข้ม) ซ้อนทับกับความหนาแน่นจากชุดข้อมูลที่จำลองแบบสุ่ม 50 ชุด (เส้นสีอ่อน) แบบจำลองที่ปรับได้ดีควรมีเส้นสีเข้มอยู่ภายในกลุ่มเส้นสีอ่อน

# library(bayesplot)
#
# ppc_dens_overlay(y, yrep[1:50, ])
#
# Interpretation:
# - Dark line (y_obs) surrounded by light lines (yrep): good fit
# - Dark line systematically outside the cloud: model misfit
# - Light lines much wider than dark: overdispersed model
# - Light lines much narrower than dark: underdispersed model

ppc_stat() — การตรวจสอบสถิติทดสอบ

ppc_stat(y, yrep, stat = 'mean') จะแสดงฮิสโตแกรมของสถิติทดสอบ เช่น ค่าเฉลี่ย ซึ่งคำนวณจากชุดข้อมูลที่จำลองแต่ละชุด พร้อมเส้นแนวตั้งที่ค่าของสถิติจากข้อมูลที่สังเกตได้ หากค่าที่สังเกตได้อยู่ในบริเวณหลักของฮิสโตแกรม แสดงว่าแบบจำลองอธิบายลักษณะนั้นของข้อมูลได้

# library(bayesplot)
#
# ppc_stat(y, yrep, stat = 'mean')   # does model capture the mean?
# ppc_stat(y, yrep, stat = 'sd')     # does model capture spread?
# ppc_stat(y, yrep, stat = 'max')    # does model capture extremes?
#
# If observed stat is in the tail of the histogram,
# the model fails to reproduce that statistic.

ค่าพีแบบเบย์

ค่าพีแบบเบย์ (ค่าพีจากการพยากรณ์ภายหลัง) คือสัดส่วนของชุดข้อมูลที่จำลองซึ่งมีสถิติทดสอบสุดโต่งกว่าค่าที่สังเกตได้ ค่าที่ใกล้ 0.5 บ่งชี้ว่าการปรับเทียบทำได้ดี ส่วนค่าที่ใกล้ 0 หรือ 1 บ่งชี้ว่าแบบจำลองไม่สอดคล้องกับข้อมูลในด้านของสถิตินั้น

# Bayesian p-value for the mean:
# obs_mean <- mean(y)
# rep_means <- apply(yrep, 1, mean)
# pval <- mean(rep_means >= obs_mean)
# cat('Bayesian p-value (mean):', round(pval, 3), '
')
# # 0.5 is perfect; < 0.05 or > 0.95 suggests misfit

ฟังก์ชัน PPC อื่น ๆ ของ bayesplot

bayesplot มีการแสดงภาพ PPC อีกหลายรูปแบบนอกเหนือจากการซ้อนทับความหนาแน่น:

  • ppc_hist(y, yrep[1:8,]) — ตารางฮิสโตแกรม
  • ppc_scatter_avg(y, yrep) — กราฟกระจายเปรียบเทียบค่าที่สังเกตได้กับค่าเฉลี่ยของ yrep
  • ppc_intervals(y, yrep) — ช่วงความไม่แน่นอนรอบค่าที่สังเกตแต่ละค่า
  • ppc_rootogram(y, yrep) — สำหรับข้อมูลนับ
# library(bayesplot)
#
# # Grid of 8 simulated histograms vs the observed
# ppc_hist(y, yrep[1:8, ])
#
# # Scatter: y_obs (x) vs mean of yrep (y) — should hug diagonal
# ppc_scatter_avg(y, yrep)
#
# # 50% and 90% posterior predictive intervals around each y_i
# ppc_intervals(y, yrep)

การตีความกราฟ PPC — แบบจำลองไม่สอดคล้อง

รูปแบบที่พบบ่อยของความไม่สอดคล้องและสาเหตุ:

  • yrep กว้างเกินไป — การแจกแจงก่อนกระจายกว้างเกินไป หรือแบบจำลองมีการกระจายเกิน
  • yrep เลื่อนไปจากตำแหน่งเดิม — ใช้ตระกูลฟังก์ชันภาวะน่าจะเป็นไม่ถูกต้อง เช่น ใช้การแจกแจงปกติกับข้อมูลเบ้
  • yrep ไม่แสดงพหุฐานนิยม — จำเป็นต้องใช้แบบจำลองผสม
  • yrep อธิบายค่าปลายสุดไม่ได้ — จำเป็นต้องใช้การแจกแจงหางหนา
# Example: if data has a long right tail but yrep does not,
# consider switching:
# y ~ normal(mu, sigma)  =>  y ~ student_t(nu, mu, sigma)
#
# Or for count data:
# y ~ poisson(lambda)  =>  y ~ neg_binomial_2(mu, phi)  (overdispersion)
cat('PPCs guide model improvement by revealing specific failure modes
')

PPC ในบล็อกแบบจำลองของ Stan

คุณสามารถสร้าง yrep ได้โดยตรงใน Stan โดยใช้บล็อก generated quantities วิธีนี้ไม่ต้องดึงพารามิเตอร์ออกมาใหม่ใน R และมีต้นทุนการคำนวณเทียบเท่ากัน

# Stan model with generated quantities:
# '
# generated quantities {
#   array[N] real y_rep;
#   for (n in 1:N) {
#     y_rep[n] = normal_rng(mu, sigma);
#   }
# }
# '
# Then extract in R:
# yrep <- extract(fit, pars = 'y_rep')$y_rep  # [S, N] matrix

การตรวจสอบไขว้แบบตัดออกทีละรายการ

นอกเหนือจาก PPC แล้ว loo::loo(fit) ยังใช้คำนวณการตรวจสอบไขว้แบบตัดออกทีละรายการเพื่อเปรียบเทียบแบบจำลองที่แข่งขันกัน แบบจำลองที่มี ELPD (ความหนาแน่นการพยากรณ์ลอการิทึมที่คาดหมาย) สูงกว่าจะเป็นแบบจำลองที่ควรเลือก ใช้ loo::loo_compare(loo1, loo2) เพื่อจัดอันดับแบบจำลอง

# library(loo)
# loo1 <- loo(fit1)  # normal model
# loo2 <- loo(fit2)  # student-t model
#
# comparison <- loo_compare(loo1, loo2)
# print(comparison)
#
# Model with elpd_diff > 0 is preferred
# se_diff > |elpd_diff| means difference is not reliable

แนวปฏิบัติที่ดีสำหรับ PPC

ปฏิบัติตามแนวทางเหล่านี้เพื่อการตรวจสอบการพยากรณ์จากการแจกแจงภายหลังอย่างเคร่งครัด:

  • เริ่มด้วย ppc_dens_overlay() เสมอ เพื่อเป็นการตรวจสอบความสมเหตุสมผลโดยรวม
  • ตรวจสอบต่อด้วยสถิติเฉพาะสาขา (ppc_stat()) ที่เกี่ยวข้องกับเป้าหมายการวิเคราะห์
  • ใช้การสุ่มจาก yrep อย่างน้อย 50 ครั้งสำหรับการตรวจสอบด้วยภาพ และใช้ทั้ง 4000 ครั้งสำหรับค่าพีแบบเบย์
  • PPC ที่ไม่ผ่านช่วยชี้แนวทางปรับปรุงแบบจำลอง ซึ่งเป็นการวินิจฉัย ไม่ใช่ความล้มเหลว
# Workflow:
# 1. Fit model -> extract() -> generate yrep matrix
# 2. ppc_dens_overlay(y, yrep[1:50,])  -- visual global check
# 3. ppc_stat(y, yrep, stat='mean')    -- check mean
# 4. ppc_stat(y, yrep, stat='sd')      -- check spread
# 5. ppc_stat(y, yrep, stat='max')     -- check tails
# 6. If misfit found -> revise model -> refit -> re-check

ตรวจสอบอย่างรวดเร็ว: การตีความค่าพีแบบเบย์

ค่าพีแบบเบย์ 0.03 สำหรับสถิติสูงสุดบอกอะไรเกี่ยวกับแบบจำลอง

ทบทวนการตรวจสอบการพยากรณ์จากการแจกแจงภายหลัง

ลำดับการทำงานของ PPC ใน RStan และ bayesplot:

  • ดึงตัวอย่าง: extract(fit, pars='mu')$mu
  • สร้าง yrep: วนซ้ำผ่านการสุ่มจากการแจกแจงภายหลัง โดยเรียกใช้ rnorm(n, mu_s, sigma_s)
  • ตรวจสอบโดยรวม: ppc_dens_overlay(y, yrep[1:50,])
  • ตรวจสอบสถิติ: ppc_stat(y, yrep, stat='mean')
  • ค่าพีแบบเบย์: mean(apply(yrep,1,stat) >= stat(y)) — ค่าใกล้ 0.5 ถือว่าดี
  • สำหรับการเปรียบเทียบแบบจำลอง ให้ใช้ loo::loo_compare()
เริ่มต้นได้ฟรี

เรียนรู้ R ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
43
บทเรียน
159

คำถามที่พบบ่อย

บทเรียน “การตรวจสอบการทำนายภายหลัง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การตรวจสอบการทำนายภายหลัง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การตรวจสอบการทำนายภายหลัง”

ตรวจสอบความสอดคล้องของโมเดลโดยเปรียบเทียบการแจกแจงข้อมูลที่จำลองกับข้อมูลที่สังเกตได้ คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การตรวจสอบการทำนายภายหลัง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม

ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แนะนำแนวคิดแบบเบย์
  2. การเขียนโมเดล Stan ใน R
  3. การสุ่มตัวอย่าง MCMC และการวินิจฉัย
  4. การตรวจสอบการทำนายภายหลัง
← กลับไปที่ R Academy