top of page

Internal Validation with Bootstrap, kNN Imputation, and Fractional Polynomial Models [Thai]

(กรณี kNN imputation หลายชุด + Fractional Polynomial + Bootstrap)

บทนำ: เรากำลังพยายามตอบคำถามอะไร?

ในการพัฒนา prediction model คำถามสำคัญไม่ใช่แค่ว่า

“โมเดล fit กับข้อมูลเราได้ดีแค่ไหน?”

แต่คือ

“โมเดลนี้ overfit แค่ไหนและถ้าเอาไปใช้กับคนใหม่ประสิทธิภาพจะลดลงเท่าไร?”

การตอบคำถามนี้เรียกว่า Internal Validation

บริบทของงานนี้ (Your exact problem)

งานนี้มีความซับซ้อน 3 ชั้นพร้อมกัน:

  1. Missing data จำนวนมาก→ ใช้ Boostrap before kNN single imputation ซ้ำหลายครั้ง→ ได้ imputed datasets = 500ชุด (imp_id 1–500)

  2. Continuous predictors มี non-linearity → ใช้ Multivariable Fractional Polynomial (MFP)→ เลือก FP powers ตอน development

  3. ต้องประเมิน performance ของโมเดลสุดท้าย → AUC→ Calibration slope→ Calibration-in-the-large (CITL)

แนวคิดหลักที่ต้องเข้าใจก่อน (หัวใจของ internal validation)

🔑 Internal validation ไม่ใช่การดูว่า “model เปลี่ยนหรือไม่”

แต่คือการดูว่า

โมเดลสุดท้ายที่เราจะ deploy มี optimism (ความลำเอียงจาก overfitting) เท่าไร

ดังนั้น:

ต้อง validate “model เดียวกัน” เสมอ

“Model เดียวกัน” แปลว่าอะไร?

คำว่า model เดียวกัน หมายถึง

  • ตัวแปรชุดเดิม

  • Fractional polynomial powers เดิม

  • link function เดิม (logit)

  • โครงสร้าง linear predictor เดิม

📌 ไม่ได้หมายความว่า

  • ค่าคงที่ต้องเหมือนกัน

  • centering ต้องเหมือนกัน

  • coefficient ต้องเหมือนกัน

แยก 2 ขั้นตอนให้ชัด (Development vs Validation)

1️⃣ Model Development (อนุญาตให้ใช้ MFP)

คำถามที่ตอบ:

“ควรใช้ตัวแปรอะไรและความสัมพันธ์ควรโค้งแบบไหน?”

สิ่งที่ทำ:

  • run MFP

  • เลือก FP1 / FP2

  • เลือก powers (เช่น −2, 2)

ผลลัพธ์:👉 Final model specificationเช่น

  • age → FP2 (−2, 2)

  • plt_100k → FP2 (2, 3)

หลังจากนี้👉 ห้ามเปลี่ยน powers อีก

2️⃣ Internal Validation (ห้ามเลือก model ใหม่)

คำถามที่ตอบ:

“โมเดลนี้ overfit แค่ไหน?”

สิ่งที่ ห้ามทำ:

  • ❌ rerun MFP

  • ❌ เปลี่ยน FP powers

  • ❌ เพิ่ม/ตัดตัวแปร

สิ่งที่ ทำได้:

  • ✅ bootstrap

  • ✅ refit coefficient

  • ✅ ประเมิน optimism


ทำไม “bootstrap ต้องไม่ rerun MFP”

อาจารย์มักพูดว่า:

“bootstrap แต่ละครั้งข้อมูลไม่เหมือนกันถ้าไม่ rerun MFP model จะไม่เปลี่ยน”

คำตอบที่ถูกต้องคือ:

  • ✅ จริง: bootstrap ทำให้ข้อมูลเปลี่ยน

  • ❌ แต่ internal validation ไม่ต้องการให้ model เปลี่ยน

เพราะ internal validation ต้องการเปรียบเทียบ

performance ของ model เดียวกันระหว่างข้อมูลที่เห็น vs ข้อมูลใหม่

ถ้า rerun MFP:

  • bootstrap #1 → model A

  • bootstrap #2 → model B

แล้วเอาไป test

❗ เท่ากับ train model A แต่ test model B→ calibration, slope, optimism ตีความไม่ได้

แล้ว imputation หลาย dataset ล่ะ?

คำถาม:

