Joint Model กับ Stacking: รวมคำตอบ vs รวมกระบวนการ

On this page
Read the English version
บทคัดย่อ
ทั้ง ensemble learning และ joint modelling ต่างประกอบด้วยหลายชิ้นส่วน และคำศัพท์ร่วมอย่าง "การรวม model" ก็ทำให้นักวิจัยทางคลินิกสับสนระหว่างสองแนวคิดนี้อยู่บ่อยครั้ง stacking เป็นเทคนิคเชิง performance คือให้ base model หลายตัว — logistic regression, random forest, XGBoost — ต่างทำนาย binary outcome ตัวเดียวกัน แล้ว meta-model จึง regress บน predicted probabilities เหล่านั้นเพื่อให้ prediction เดียวที่คมขึ้น ส่วน joint model ตอบคนละคำถามโดยสิ้นเชิง มันผูกหลาย process ที่เกี่ยวข้องกันแต่แตกต่างกันของผู้ป่วยคนเดียวกันเข้าด้วยกัน — เช่น biomarker ที่วัดซ้ำ ๆ อย่าง creatinine (longitudinal) กับ survival endpoint อย่างเวลาจนเสียชีวิต — ผ่าน latent trajectory หรือ random effects ที่ใช้ร่วมกัน ทำให้ outcome ทั้งสองถูกประมาณค่าภายใน joint probability เดียว แทนที่จะทำทีละอันแบบ two-stage จุดต่างชี้ขาดคือ "อะไรถูกใช้ร่วมกัน" ระหว่างชิ้นส่วน: stacking ส่ง predictions สำเร็จรูประหว่างชั้น ขณะที่ joint model แบ่งปัน latent state ของตัวผู้ป่วยเองระหว่าง processes บทความนี้วางสมการ ตาราง และตัวอย่างทางคลินิกของทั้งสองแนวคิดเทียบกันเคียงข้าง เพื่อให้ความแตกต่างชัดเจนจนแยกออกได้อย่างไม่มีข้อกังขา
Joint Models · ตอนที่ 2 จาก 2. เริ่มจากตอนแรก: Joint Models: หนึ่ง likelihood สำหรับสองกระบวนการ [[joint-models-longitudinal-survival]].
สองแนวคิดที่ฟังดูคล้ายกัน
ถ้าถามนักวิจัยทางคลินิกว่า joint model คืออะไร หลายคนจะตอบว่า "ก็คือการเอาหลาย ๆ model มารวมกันไง" คำอธิบายนี้ถูกเป๊ะ — แต่มันคือคำอธิบายของเทคนิคคนละตัวที่ชื่อ stacking ต่างหาก และความคล้ายกันของถ้อยคำนี่แหละคือจุดเริ่มต้นของความสับสน ทั้งสองวิธีต่างก็ประกอบด้วยหลายชิ้นส่วน ทั้งคู่ต่างถูกขายว่าเป็นวิธีดึงศักยภาพจากข้อมูลได้มากกว่า model เดี่ยว ๆ แต่จริง ๆ แล้วมันถูกสร้างมาเพื่อตอบคนละคำถาม และการเข้าใจสลับกันจะทำให้เราหยิบเครื่องมือผิดตัวไปแก้ปัญหาผิดโจทย์
วิธีแยกที่สะอาดที่สุดคือดูว่าแต่ละอันมัน รวม อะไรเข้าด้วยกัน stacking รวม คำตอบ — คือ output ของหลาย model ที่ทำนายสิ่งเดียวกัน ส่วน joint model รวม กระบวนการ (processes) — คือหลายสิ่งที่เกี่ยวข้องกันแต่แตกต่างกันซึ่งเกิดขึ้นกับผู้ป่วยคนเดียวกัน บทความนี้จะพาเดินผ่านทั้งสองแนวคิดด้วยตัวอย่างทางคลินิกที่เป็นรูปธรรม วางสมการเทียบกันเคียงข้าง และแสดงให้เห็นว่าทำไมมันจึงไม่ใช่สองรสชาติของไอเดียเดียวกัน
Stacking แบบเป็นรูปธรรม
สมมติเราต้องการทำนาย outcome แบบ binary หนึ่งตัว คือผู้ป่วยที่มาห้องฉุกเฉินจะมี length of stay เกิน 4 ชั่วโมงหรือไม่ $Y = \text{ED length of stay} > 4\text{ hours}$ จากชุดตัวแปรทำนาย $X = \{\text{age, vital signs, triage level, arrival mode}\}$ เราสร้าง base model หลายตัวที่ทำนาย $Y$ ตัวเดียวกัน จาก $X$ ชุดเดียวกัน:
$$X \rightarrow \text{Logistic regression} \rightarrow \hat p_{\text{LR}}$$
$$X \rightarrow \text{Random forest} \rightarrow \hat p_{\text{RF}}$$
$$X \rightarrow \text{XGBoost} \rightarrow \hat p_{\text{XGB}}$$
สำหรับผู้ป่วยรายหนึ่ง model ทั้งสามมักให้ค่าไม่ตรงกันเล็กน้อย logistic regression อาจระมัดระวัง random forest อาจก้าวร้าวกว่า ส่วน gradient-boosted tree อยู่ตรงกลาง — สำหรับผู้ป่วยรายหนึ่ง model ทั้งสามอาจให้ค่า predicted probability เพื่อการอธิบายดังต่อไปนี้:
| Model | Predicted probability |
|---|---|
| Logistic regression | 0.40 |
| Random forest | 0.65 |
| XGBoost | 0.55 |
แล้วเราควรเชื่อเลขตัวไหน? stacking ไม่ยอมเลือก แต่ไปฝึก meta-model ตัวเล็ก ๆ ที่ใช้ predicted probability ของ base model เหล่านั้นเองเป็นตัวแปรทำนาย:
$$\operatorname{logit}\{P(Y=1)\} = \gamma_0 + \gamma_1 \hat p_{\text{LR}} + \gamma_2 \hat p_{\text{RF}} + \gamma_3 \hat p_{\text{XGB}}$$
meta-model จะเรียนรู้ว่าควรให้น้ำหนักแต่ละ base model แค่ไหน — บางทีอาจให้ค่าสัมประสิทธิ์สูงกับ random forest เพราะมันคมและเชื่อถือได้ ขณะที่ลดน้ำหนัก logistic regression ลง โครงสร้างทั้งหมดจึงเป็น pipeline สองชั้น: $X \rightarrow \{\text{Model 1, 2, 3}\} \rightarrow \{\hat p_1, \hat p_2, \hat p_3\} \rightarrow \text{meta-model} \rightarrow \hat p_{\text{final}}$ หัวใจของ stacking คือ หลาย model ทำนาย outcome ตัวเดียวกัน แล้ว meta-model เรียนรู้วิธีรวม predictions เหล่านั้น ให้กลายเป็นคำตอบเดียวที่คมขึ้น
Joint model ถามคนละคำถาม
joint model ไม่ได้เริ่มจากคำถามว่า "จะรวม predictions จากหลาย model อย่างไร?" แต่เริ่มจากข้อสังเกตคนละแบบเลย นั่นคือ เรามีหลายกระบวนการที่สร้างข้อมูล (data-generating processes) ซึ่งเกี่ยวข้องกัน และเราอยากจะ model มันไปด้วยกัน ตัวอย่างคลาสสิกทางคลินิกใช้ outcome สองตัวที่เป็นคนละชนิดกันโดยพื้นฐาน:
- outcome แบบ longitudinal $Y_i(t)$ — ค่า creatinine ที่วัดซ้ำ ๆ ตามเวลา
- outcome แบบ time-to-event (survival) $T_i$ — เวลาจนกระทั่งเสียชีวิต
ทั้งสองไม่ใช่การทำนายสิ่งเดียวกันสองครั้ง แต่เป็นสองสิ่งที่ต่างกันของผู้ป่วยคนเดียวกัน และมันเกี่ยวข้องกัน ผู้ป่วยที่ creatinine แย่ลงเร็วกว่ามักมีความเสี่ยงเสียชีวิตสูงกว่า joint model จึงมี longitudinal submodel สำหรับ trajectory ของ creatinine และ survival submodel สำหรับ hazard ของการเสียชีวิต และที่สำคัญคือมันประมาณค่าทั้งสองไปพร้อมกัน ไม่ใช่ทีละอัน
สอง submodel โดยสังเขป
ฝั่ง longitudinal เป็น linear mixed model ค่า creatinine แต่ละครั้ง $Y_{ij}$ ของผู้ป่วย $i$ ณ เวลา $t_{ij}$ อธิบายด้วยแนวโน้มระดับประชากร บวกส่วนเบี่ยงเฉพาะตัวผู้ป่วย บวก noise:
$$Y_{ij} = \beta_0 + \beta_1 t_{ij} + b_{0i} + b_{1i} t_{ij} + \epsilon_{ij}$$
เมื่อตัด measurement error $\epsilon_{ij}$ ออก เหลือไว้คือ trajectory ที่แท้จริงของผู้ป่วย:
$$m_i(t) = \beta_0 + \beta_1 t + b_{0i} + b_{1i} t$$
ในที่นี้ $\beta_0, \beta_1$ คือ fixed effects (baseline และ slope ระดับประชากร) ส่วน $b_{0i}, b_{1i}$ คือ random effects (ผู้ป่วย $i$ เริ่มสูงหรือต่ำกว่าค่าเฉลี่ยแค่ไหน และ creatinine ไต่ขึ้นเร็วหรือช้ากว่าเฉลี่ยเท่าใด) จากนั้นฝั่ง survival จะเอาระดับที่แท้จริงนั้นวางไว้ใน hazard โดยตรง:
$$h_i(t) = h_0(t)\,\exp\{\gamma X_i + \alpha\, m_i(t)\}$$
โดย $h_0(t)$ คือ baseline hazard, $X_i$ คือ baseline predictors ที่มีผล $\gamma$ (ในที่นี้ $\gamma$ หมายถึงผลของ baseline-covariate ใน survival model — ไม่เกี่ยวกับ meta-model weights $\gamma_0\ldots\gamma_3$ ข้างต้น) และ $\alpha$ คือ association parameter ที่ผูก trajectory เข้ากับความเสี่ยงเสียชีวิต — เช่น $\alpha = \log(1.5)$ ให้ hazard ratio ประมาณ $1.5$ ต่อการเพิ่มขึ้นหนึ่งหน่วยของ underlying creatinine (ค่าที่อ่านได้ขึ้นกับหน่วย/สเกลของการวัด และขึ้นกับโครงสร้างแบบ current-value) สิ่งที่สำคัญที่สุดคือ วิธี ที่ fit สอง submodel นี้ ในแนวทาง two-stage เราจะ fit mixed model ก่อน แล้วแช่แข็ง trajectory ของ creatinine ที่ประมาณได้ จากนั้นค่อยเสียบมันเข้า Cox model — outcome ฝั่ง survival ไม่มีวันย้อนกลับมาแก้ trajectory ได้เลย ส่วน joint model ประมาณ longitudinal และ survival submodel ไปพร้อมกัน ทำให้ $\text{Longitudinal process} \longleftrightarrow \text{Survival process}$ คือข้อมูลไหลได้ทั้งสองทาง
จุดพลิก: predictions เทียบกับข้อมูลร่วมของผู้ป่วย
ตอนนี้เราวางสองเทคนิคเทียบกันได้แล้ว และความต่างที่แท้จริงก็ปรากฏชัด มันไม่ได้อยู่ที่จำนวนชิ้นส่วน — แต่อยู่ที่ว่า ชิ้นส่วนเหล่านั้นถูกเชื่อมด้วยอะไร
stacking เชื่อมด้วย predictions base model แต่ละตัวผลิต output สำเร็จรูปสำหรับ outcome ตัวเดียวกัน คือ $\hat p_1, \hat p_2, \hat p_3$ แล้ว meta-model รวม output สุดท้าย เหล่านั้น: $(\hat p_1, \hat p_2, \hat p_3) \rightarrow \hat p_{\text{final}}$ สิ่งที่ส่งผ่านระหว่างชั้นคือตัวเลขที่มีความหมายว่า "นี่คือคำตอบที่ฉันเดา $Y$ ได้ดีที่สุด" อยู่แล้ว
joint model เชื่อมด้วยข้อมูลร่วมของผู้ป่วย outcome สองตัวของมันเป็นคนละชนิด $Y_i(t)$ และ $T_i$ และผูกเข้าด้วยกันไม่ใช่ด้วย prediction ใด ๆ แต่ด้วยปริมาณแฝงที่ใช้ร่วมกัน: trajectory $m_i(t)$ หรือ slope ของมัน $m_i'(t)$ หรือ random effects $b_i = (b_{0i}, b_{1i})$ เอง ในรูปแบบ shared random effects นั้น hazard ขึ้นกับ intercept และ slope ของตัวผู้ป่วยเองโดยตรง:
$$h_i(t)=h_0(t)\exp\{\gamma X_i+\alpha_0 b_{0i}+\alpha_1 b_{1i}\}$$
สิ่งที่ใช้ร่วมกันตรงนี้คือ latent trajectory และคุณลักษณะของผู้ป่วย — ไม่ใช่ prediction สำเร็จรูปที่ส่งให้ meta-model ความต่างข้อเดียวนี้คือความต่างทั้งหมด: stacking ส่งคำตอบระหว่างชั้น ส่วน joint model แบ่งปันสถานะแฝงของตัวผู้ป่วยเองระหว่าง processes
หัวใจ: joint probability เดียว
ลายเซ็นเชิงรูปแบบของ joint model คือสมการเดียว สำหรับเวอร์ชัน shared random effects joint probability ของ longitudinal measurements และ event time คืออินทิกรัลบน random effects ที่ใช้ร่วมกัน:
$$p(Y_i,T_i) = \int p(Y_i\mid b_i)\, p(T_i\mid b_i)\, p(b_i)\, db_i$$
อ่านทีละส่วน พจน์ $p(Y_i \mid b_i)$ อธิบายค่า creatinine เมื่อกำหนด random effects; $p(T_i \mid b_i)$ อธิบาย event time เมื่อกำหนด random effects ตัวเดียวกัน; และ $p(b_i)$ คือการแจกแจงระดับประชากรของ random effects เหล่านั้น เพราะ outcome ทั้งสองถูก condition บน $b_i$ ตัวเดียวกัน มันจึง ไม่เป็นอิสระต่อกัน — model นิยาม joint probability structure ที่แท้จริง ไม่ใช่การคำนวณสองอันแยกกันที่บังเอิญรันบน dataset เดียวกัน stacking ไม่มีสมการแบบนี้ ไม่มี latent variable ร่วมที่ถูก integrate ออก มีเพียง meta-regression ที่วางทับ predictions สำเร็จรูปเท่านั้น
เทียบกันแบบเคียงข้าง
เมื่อวางทุกแกนของการเปรียบเทียบไว้ในตารางเดียว ความต่างก็ชัดเป็นรูปธรรม:
| ประเด็น | Stacking | Joint model |
|---|---|---|
| เป้าหมาย | เพิ่ม predictive performance | วิเคราะห์ outcomes/processes ที่เกี่ยวข้องกันไปพร้อมกัน |
| จำนวน outcome | มักมีตัวเดียว | มักมีอย่างน้อยสอง process |
| รวมอะไรเข้าด้วยกัน | หลาย predictive model | หลาย outcome process ที่เกี่ยวข้องกัน |
| เชื่อมด้วยอะไร | predictions ของ base model | current value, slope, หรือ random effects |
| ขั้นตอน | base model ก่อน แล้วจึง meta-model | submodel ประมาณค่าร่วมกัน (jointly) |
| ตัวอย่าง | LR + RF + XGB ทำนาย ED-LOS > 4h | creatinine trajectory + time to death |
| ผลลัพธ์สุดท้าย | prediction รวมหนึ่งค่า | trajectory, association, และ event risk |
| คำถามหลัก | ควรให้น้ำหนักแต่ละ model เท่าไร? | การเปลี่ยนแปลงของ outcome หนึ่งสัมพันธ์กับอีกอันอย่างไร? |
อะไรที่เหมือนกัน และทำไมยังสับสน
ทั้งสองวิธีต่างมีหลายชิ้นส่วนจริง — ลักษณะพื้นผิวที่เหมือนกันนี้แหละคือสาเหตุที่คนสับสน แต่ชิ้นส่วนเหล่านั้นเล่นบทบาทต่างกัน ใน stacking หลาย model แข่งขันและเสริมกัน เพื่อทำนาย outcome ตัวเดียว: $X \rightarrow \hat Y_1, \hat Y_2, \hat Y_3$ ทุกลูกศรชี้ไปที่เป้าเดียวกัน ส่วนใน joint model แต่ละ submodel อธิบาย outcome process คนละตัว — $\text{Longitudinal} \rightarrow Y_i(t)$ และ $\text{Survival} \rightarrow T_i$ — แล้วจึงผูกเข้าด้วยกันด้วยโครงสร้างที่ใช้ร่วมกัน stacking คือหลายถนนมุ่งสู่ปลายทางเดียว ส่วน joint model คือหลายถนนที่แตกต่างกันซึ่งถูกยึดไว้ด้วยกันเพราะผู้เดินทางคนเดียวกันอยู่บนทุกเส้น
ความเข้าใจผิดที่ควรแก้ตรง ๆ คือการคิดว่า joint model เป็นแค่ "หลาย model รันขนานกัน" มันไม่ใช่ มันนิยาม joint probability เพื่อให้หลาย outcome process ถูกประมาณค่าไปด้วยกัน และด้วยเหตุนี้มันจึงได้ประโยชน์ที่ระบบขนานล้วน ๆ ให้ไม่ได้ — เช่น มันจัดการ informative dropout ได้อย่างถูกต้อง คือกรณีที่ผู้ป่วยหนักที่สุด creatinine ไต่ขึ้นเร็วแล้วก็หยุดถูกวัดเพราะเสียชีวิตไปแล้ว การวิเคราะห์แบบ longitudinal-only จะสูญเสียผู้ป่วยเหล่านั้นไปเงียบ ๆ และรายงานแนวโน้มที่ดูดีเกินจริง ส่วน joint model ใช้ event time (เวลาเสียชีวิต) เพื่อคงผู้ป่วยเหล่านั้นไว้ในภาพ
เมื่อไรควรใช้อันไหน
หยิบ stacking เมื่อคุณมีเป้าหมายการทำนายชัดเจนหนึ่งอย่าง มีกลยุทธ์การ model ที่เป็นไปได้หลายแบบ และคุณแค่อยากได้ประสิทธิภาพการทำนายรวมที่ดีที่สุด — มันเป็นเครื่องมือเชิง performance หยิบ joint model เมื่อคุณมีสอง process ขึ้นไปที่เกี่ยวข้องกันในผู้ป่วยกลุ่มเดียวกัน — โดยต้นแบบคือ biomarker ที่วัดซ้ำ ๆ คู่กับ survival endpoint — และคำถามเชิงวิทยาศาสตร์คือการเปลี่ยนแปลงของอันหนึ่งสัมพันธ์กับอีกอันอย่างไร หรือเมื่อ dropout ถูกขับด้วยตัว event เอง สรุปในกรอบสองอันจับความต่างไว้ได้:
$$\boxed{\text{Stacking} = \text{many models predict one } Y}$$
$$\boxed{\text{Joint model} = \text{many related outcome processes estimated together}}$$
- stacking คือ pipeline สองชั้น: หลาย predictions ของ outcome ตัวเดียวไหลเข้า meta-model ที่ให้ prediction สุดท้ายหนึ่งค่า
- joint model เชื่อม outcome คนละชนิดผ่าน trajectory ที่ใช้ร่วมกันหรือ random effects ที่ใช้ร่วมกัน: $Y_i(t) \longleftrightarrow b_i \longleftrightarrow T_i$
- ตัวชี้วัดคือ "อะไรถูกใช้ร่วมกัน": stacking ใช้ predictions ร่วมกันระหว่างชั้น ส่วน joint model ใช้ latent state ของผู้ป่วยร่วมกันระหว่าง processes โดยนิยาม joint probability เดียว
- ประโยคที่คมที่สุด: stacking รวมคำตอบจากหลาย model ส่วน joint model รวมข้อมูลจากหลายกระบวนการที่เกี่ยวข้องกัน