← All posts

Recalibration in Practice: Intercept, Slope และ Validation ที่ซื่อตรง

Clinical Epidemiology ResearchUniqcret doctor knowledges THMethodology and Research Design THDiagnosis [Methodology] THPrognosis [Methodology] TH
Recalibration in Practice: Intercept, Slope และ Validation ที่ซื่อตรง
On this page

บทคัดย่อ

เมื่อย้ายโมเดลไปใช้ในที่ใหม่ โมเดลอาจผิดพร้อมกันสองทาง คือ "ระดับ" ความเสี่ยงโดยรวมคลาด (ปัญหา calibration intercept) และ การทำนายสุดโต่งหรือแบนเกินไป (ปัญหา calibration slope) วิธีแก้ทั่วไปคือประเมินทั้งสองพร้อมกัน $\text{logit}(p)=A+B\cdot\text{LP}$ ซึ่งพับกลับเข้าไปเป็นสัมประสิทธิ์ใหม่อย่างสวยงาม โดย slope คูณทุกสัมประสิทธิ์เดิม และ intercept ดูดซับส่วนต่างของระดับที่เหลือ บทความปิดซีรีส์นี้แสดงการ update พร้อมกัน คำนวณผู้ป่วยหนึ่งรายจาก 81.8% ลงมา 65.7% แล้วถามคำถามที่ยากกว่า คือ slope ที่ ซื่อตรง มาจากไหน การใช้ข้อมูลพัฒนาซ้ำจะได้ slope เท่ากับ 1 พอดี ซึ่งเป็นภาพลวงตา แต่ bootstrap เผยให้เห็น optimism และ global shrinkage factor (ที่นี่ ≈ 0.76) เราแยก validation (ใช้โมเดลเดิม รายงานผล) ออกจาก recalibration (แก้โมเดล) พร้อมลำดับที่ถูกต้อง มีทั้ง workbench A/B แบบโต้ตอบและ terminal R/Python ทีละบรรทัด


ภาพสรุป · Visual summary

Part 3 จาก 3 · Calibration & Recalibration. กลับไปที่ Part 1 — calibration in the large [[calibration-in-the-large]] และ Part 2 — calibration slope [[calibration-slope]]

เมื่อโมเดลมาถึงแบบผิดสองทาง

Part 1 และ 2 แก้ทีละความผิด — ระดับ (intercept) หรือความชัน (slope) แต่เมื่อย้ายโมเดลไปยังประชากรที่ต่างจริง ๆ มักได้ทั้งคู่ บนกราฟ calibration เส้นจะทั้งอยู่ใต้เส้นทแยง (ทำนายเกิน) และ แบนเกินไป (ทำนายสุดโต่ง) ในกลุ่มจำลอง 3,000 คนของเรา โมเดลเดิมทำนายเฉลี่ย ~31% ทั้งที่เกิดจริงเพียง ~13% และ calibration slope ต่ำกว่า 1 ชัดเจน

ปรับ intercept และ slope พร้อมกัน

Recalibration ทั่วไปประเมินทั้งสองพารามิเตอร์พร้อมกัน ด้วยการ regress outcome ที่สังเกตได้บน linear predictor เดิม

$$\text{logit}\{P(Y=1)\}=A+B\cdot\text{LP}_{\text{original}}.$$

โดย $A$ ปรับระดับ (แบบ Part 1) และ $B$ ปรับการกระจายของการทำนาย (แบบ Part 2) ในการจำลอง การ fit พร้อมกันให้ $A\approx-1.48$ และ $B\approx0.63$ เมื่อใส่ $\text{LP}_{\text{updated}}=A+B\cdot\text{LP}_{\text{original}}$ เส้น calibration จะแนบเส้น 45° และค่าเฉลี่ยความเสี่ยงที่ทำนายกลับมาที่ ~13% ตรงกับอัตราที่เกิดจริง

การประเมิน slope อย่างเดียวทำได้แต่มักไม่สมเหตุผล เพราะการเปลี่ยน $B$ ยังเลื่อนค่าเฉลี่ยความเสี่ยงที่ทำนายด้วย จึงรบกวน calibration in the large เมื่อ slope ต้องแก้ ให้ประเมิน $A$ และ $B$ พร้อมกัน

Slope คูณทุกสัมประสิทธิ์

Recalibration ไม่ใช่กล่องดำที่แปะไว้ท้ายผลลัพธ์ แต่เขียนสัมประสิทธิ์ของโมเดลใหม่ แทน linear predictor $\text{LP}=\beta_0+\beta_1x_1+\cdots+\beta_kx_k$ ลงใน $A+B\cdot\text{LP}$ แล้วกระจาย