“แต่ละ imputed dataset ไม่เหมือนกันทำไมไม่ rerun MFP?”

คำตอบ:

  • imputation → จัดการ missing data uncertainty

  • bootstrap → จัดการ overfitting

แม้ข้อมูลจะต่าง👉 เรายังต้อง validate model เดียวกัน

ไม่งั้น:

  • ไม่มี final model

  • ไม่มี optimism ที่นิยามได้

Bootstrap before kNN imputation ไม่เพียงพอ

ทำไมต้อง Bootstrap หลังจากได้ 500 data set มาแล้ว If your final model specification is derived from all 500 imputed datasets, then the bootstrap used to generate those datasets does NOT estimate model optimism. ตอนทำ Final model ทำจาก 500 dataset นั้น ถ้าไม่ bootstrap มันอีกมันก็จะไม่ช่วย evaluate model optimism

ประเด็นลึก: Fractional Polynomial กับ re-centering

FP power = ตัวตนของ model

centering constant = parameterization

สมการ:

c ทำอะไร?

  • c ทำหน้าที่ขยับกราฟขึ้นลง

  • ไม่เปลี่ยนหย้าตาของกราฟ

📌 ความชันจึงเท่ากันทุกจุด 📌 ความโค้งเลยเท่ากัน β ทำอะไร?

  • ขยาย / ย่อ “ความสูง” ของเส้น

  • แต่ ไม่เปลี่ยนรูปทรง

เหมือนคุณเอารูปวาดไปซูมเข้า–ออก

📌 ความชันไม่เท่ากัน แต่รูปร่างเหมือน 📌 ซูม ≠ เปลี่ยนรูป แปลว่า:

  • รูปร่างเส้นโค้งเหมือนเดิม

  • intercept ดูดความต่าง

  • prediction ไม่เปลี่ยน

📌 re-centering ไม่ได้เปลี่ยน model

ความโค้งมาจากฟังก์ชันที่ขึ้นกับ X vars

ค่าคงที่แค่เลื่อนเส้นขึ้น–ลง

เลยไม่เปลี่ยนความโค้ง

ทำไม “fix centering constant” ถึงผิด

ถ้าคุณเอา constant จาก dataset หนึ่งไปใช้กับอีก dataset:

  • intercept จะเพี้ยน

  • CITL จะ bias

  • calibration เสีย

ดังนั้น:

centering ต้อง recompute ตาม sample

Rule:

  • FP powers → fix

  • ไม่มี rerun MFP → no new FP

  • re-centering → ทำใหม่ในทุก sample

  • bootstrap → train ใหม่ / test บน original for each impute set

  • performance → AUC, slope, CITL

ทั้งหมดนี้ = TRIPOD-correct internal validation

ขั้นตอน Internal Validation

Example ระดับ imputation (m = 1…140)

A) Apparent performance (Aₘ)

  • fit final model บน imputation m

  • คำนวณ:

    • AUCₘ

    • slopeₘ

    • CITLₘ

B) Bootstrap test performance

  • bootstrap B = 50 ครั้ง

  • ในแต่ละ bootstrap:

    • train model บน bootstrap sample

    • test บน original imputation

  • ได้ Tₘ₁ … Tₘᴮ

  • คำนวณ T̄ₘ

C) Optimism

Optimismₘ = Aₘ -  T̄ₘ

Correctedₘ = Aₘ - Optimismₘ  T̄ₘ = Correctedₘ

รวมทุก imputation

  • Ā = median / mean ของ A₁…A₁₄₀

  •  = median / mean ของ T̄₁…T̄₁₄₀

  • Optimism = Ā − T̄


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

ประเด็น

คำตอบ

rerun MFP ใน bootstrap

❌ ไม่ควร

FP powers ต้อง fix

✅ ใช่

re-center FP ใหม่

✅ ถูก

copy constant ข้าม dataset

❌ ผิด

internal validation ยัง valid

✅ แน่นอน

 Re-centering is not a new model

“Internal validation ต้องใช้ functional form เดิมไม่ใช่ numeric parameterization เดิมการ re-centering FP เป็นเพียงการเขียนสมการใหม่ซึ่งไม่เปลี่ยน model และไม่ละเมิด internal validation”




Recent Posts

See All
Post: Blog2_Post

​Message for International and Thai Readers Understanding My Medical Context in Thailand

Message for International and Thai Readers Understanding My Broader Content Beyond Medicine

bottom of page