Marginal vs Conditional Models: Repeated measures is a subset of Correlation
- Mayta
- Jul 3
- 5 min read
Updated: Jul 8
🧠 บริบทของปัญหา: ข้อมูลแบบ "วัดซ้ำ" หรือ "สัมพันธ์กัน"
ข้อมูลที่เรามักเจอในงานวิจัยคลินิกมีลักษณะ ไม่เป็นอิสระ (non-independent) เช่น:
คนไข้คนเดียววัด FBS หลายครั้ง
คนไข้ที่อยู่ในโรงพยาบาลเดียวกัน
วัดค่าซ้าย-ขวาของตา หรือหู
เด็กในห้องเรียนเดียวกัน
ถ้าใช้สถิติทั่วไป (Naïve model) ที่ สมมุติว่าแต่ละข้อมูลเป็นอิสระ ผลจะ ผิด ทันที (เช่น SE ต่ำไป สูงไป, 95% Ci ผิด, p-value ผิด)
📌 เป้าหมายของโมเดล: รับมือกับ "correlation"
เราต้องเลือกว่าจะวิเคราะห์ด้วย:
Marginal model → คำนวณค่าเฉลี่ยของทั้งกลุ่ม (Population-Averaged)
Conditional model → สนใจแต่ละรายหรือกลุ่ม (Subject-Specific)
ดูแผนภาพด้านล่าง:
🔹 ครึ่งบน: Marginal Model (โมเดลค่าเฉลี่ยประชากร)
📍 คำอธิบาย
เป็น โมเดลชั้นเดียว (Single-level) ไม่สนว่าใครเป็นใคร
คิดแบบ “ทุกคนรวมกัน เฉลี่ยว่าเกิดอะไรขึ้น”
ไม่สร้างตัวแปรเฉพาะคนไข้
🔧 วิธีจัดการความสัมพันธ์ในข้อมูล
แบ่งเป็น 2 แบบตามการคำนวณ ความแปรปรวน (Variance):
ประเภท | วิธีคิด | จุดเด่น |
Empirical-based | ใช้ข้อมูลจริงมาคำนวณ SE (เรียก robust SE หรือ sandwich estimator) | ไม่ต้องเดาว่าความสัมพันธ์เป็นแบบไหน |
Model-based variance | สมมุติว่าโครงสร้างความสัมพันธ์เป็นแบบหนึ่ง เช่น AR(1), exchangeable | แม่นยำกว่าเมื่อสมมุติถูกรูปแบบ |
✅ ใช้ใน GEE (Generalized Estimating Equations)
🔸 ครึ่งล่าง: Conditional Model (โมเดลเฉพาะราย/กลุ่ม) 📍 คำอธิบาย
เป็น โมเดลหลายชั้น (Multilevel model) หรือ Hierarchical model
คิดว่า “คนไข้แต่ละคนเริ่มต้นไม่เหมือนกัน” → ใส่ความแปรปรวนระดับกลุ่มเข้าไป
เหมาะกับข้อมูลที่มี คลัสเตอร์ เช่น คนไข้ในแพทย์ต่างคน, โรงพยาบาลต่างกัน
🔧 มี 2 ทางเลือก:
ประเภท | รายละเอียด | ใช้เมื่อ |
Fixed effect | ใส่ตัวแปร "ชื่อกลุ่ม" เช่น แพทย์ A, B, C | ถ้ากลุ่มมีน้อย |
Random effect | ไม่ใส่ชื่อกลุ่ม แต่บอกให้โมเดล "เรียนรู้ว่ากลุ่มต่างกันแค่ไหน" | ถ้ากลุ่มมีจำนวนมาก |
✅ ใช้ใน Mixed-effects model เช่นใน Stata: ใช้คำสั่ง mixed WSSMAXaorta i.section##i.group_bin sex Age || id:
📊 คำทับศัพท์ที่ควรรู้:
ศัพท์ | ความหมาย |
Random intercept | จุดเริ่มต้นเฉพาะของแต่ละกลุ่ม (baseline ต่างกัน) จุดตัดแกน Y |
Random slope | ความชันของแนวโน้มต่างกันในแต่ละกลุ่ม |
Fixed effect | ใส่ชื่อกลุ่มชัด ๆ ลงในโมเดล |
Marginal model | โมเดลที่คิดเฉลี่ยภาพรวมของทุกคน |
Conditional model | โมเดลที่แยกเฉพาะกลุ่ม/รายบุคคล |
GEE | วิธีวิเคราะห์แบบ Marginal model โดยใช้ correlation |
Mixed-effect model | วิธีวิเคราะห์แบบ Conditional model โดยใช้ random effect |
Random intercept ทุกตัวมี model ของตัวเอง แต่ ความชันเท่า

