Marginal vs Conditional Models: Repeated measures is a subset of Correlation
- Mayta 
- Jul 3
- 5 min read
Updated: Jul 17
🧠 บริบทของปัญหา: ข้อมูลแบบ "วัดซ้ำ" หรือ "สัมพันธ์กัน"
ข้อมูลที่เรามักเจอในงานวิจัยคลินิกมีลักษณะ ไม่เป็นอิสระ (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) | 






Comments