Calibration in the Large และ Calibration Intercept

On this page
บทคัดย่อ
โมเดลทำนายทางคลินิกอาจ จำแนก ผู้ป่วยความเสี่ยงสูงออกจากความเสี่ยงต่ำได้ดีเยี่ยม แต่ยังบอก "ระดับ" ความเสี่ยงที่แท้จริงผิดได้ Calibration in the large คือการตรวจสอบ calibration ที่หยาบที่สุดแต่สำคัญที่สุด นั่นคือ ค่าเฉลี่ยความเสี่ยงที่ทำนายเท่ากับอัตราการเกิดเหตุการณ์จริงหรือไม่ เมื่อย้ายโมเดลไปใช้ในประชากรที่โรคพบบ่อยหรือน้อยกว่ากลุ่มที่พัฒนาโมเดล ระดับความเสี่ยงโดยรวมมักคลาดเคลื่อน เส้น calibration จะขนานแต่หลุดจากเส้น 45° บทความนี้นิยาม calibration in the large แนะนำ calibration intercept $A$ ที่ใช้วัดค่านี้ และแสดงวิธี intercept-only recalibration คือ $\text{logit}(p)=A+\text{LP}$ ที่ปรับระดับให้ถูกต้องโดยไม่กระทบการจัดลำดับผู้ป่วย พร้อมกราฟโต้ตอบและ terminal R/Python ทีละบรรทัดให้เห็นเส้น calibration ขยับกลับมาแนบเส้นทแยงเมื่อ $A$ เปลี่ยน บทความนี้เป็น Part 1 จากซีรีส์สามตอนเรื่อง calibration และ recalibration
Part 1 จาก 3 · Calibration & Recalibration. ต่อไป: calibration slope [[calibration-slope]] แล้วตามด้วย recalibration in practice [[recalibration-in-practice]]
Discrimination ไม่ใช่ calibration
ในทุกโมเดลความเสี่ยงมีสองคำถามซ่อนอยู่ Discrimination ถามว่า โมเดลให้ค่าความเสี่ยงสูงกับผู้ป่วยที่เกิดเหตุการณ์จริงหรือไม่ ส่วน calibration ถามคนละอย่าง คือ ค่าความน่าจะเป็นที่ทำนายนั้น ถูกต้องเชิงตัวเลข หรือไม่ เมื่อโมเดลบอก 20% ผู้ป่วยแบบนี้เกิดเหตุการณ์จริงราว 20 ใน 100 คนไหม โมเดลอาจจัดลำดับผู้ป่วยได้สมบูรณ์ (AUC สูง) แต่ยังให้ค่าความเสี่ยงที่สูงหรือต่ำเกินไปอย่างเป็นระบบ การตัดสินใจที่อิงตัวเลข เช่น รักษาเมื่อเกิน 10% หรือให้ความมั่นใจเมื่อต่ำกว่า 5% ล้วนขึ้นกับ calibration ไม่ใช่การจัดลำดับ
"Calibration in the large" คืออะไร
Calibration in the large เป็นบทสรุป calibration ที่ง่ายที่สุด เทียบแค่สองเลข คือ ค่าเฉลี่ยความเสี่ยงที่ทำนาย ของทุกคน กับ อัตราการเกิดเหตุการณ์จริง
$$\bar{p}=\frac{1}{n}\sum_{i=1}^{n}\hat p_i \qquad\text{vs.}\qquad \bar{y}=\frac{1}{n}\sum_{i=1}^{n}y_i$$
ถ้าโมเดลทำนายความเสี่ยงเฉลี่ย 23% แต่เกิดเหตุการณ์จริงเพียง 12% แปลว่าโดยเฉลี่ยทำนายสูงเกินราวสองเท่า บนกราฟ calibration (แกนตั้ง = อัตราที่เกิดจริง แกนนอน = ความเสี่ยงที่ทำนาย แบ่งเป็นสิบส่วนตามความเสี่ยง) จะเห็นเส้นอยู่ ใต้ เส้นทแยงตลอด ทุกระดับอัตราจริงต่ำกว่าที่ทำนาย สาเหตุที่พบบ่อยที่สุดคือ ความชุก (prevalence) ของ outcome ต่างกัน โมเดลพัฒนาในที่ที่โรคพบบ่อยกว่า เมื่อย้ายมาใช้ในที่ที่ความชุกต่ำกว่า baseline risk จึงสูงเกินไป
Calibration intercept $A$
เราวัดความคลาดของ "ระดับ" ด้วยเลขตัวเดียว คือ calibration intercept $A$ นำ linear predictor ของผู้ป่วยแต่ละคน
$$\text{LP}=\hat\beta_0+\hat\beta_1x_1+\cdots+\hat\beta_kx_k,$$
ตรึงไว้เป็น offset แล้ว fit เฉพาะ intercept กับ outcome ที่สังเกตได้
$$\text{logit}\{P(Y=1)\}=A+\text{LP}.$$
ค่าอุดมคติคือ $A=0$ ค่า $A$ ติดลบ แปลว่าโมเดลทำนายเกิน (baseline risk มากไป) ค่า $A$ เป็นบวก แปลว่าทำนายต่ำไป เพราะ $A$ เลื่อน log-odds ของทุกคนเท่ากันหมด จึงเปลี่ยนแค่ ระดับ ความเสี่ยงโดยรวม ไม่เคยเปลี่ยน ลำดับ ผู้ป่วย — discrimination ไม่ถูกกระทบ
ลองลาก $A$ ด้านล่างแล้วดูเส้น calibration ขยับ กด Fit A เพื่อกระโดดไปยังค่าที่เข้ากับข้อมูลที่สุด และ Reset เพื่อกลับไปที่โมเดลเดิม
Intercept-only recalibration
เมื่อความชัน (slope) ของเส้น calibration ใกล้ 1 อยู่แล้ว — ผลของตัวแปรทำนายยังใช้ได้ ต่างแค่ baseline — วิธีแก้คือปรับเฉพาะ intercept
$$\text{logit}(p_{\text{updated}})=A+\text{LP},\qquad p_{\text{updated}}=\frac{1}{1+e^{-(A+\text{LP})}}.$$
นี่คือสถานการณ์ของการย้ายโมเดลไปยังประชากรที่ความชุก outcome ต่างกัน แต่ความสัมพันธ์ระหว่างตัวแปรทำนายกับ outcome คล้ายเดิม เป็นการ update โมเดลที่เบาที่สุด คือใช้เลขตัวเดียวที่ประเมินจากข้อมูลใหม่ มาปรับระดับทุกการทำนาย หากความ ชัน ของ calibration ผิดด้วย — ทำนายสุดโต่งหรือแบนเกินไป — การแก้ intercept อย่างเดียวไม่พอ ต้องไปที่ slope (Part 2) หรือปรับพร้อมกัน (Part 3)
ข้อควรระวังที่ Part 3 จะขยายความ: เราประเมิน $A$ อย่างซื่อตรงจากการนำโมเดลกลับไปใส่ข้อมูลพัฒนาตัวเองไม่ได้ เพราะที่นั่น intercept ที่ปรากฏจะ ~0 โดยธรรมชาติ การแก้ที่ซื่อตรงต้องใช้ validation sample หรือการ resampling (bootstrap / cross-validation)
ลองรันเอง — R และ Python
Terminal ด้านล่างรันการวิเคราะห์จริงทีละบรรทัดบนกลุ่มจำลอง 3,000 คน คือ ใช้โมเดลเดิมที่ทำนายเกิน วัด calibration in the large ประเมิน $A$ แล้วดูกราฟ calibration บนแผง Stage ขยับขึ้นแนบเส้นทแยงหลังแก้ intercept พิมพ์บรรทัดที่ไฮไลต์ (หรือกด Enter เพื่อเติมและรัน) กด Tab เพื่อรับคำที่ระบบเดา และสลับแท็บ R / Python เพื่อดูการวิเคราะห์เดียวกันในทั้งสองภาษา ไม่มีการคำนวณในเบราว์เซอร์ ทุกค่าและกราฟถูกคำนวณไว้ก่อนแล้วบนข้อมูลจำลอง
โมเดลทำนายที่ จำแนก ผู้ป่วยได้ดี ยังอาจให้ระดับความเสี่ยง โดยรวม ผิดได้ เมื่อนำไปใช้ในประชากรที่โรคพบบ่อยหรือน้อยกว่าเดิม เทอร์มินัลนี้รันการวิเคราะห์จริงทีละบรรทัดบนข้อมูล จำลอง 3,000 คน โมเดลเดิมที่ถูก "แช่แข็ง" ทำนายเฉลี่ย ~23% ทั้งที่เกิดเหตุการณ์จริงเพียง ~12% นี่คือปัญหา calibration in the large เราวัดด้วย calibration intercept (A) แล้วแก้แบบ intercept-only จนเส้น calibration ขยับกลับมาแนบเส้นทแยง คุณเป็นคนพิมพ์เอง กด Enter เพื่อเติมและรัน กด Tab เพื่อรับคำที่ระบบเดา แผง Stage ด้านขวาจะโชว์ค่าและ กราฟ calibration ที่เปลี่ยนไป สลับแท็บ R / Python ได้ ไม่มีการคำนวณในเบราว์เซอร์ ทุกค่าและกราฟถูกคำนวณไว้ก่อนด้วย R และ Python
A prediction model that ranks patients well can still get the overall risk level wrong when it is moved to a population where the disease is more, or less, common. 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 ~23% when only ~12% actually had the event — a calibration-in-the-large problem. We measure it with the calibration intercept (A) and apply an intercept-only recalibration until the calibration curve lifts back onto the 45° line. 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.
สรุปประเด็นสำคัญ
- Calibration in the large เทียบค่าเฉลี่ยความเสี่ยงที่ทำนายกับอัตราการเกิดจริง — คือ "ระดับ" ความเสี่ยงโดยรวม
- Calibration intercept $A$ ใช้วัดค่านี้: $A=0$ สมบูรณ์, $A<0$ ทำนายเกิน, $A>0$ ทำนายต่ำ
- Intercept-only recalibration $\text{logit}(p)=A+\text{LP}$ ปรับระดับการทำนายโดยไม่เปลี่ยนลำดับผู้ป่วย — เหมาะเมื่อ calibration slope ใกล้ 1 อยู่แล้ว
- ประเมิน $A$ จากข้อมูล validation หรือด้วยการ resampling อย่าใช้ข้อมูลพัฒนาดิบซ้ำ
อ่านต่อ Part 2 — calibration slope [[calibration-slope]] สำหรับกรณีที่การทำนายสุดโต่งเกินไป และ Part 3 — recalibration in practice [[recalibration-in-practice]] สำหรับการปรับ intercept และ slope พร้อมกันด้วย validation ที่ซื่อตรง