$$\text{LP}_{\text{updated}}=(A+B\beta_0)+(B\beta_1)x_1+\cdots+(B\beta_k)x_k.$$

ดังนั้น intercept ใหม่และสัมประสิทธิ์ใหม่แต่ละตัวคือ

$$\beta_{0,\text{updated}}=A+B\beta_0,\qquad \beta_{j,\text{updated}}=B\beta_j.$$

calibration slope $B$ คูณสัมประสิทธิ์ตัวทำนาย ทุกตัว ด้วยค่าเดียวกัน — นั่นคือความหมายของ "shrinkage" — ส่วน intercept จัดการระดับโดยรวม

ผู้ป่วยหนึ่งราย คำนวณตั้งแต่ต้นจนจบ

ผู้ป่วยที่มี $\text{LP}_{\text{original}}=1.5$ โมเดลเดิมทำนาย

$$p_{\text{original}}=\frac{1}{1+e^{-1.5}}=0.818\;(81.8\%).$$

สมมติการ update จากข้อมูลภายนอกให้ $A=-0.40$ และ $B=0.70$ จะได้

$$\text{LP}_{\text{updated}}=-0.40+0.70(1.5)=0.65,\qquad p_{\text{updated}}=\frac{1}{1+e^{-0.65}}=0.657\;(65.7\%).$$

intercept ที่ติดลบลดระดับโดยรวม และ slope ที่ต่ำกว่า 1 ดึงการทำนายที่สุดโต่งนี้เข้าห่ากลาง — 81.8% กลายเป็น 65.7% ลองใส่ค่า linear predictor อื่นใน workbench ด้านล่าง: Reset คือโมเดลเดิม Fit A,B ทำให้เส้นแนบเส้นทแยง และค่าตัวอย่างจะอัปเดตทันที

Slope ที่ซื่อตรงมาจากไหน

เราอ่านค่าการแก้จากข้อมูลพัฒนาไม่ได้ เมื่อนำโมเดลไปใส่ผู้ป่วยชุดเดียวกับที่ fit มา calibration slope ที่ปรากฏจะ ~1 และ intercept ~0 โดยธรรมชาติ เป็นภาพลวงตาแบบ optimistic slope ที่ซื่อตรงและแก้ optimism แล้วมาจาก internal validation ด้วยการ resampling bootstrap ทำสิ่งนี้ คือ fit ทั้งกระบวนการสร้างโมเดลใหม่ซ้ำ ๆ บน resample วัดว่าดูดีกว่าในข้อมูลเดิมแค่ไหน (optimism) เฉลี่ย แล้วแก้ ในตัวอย่าง apparent slope = 1.00 แต่ optimism-corrected slope — คือ global shrinkage factor — อยู่ราว 0.76 แปลว่าควร shrink สัมประสิทธิ์ลง ~24%

$$\beta_{j,\text{shrunk}}=0.76\,\beta_j,$$

โดยประเมิน intercept ใหม่หลังจากนั้น เพื่อให้ค่าเฉลี่ยความเสี่ยงที่ทำนายยังตรงกับอัตราการเกิดในกลุ่มพัฒนา K-fold cross-validation เป็นอีกทางเลือก แต่สำหรับโมเดล regression มักนิยม bootstrap ในการหา optimism และ shrinkage

Validation ไม่ใช่ recalibration

Validation ถามว่าโมเดลที่ แช่แข็ง ทำงานได้แค่ไหนโดยไม่แก้ — รายงาน discrimination, กราฟ calibration, calibration intercept และ slope, ค่าความคลาดโดยรวม และประโยชน์เชิงคลินิก ส่วน recalibration ถามว่าจะ แก้ โมเดลอย่างไรสำหรับประชากรนี้ ลำดับสำคัญ และข้อมูลชุดเดียวเล่นสองบทบาทไม่ได้ เมื่อใช้ข้อมูลชุดหนึ่งประเมิน $A$ และ $B$ แล้ว มันกลายเป็นข้อมูล model-updating ไม่ใช่ validation set อิสระของโมเดลที่ update แล้ว ลำดับที่ถูกต้องคือ

  1. สร้างโมเดลเดิม
  2. ทำ internal validation ด้วย bootstrap หรือ cross-validation (optimism-corrected slope / shrinkage)
  3. ใช้โมเดลที่ แช่แข็ง กับข้อมูลภายนอกใหม่ และรายงานผล ก่อน การ update ใด ๆ
  4. ประเมิน $A$ และ $B$ เฉพาะเมื่อจำเป็นต้อง recalibrate
  5. Validate โมเดลที่ update แล้วอีกครั้ง — ในอุดมคติใช้อีกชุดข้อมูลอิสระ