Random intercept with Random slope ทุกตัวมี model ของตัวเอง และ ความชันต่าง

Fixed effect เอา Random intercept with Random slope แต่ละคนมาคิดเลย
📊 ลำดับโมเดลวิเคราะห์ข้อมูลวัดซ้ำ: ดีที่สุด → ถอยตามข้อมูล
อันดับ | โมเดล | คำอธิบาย |
🥇 1 | Conditional Model — Multi-level — Random Effect | โมเดลเฉพาะราย รองรับผลแตกต่างทั้ง intercept และ slope |
🥈 2 | Conditional Model — Multi-level — Fixed Effect | เฉพาะกลุ่มที่มีในข้อมูล ใช้ dummy ไม่สามารถทำนายกลุ่มใหม่ |
🥉 3 | Marginal Model — Single-level — Model-Based Variance | ค่าเฉลี่ยประชากร สมมุติโครงสร้างความสัมพันธ์ |
🪙 4 | Marginal Model — Single-level — Empirical (Robust SE) | ใช้ sandwich SE ไม่ต้องสมมุติโครงสร้างใดๆ |
Conditional Model = “Subject-Specific”
เราไม่ได้สนใจแค่ “คนโดยเฉลี่ย”
แต่เราบอกว่า: “คนแต่ละคนไม่เหมือนกัน”
จึงต้อง model intercepts and/or slope เฉพาะราย
➡️ เพื่อให้ทำเช่นนี้ได้ เราต้อง มีหลายระดับ (Multi-level) ที่ซ้อนอยู่ในข้อมูล
Multi-level
แนวทางระบุ Cluster หลัก vs ย่อย (Nested Structure)
ถ้ามีหลายระดับ เช่น:ตาซ้าย-ขวา ในแต่ละช่วง follow-up ของแต่ละคน
ให้ดูตามนี้:
ระดับ 1 (หลัก): คน (id)
ระดับ 2: ดวงตา (eye)
ระดับ 3: เวลา (visit/month)
→ Stata syntax:
mixed outcome predictors || id: || eye: || month:
หรือถ้า "eye" เป็น within-subject factor (ไม่ใช่คลัสเตอร์), ก็จัดแบบนี้:
mixed outcome i.eye i.month || id:
📌 Tips: ระบุ Cluster
ลักษณะข้อมูล | Cluster คืออะไร? | Model อย่างไร? |
วัดซ้ำในคนเดิม | คน | `mixed y x |
วัดตาซ้าย-ขวา | คน (eye = within factor) | `mixed y i.eye |
คนในโรงพยาบาล | รพ. > คน | `mixed y x |
คนในหลายแพทย์ | แพทย์ > คน | `mixed y x |
คนก่อน-หลัง COVID | คน (time = covariate) | `mixed y i.period |
🥇 1. Conditional Model — Random Effects (Mixed-Effects Model)
ใช้:
mixed outcome predictors || id:
รองรับ: • Random intercept • Random slope • Nested/complex structure
เหมาะเมื่อ: • มี ID / cluster • กลุ่ม ≥ 5 • สนใจการพยากรณ์เฉพาะรายบุคคล
❌ ถอยเมื่อ: • กลุ่มน้อย • ข้อมูลไม่พอ estimate slope • โมเดลไม่ converge
🥈 2. Conditional Model — Fixed Effects
ใช้:
xtreg outcome predictors, fe reg outcome i.group
เหมาะเมื่อ: • กลุ่มน้อย • ต้องการควบคุมเฉพาะกลุ่มในข้อมูล
❌ ถอยเมื่อ: • ไม่มี ID / cluster • ต้องการผลแบบ population-average
"Mixed" = Fixed + Random
mixed = fixed effects + random effects
📌 ส่วนที่ “Fixed” = ตัวแปรทั่วไป (predictors)
เหมือนใช้ใน regress, xtreg, เช่น:
เพศ
อายุ
ชนิดยา
เวลา
📌 ส่วนที่ “Random” = ความแปรปรวนของกลุ่ม (cluster-specific variation)
intercept/slope ที่แตกต่างกันในแต่ละ ID
nested structure: คนในรพ., เด็กในห้องเรียน, ข้อมูลวัดซ้ำในคนเดียวกัน
📘 ตัวอย่างสมการเบื้องหลัง mixed
สมมุติ: วัด HbA1c หลายครั้งในแต่ละคน
HbA1c_ij = β0 + β1*time_ij + u0j + ε_ij
β0, β1 = Fixed effects
u0j = Random intercept (แต่ละคน j เริ่มต้นต่างกัน)
ε_ij = residual error
→ ใน Stata:
mixed HbA1c i.time || id:
🧪 สาระสำคัญของ mixed
Feature | อธิบาย |
“Fixed effect” | ใช้ตีความทั่วไป (e.g. ยาลด HbA1c) |
“Random effect” | สะท้อน variation เฉพาะบุคคล/กลุ่ม |
ใช้กับ data ซ้ำในคน | ✔️ รองรับ repeat/reclustered |
Prediction เฉพาะคน | ✔️ ได้ curve รายคน |
Marginal Model
เพราะ Marginal Model สนใจ “ผลรวมเฉลี่ย” ของประชากร → ไม่ model กลุ่ม/บุคคล→ จึงไม่ต้อง (และไม่สามารถ) แยกชั้นข้อมูล → ไม่มีโครงสร้าง multilevel
Single-level
📌 Correlation ไม่จำเป็นต้อง Multilevel
🔹 Multilevel = มีชั้น (e.g. รพ. > คน)
ใช้ mixed … || hospital: || id:
มี structure hierarchy ชัดเจน
🔸 Single-level ก็มี correlation ได้ ถ้า…
มี ข้อมูลซ้ำในกลุ่มเดียวกัน เช่น:
ตาซ้าย-ขวา → ซ้ำในคน
เด็กในห้องเรียนเดียวกัน
หลายคนจากคลินิกเดียวกัน
ใช้ xtgee … i(cluster), corr(...)
🥉 3. Marginal Model — Model-Based Variance (GEE with correlation)
🎯 เป้าหมาย
วิเคราะห์ ผลเฉลี่ยของประชากร (Population-Averaged)
สนใจว่า “ในภาพรวม ทุกคนตอบสนองต่อ X อย่างไร”
📦 วิธีคิด
Model สมมุติว่า: ข้อมูลมีการวัดซ้ำ → เกิด correlation
แต่ ไม่ได้ model แบบ subject-specific (ไม่มี uⱼ เหมือนใน mixed)
ใช้ correlation matrix เพื่อระบุว่าข้อมูลใน subject เดียวกันมีความสัมพันธ์กันแค่ไหน
🧩 ต้องระบุ correlation structure (working correlation)
corr() | ความหมาย | เหมาะเมื่อ... |
ind | ไม่มีความสัมพันธ์เลย (ρ = 0) | ❌ ห้ามใช้ถ้าเป็น repeated measures |
exchangeable | ทุกคู่สัมพันธ์เท่ากัน | เวลาห่างกันไม่เท่ากัน หรือซ้ำไม่เยอะ |
ar1 | ความสัมพันธ์ลดตามเวลา (ρ^lag) | เวลาห่างเท่ากัน เช่น 0,3,6 เดือน |
sta1 | มีเฉพาะ lag 1 (neighbor เท่านั้น) | ข้อมูลถี่ เช่น hourly |
uns | ไม่สมมุติอะไรเลย | N ใหญ่ + วัดหลายรอบ (≥6) |
🧪 Clinical Use Case:
ตัวอย่าง | corr() ที่ควรใช้ |
HbA1c วัดทุก 3 เดือน | ar1 |
BP วัด admit, discharge, f/u | exchangeable |
CRP วัดรายวัน | sta1 |
Biomarker ทุกสัปดาห์ 8 ครั้ง | uns |
❌ ข้อจำกัด:
ถ้า เลือก structure ผิด → SE จะผิด → p-value ไม่แม่น
ถ้า กลุ่มน้อย → การประมาณ correlation จะไม่นิ่ง
🔴 corr(independent)
สมมุติว่าไม่มีความสัมพันธ์เลย (ρ = 0)
T1 | T2 | T3 | T4 | T5 | |
T1 | 1.00 | 0.00 | 0.00 | 0.00 | 0.00 |
T2 | 0.00 | 1.00 | 0.00 | 0.00 | 0.00 |
T3 | 0.00 | 0.00 | 1.00 | 0.00 | 0.00 |
T4 | 0.00 | 0.00 | 0.00 | 1.00 | 0.00 |
T5 | 0.00 | 0.00 | 0.00 | 0.00 | 1.00 |
🟢 corr(exchangeable)
สมมุติว่า ทุกคู่สัมพันธ์เท่ากัน (ρ = 0.80)
T1 | T2 | T3 | T4 | T5 | |
T1 | 1.00 | 0.80 | 0.80 | 0.80 | 0.80 |
T2 | 0.80 | 1.00 | 0.80 | 0.80 | 0.80 |
T3 | 0.80 | 0.80 | 1.00 | 0.80 | 0.80 |
T4 | 0.80 | 0.80 | 0.80 | 1.00 | 0.80 |
T5 | 0.80 | 0.80 | 0.80 | 0.80 | 1.00 |
🟡 corr(ar1)
ความสัมพันธ์ลดลงตามระยะเวลา (ρ = 0.90)
T1 | T2 | T3 | T4 | T5 | |
T1 | 1.00 | 0.90 | 0.81 | 0.73 | 0.66 |
T2 | 0.90 | 1.00 | 0.90 | 0.81 | 0.73 |
T3 | 0.81 | 0.90 | 1.00 | 0.90 | 0.81 |
T4 | 0.73 | 0.81 | 0.90 | 1.00 | 0.90 |
T5 | 0.66 | 0.73 | 0.81 | 0.90 | 1.00 |
🔵 corr(sta1)
ความสัมพันธ์เฉพาะระยะติดกัน (lag 1), ρ = 0.80
T1 | T2 | T3 | T4 | T5 | |
T1 | 1.00 | 0.80 | 0.00 | 0.00 | 0.00 |
T2 | 0.80 | 1.00 | 0.80 | 0.00 | 0.00 |
T3 | 0.00 | 0.80 | 1.00 | 0.80 | 0.00 |
T4 | 0.00 | 0.00 | 0.80 | 1.00 | 0.80 |
T5 | 0.00 | 0.00 | 0.00 | 0.80 | 1.00 |
🟣 corr(uns)
ไม่สมมุติใด ๆ → ให้แต่ละค่ามี correlation ของตัวเอง
T1 | T2 | T3 | T4 | T5 | |
T1 | 1.00 | 0.86 | 0.74 | 0.55 | 0.33 |
T2 | 0.86 | 1.00 | 0.71 | 0.49 | 0.40 |
T3 | 0.74 | 0.71 | 1.00 | 0.69 | 0.50 |
T4 | 0.55 | 0.49 | 0.69 | 1.00 | 0.66 |
T5 | 0.33 | 0.40 | 0.50 | 0.66 | 1.00 |
🪙 4. Marginal Model — Empirical (Robust SE)
🎯 เป้าหมาย
ปรับ SE ให้ ถูกต้องแม้ model correlation ผิด
ตีความแบบ population-average เช่นเดียวกับ GEE ปกติ
📦 วิธีคิด
xtgee y x1 x2, corr(anything) vce(robust)
vce(robust) = ใช้ sandwich estimator แทนการพึ่ง working correlation
จะ ignore structure ในการหา SE → ใช้ข้อมูลจริงเป็นหลัก
✅ ข้อดี:
แม้คุณสมมุติว่า correlation เป็น exchangeable หรือ ar1
ถ้า model ผิด → SE ยังคง robust ถูกต้อง
🔐 เหมาะกับ:
ข้อมูลไม่สมบูรณ์ (missing visit, spacing ไม่เท่ากัน)
กลุ่มน้อย
ไม่มั่นใจว่าโครงสร้าง correlation แบบไหน
ต้องการ safe fallback ที่ไม่ overstate ความแม่นยำ
🧪 Clinical Use Case:
สถานการณ์ | ทำไมต้องใช้ vce(robust)? |
Visit 0, 3, 9 เดือน (uneven time) | ar1 ใช้ไม่ได้ → ต้อง robust |
มีคนไข้แค่ 15 คน | SE จาก exchangeable จะไม่นิ่ง |
ไม่รู้ว่า time spacing สม่ำเสมอไหม | Structure uncertain → robust ปลอดภัยสุด |
🧭 Marginal Model Decision Tree
START →
→ มีข้อมูลวัดซ้ำหรือกลุ่มที่สัมพันธ์กัน? →
→ ไม่ → regress ปกติ
→ ใช่ →
→ สนใจภาพรวมกลุ่ม (population-avg)? →
→ ใช่ →
→ รู้ structure? →
→ ใช่ → GEE model-based (xtgee, corr(ar1/exch))
→ ไม่แน่ใจ → GEE robust (xtgee, vce(robust))
→ ไม่สนใจภาพรวม → ใช้ conditional model (mixed)
✅ หลักการ: Model-Based SE > Empirical SE
ถ้าคุณ ระบุ corr() ได้ถูกต้องจริง (เช่น ar1 กับข้อมูล 0-3-6 เดือน)
GEE Model-Based จะให้ SE ที่มี efficiency สูงกว่า
→ แปลว่า พลังทางสถิติดีกว่า (statistical power ↑)
📈 นี่คือเหตุผลที่ textbook บอกว่า Model-based “preferred when structure known”
❌ แต่ในโลกจริง: Structure มัก “ไม่รู้แน่ชัด” → Empirical ในตารางล่างเลยดูดีกว่า 📊 เปรียบเทียบสุดท้าย: GEE แบบ Model-based vs Empirical
Feature | Model-Based (GEE) | Empirical (Robust SE) |
ต้องกำหนด corr()? | ✔️ ใช่ | ❌ ไม่จำเป็น |
ถ้า structure ผิด → SE ผิดไหม? | ❌ ใช่ | ✅ SE ยังถูกต้อง |
เหมาะกับข้อมูลกลุ่มน้อย? | ❌ ไม่เหมาะ | ✅ เหมาะมาก |
ใช้ sandwich SE? | ❌ ไม่ใช้ | ✅ ใช้ |
เหมาะกับภาพรวมประชากร? | ✅ ใช่ | ✅ ใช่ |
ตัวอย่างใน Stata | xtgee y x, corr(ar1) | xtgee y x, vce(robust) |
Comentários