การตรวจสอบการทำนายภายหลัง
ตรวจสอบความสอดคล้องของโมเดลโดยเปรียบเทียบการแจกแจงข้อมูลที่จำลองกับข้อมูลที่สังเกตได้
การตรวจสอบการทำนายภายหลัง เป็นบทเรียน 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 modelppc_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)— กราฟกระจายเปรียบเทียบค่าที่สังเกตได้กับค่าเฉลี่ยของ yrepppc_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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- แนะนำแนวคิดแบบเบย์
- การเขียนโมเดล Stan ใน R
- การสุ่มตัวอย่าง MCMC และการวินิจฉัย
- การตรวจสอบการทำนายภายหลัง