ลองรันเอง — R และ Python

Terminal รันทั้งเรื่องบนข้อมูลจำลอง: โมเดลเดิมที่ผิดทั้งระดับและ slope, การ fit $A$ และ $B$ พร้อมกัน, กราฟ calibration แนบเส้นทแยง, ตัวอย่าง 81.8% → 65.7% และ bootstrap ที่เผย shrinkage ที่ข้อมูลพัฒนาซ่อนไว้ พิมพ์บรรทัดที่ไฮไลต์ (หรือกด Enter) กด Tab เพื่อรับคำที่ระบบเดา และสลับแท็บ R / Python ไม่มีการคำนวณในเบราว์เซอร์

เมื่อโมเดลทำนายถูกย้ายไปใช้กับประชากรใหม่ มันอาจผิดได้ สองอย่างพร้อมกัน — ระดับความเสี่ยงโดยรวมสูงเกิน (intercept) และการทำนายสุดโต่งเกินไป (slope ชันเกิน) เทอร์มินัลนี้รันการวิเคราะห์จริงทีละบรรทัดบนข้อมูล จำลอง 3,000 คน โมเดลเดิมที่ถูก "แช่แข็ง" ทำนายเฉลี่ย ~31% ทั้งที่เกิดจริงเพียง ~13% เราทำ full recalibration โดย fit A และ B พร้อมกัน — logit(p) = A + B·LP_original — จนเส้น calibration เด้งมาแนบเส้นทแยงทั้งระดับและความชัน ค่านี้พับกลับเป็นสัมประสิทธิ์ใหม่ (β0,updated = A + B·β0 และทุก βj,updated = B·βj) ต่อด้วยตัวอย่างเลขจริง (LP = 1.5 → 81.8% กลายเป็น 65.7%) แล้วดูว่า slope ที่ "ซื่อสัตย์" ต้องมาจาก bootstrap (internal validation) ไม่ใช่การ refit กับข้อมูลฝึกของตัวเอง และปิดท้ายด้วยหลักการ validation ≠ recalibration คุณเป็นคนพิมพ์เอง กด Enter เพื่อเติมและรัน กด Tab เพื่อรับคำที่ระบบเดา แผง Stage ด้านขวาจะโชว์ค่าและ กราฟ calibration ที่เปลี่ยนไป สลับแท็บ R / Python ได้ ไม่มีการคำนวณในเบราว์เซอร์ ทุกค่าและกราฟถูกคำนวณไว้ก่อนด้วย R และ Python

When a prediction model is moved to a new population it can be wrong in two ways at once — the overall risk level is too high (intercept) AND the predictions are too extreme (the slope is too steep). This terminal runs the real analysis one line at a time on a simulated cohort of 3,000 patients. A frozen original model predicts an average risk of ~31% when only ~13% actually had the event. We apply full recalibration, fitting A and B together — logit(p) = A + B·LP_original — until the calibration curve snaps onto the 45° line in both level and slope. That fix folds back into updated coefficients (β0,updated = A + B·β0 and every βj,updated = B·βj). A worked numeric example (LP = 1.5 → 81.8% becomes 65.7%) makes the arithmetic concrete; then we show that an honest slope must come from a bootstrap (internal validation), not from refitting the model to its own training data; and we close on the principle that validation ≠ recalibration. You drive it: press Enter to autofill and run, Tab to accept the autocomplete ghost, and the Stage on the right shows the numbers and the calibration plot changing. Switch between the R and Python tabs for the same analysis in either language. Nothing runs in your browser; every value and plot was computed in R and Python beforehand.

สรุปประเด็นสำคัญ

เริ่มซีรีส์ที่ Part 1 — calibration in the large [[calibration-in-the-large]] หรือทบทวน Part 2 — calibration slope [[calibration-slope]]

0
ถึงนักอ่านชาวไทยและต่างชาติทำความเข้าใจบริบททางการแพทย์ของผมอ่านต่อ →ถึงนักอ่านชาวไทยและต่างชาติทำความเข้าใจเนื้อหาของผมที่นอกเหนือจากการแพทย์อ่านต่อ →

ความคิดเห็น

ยังไม่มีความคิดเห็น มาเป็นคนแรกกันเลย

เข้าสู่ระบบเพื่อแสดงความคิดเห็น