หา Risk Ratio เมื่อผลลัพธ์พบบ่อย: ลำดับขั้นถอยลงเมื่อ Log-Binomial ชนกำแพง

Clinical Epidemiology ResearchMethodology and Research Design THUniqcret doctor knowledges TH
หา Risk Ratio เมื่อผลลัพธ์พบบ่อย: ลำดับขั้นถอยลงเมื่อ Log-Binomial ชนกำแพง
On this page

Read the English version

บทคัดย่อ

ภาวะสับสนเฉียบพลัน (delirium) หลังผ่าตัดกระดูกสะโพกหักพบบ่อย โปรโตคอลที่สัญญาว่าจะรายงานอัตราส่วนความเสี่ยง (risk ratio) จึงรายงานเป็น odds ratio อย่างง่ายไม่ได้ แบบจำลอง log-binomial ประมาณ risk ratio ได้โดยตรง แต่มักไม่ลู่เข้า (convergence) เมื่อความเสี่ยงของผู้ป่วยบางรายใกล้ 1 บันไดสี่ขั้นช่วยจัดการปัญหานี้ เริ่มจากแบบจำลอง log-binomial จากนั้นใช้ Poisson ดัดแปลง (modified Poisson regression) และแบบจำลอง Gaussian ที่ใช้ log link โดยทั้งสองใช้ค่าคลาดเคลื่อนมาตรฐานแบบแซนด์วิช (robust standard error) ขั้นสุดท้ายคือ logistic regression ซึ่งรายงานเป็น odds ratio ที่ระบุชัดว่าเป็น odds ratio หรือปรับมาตรฐานเป็น risk ratio และผลต่างความเสี่ยง ในทะเบียนข้อมูลจำลองผู้ป่วย 20,000 ราย แบบจำลอง log-binomial ไม่ลู่เข้า Poisson ดัดแปลงให้ risk ratio แบบมีเงื่อนไข (conditional) เท่ากับ 0.83 โดยมีความเสี่ยงที่แบบจำลองทำนายเกิน 1 จำนวน 1,293 ค่า และขั้น Gaussian ให้ 0.89 การปรับมาตรฐานให้ risk ratio ระดับประชากร (marginal) เท่ากับ 0.86 เทียบกับค่าจริงระดับประชากรในข้อมูลจำลองที่ 0.88 บทความนี้สรุปว่าบันไดนี้เป็นกลยุทธ์ที่ใช้งานได้จริง ให้ถอยลงขั้นเฉพาะเมื่อมีความล้มเหลวที่ระบุได้ และระบุ estimand ของทุกขั้น


ภาพสรุป ข้อมูลจำลอง

โปรโตคอลที่สัญญาว่าจะรายงาน risk ratio

โปรโตคอลของทะเบียนผู้ป่วยกระดูกสะโพกหักระบุผลหลักไว้เพียงอย่างเดียว คืออัตราส่วนความเสี่ยง (risk ratio) ที่ปรับแล้วของภาวะสับสนเฉียบพลัน (delirium) หลังผ่าตัด เมื่อเทียบการผ่าตัดภายใน 24 ชั่วโมงหลังรับเข้าโรงพยาบาลกับการผ่าตัดที่ช้ากว่านั้น ภาวะสับสนเฉียบพลันเกิดในผู้ป่วยกลุ่มนี้เกือบหนึ่งในสาม แบบจำลอง log-binomial ที่ปรับตัวแปรร่วมแล้วไม่ลู่เข้า (converge คือขั้นตอนคำนวณไม่เคยลงตัวที่ค่าประมาณที่เสถียร) และคณะกรรมการอำนวยการจะประชุมในสัปดาห์หน้า

ทะเบียนนี้เป็นข้อมูลจำลอง ประกอบด้วยผู้สูงอายุที่กระดูกสะโพกหัก 20,000 ราย โดย 31.0% เกิดภาวะสับสนเฉียบพลัน ตัวแปรสัมผัส (exposure) คือ surg24 (1 = ผ่าตัดภายใน 24 ชั่วโมง, 0 = ช้ากว่านั้น) แบบจำลองปรับด้วยอายุที่ลบค่ากึ่งกลางแล้ว (centred age) เพศ ภาวะเปราะบาง (frailty) ภาวะสมองเสื่อม (dementia) ระดับ ASA physical status ตั้งแต่ 3 ขึ้นไป (เกรดความพร้อมของร่างกายก่อนดมยาสลบ) และการใช้ยากันเลือดแข็งตัว (anticoagulant) โดยเป็นพจน์หลัก ไม่มีปฏิกิริยาสัมพันธ์ (interaction) ผู้ป่วยที่เปราะบาง มีภาวะสมองเสื่อม หรือใช้ยากันเลือดแข็งตัวมักรอผ่าตัดนานกว่า

การจำลองยังสร้างสองสิ่งที่แบบจำลองที่มีเฉพาะพจน์หลักนี้ไม่ได้ใส่ไว้ การผ่าตัดเร็วลด odds ของภาวะสับสนเฉียบพลันเฉพาะในผู้ป่วยที่ไม่เปราะบาง และปฏิกิริยาสัมพันธ์ระหว่างภาวะเปราะบางกับภาวะสมองเสื่อมเพิ่ม odds ขึ้นอีกเมื่อมีทั้งสองภาวะ ผู้ป่วยในทะเบียนที่มีความเสี่ยงจริงของภาวะสับสนเฉียบพลันสูงที่สุดในข้อมูลจำลองมีค่า 0.991 ซึ่งใกล้กำแพง สิ่งที่ตามมาเป็นกลยุทธ์ที่ใช้งานได้จริง คือบันไดสี่ขั้นเรียงตามลำดับตายตัว แต่ละขั้นมีสัญญาณความล้มเหลวของตัวเอง และมี estimand (ปริมาณเป้าหมายของการประมาณ) ของตัวเอง ซึ่งคือปริมาณที่แน่ชัดที่ต้องการประมาณ

บันไดสี่ขั้น เรียงตามลำดับ

แต่ละขั้นจำลองความเสี่ยงของภาวะสับสนเฉียบพลันของผู้ป่วยผ่านการเลือกสามอย่าง ฟังก์ชันเชื่อมโยง (link function) กำหนดมาตราที่ตัวแปรร่วมออกฤทธิ์ จึงกำหนดมาตรวัดผลด้วย เมื่อใช้ log link ค่า exponential ของสัมประสิทธิ์ตัวแปรสัมผัสคือ risk ratio family (การแจกแจงของผลลัพธ์) คือการแจกแจงที่สมมติให้ผลลัพธ์ ซึ่งกำหนดว่าความแปรปรวนของผลลัพธ์ขึ้นกับค่าเฉลี่ยอย่างไร สิ่งที่สามคือวิธีคำนวณค่าคลาดเคลื่อนมาตรฐาน (standard error, SE)

เมื่อผลลัพธ์พบบ่อย odds ratio เป็นตัวแทนของ risk ratio ได้ไม่ดี ขณะที่แบบจำลอง log link ประมาณ risk ratio ได้โดยตรง [1] การปรับแบบจำลอง log-binomial ก่อน แล้วใช้ Poisson regression ที่มีความแปรปรวนแบบ robust เมื่อแบบจำลองแรกล้มเหลว เป็นกลยุทธ์ที่เผยแพร่แล้ว [2] บันไดนี้ขยายแนวทางนั้นเป็นสี่ขั้น

ขั้นที่ 1: แบบจำลอง log-binomial

แบบจำลอง log-binomial จับคู่ binomial family ซึ่งเป็นการแจกแจงตามธรรมชาติของผลลัพธ์แบบใช่หรือไม่ใช่ เข้ากับ log link เมื่อแบบจำลองนี้ปรับได้และแบบจำลองค่าเฉลี่ยของมัน (mean model คือวิธีที่ความเสี่ยงขึ้นกับตัวแปรร่วม) ถูกต้อง ทั้ง risk ratio และ SE ของมันไม่ต้องซ่อมแซม จึงควรมาก่อน จุดอ่อนของมันคือ การลู่เข้า (convergence) ใกล้กำแพง ขั้นตอนคำนวณอาจไม่ลงตัวเลย [3]

ในทะเบียนนี้ Stata ชนขีดจำกัด iterate(100) พิมพ์ข้อความ "convergence not achieved" แล้วยังคืนตารางสัมประสิทธิ์โดยไม่มีรหัสข้อผิดพลาด มี SE สองตัวหายไป ตัวอื่นส่วนใหญ่ใกล้ศูนย์ และมีคำเตือนว่าความเสี่ยงที่แบบจำลองทำนาย (fitted risk) อยู่นอกช่วงที่เป็นไปได้ การปรับจึงติดอยู่ที่ขอบของค่าสัมประสิทธิ์ที่แบบจำลองยอมให้

สัมประสิทธิ์ที่พิมพ์ออกมาไม่มีตัวใดเป็นค่าประมาณ จึงต้องตรวจ e(converged) ใน Stata หรือองค์ประกอบ converged ของผลการปรับใน R ก่อนเสมอ R หยุดเร็วกว่านั้นและขอค่าเริ่มต้น (starting values) ค่าจากขั้นที่ 2 ซึ่งเป็นวิธีแก้ที่ใช้กันทั่วไปมักไม่ช่วย เพราะการปรับขั้นนั้นมีความเสี่ยงที่ทำนายเกิน 1 อยู่ 1,293 ค่า

Stata: ขั้นที่ 1 หยุดโดยไม่ลู่เข้า

โค้ด Stata w1_sim.do (บรรทัด 479-480 จาก 719)
* rung 1: log-binomial; it stops when a covariate pattern would need a risk above 1
capture noisily glm delirium surg24 age_c female frail dementia asa3 anticoag, family(binomial) link(log) iterate(100)
ผลลัพธ์จากการรัน w1_sim.log
Iteration 99: Log likelihood = -8670.8439  (not concave)
Iteration 100: Log likelihood = -8670.8431  (not concave)
convergence not achieved

Generalized linear models                         Number of obs   =     20,000
Optimization     : ML                             Residual df     =     19,995
                                                  Scale parameter =          1
Deviance         =  17341.68628                   (1/df) Deviance =   .8673011
Pearson          =   1700027117                   (1/df) Pearson  =   85022.61

Variance function: V(u) = u*(1-u)                 [Bernoulli]
Link function    : g(u) = ln(u)                   [Log]

                                                  AIC             =   .8675843
Log likelihood   = -8670.843139                   BIC             =  -180678.5

------------------------------------------------------------------------------
             |                 OIM
    delirium | Coefficient  std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
      surg24 |  -.5265766   .0238965   -22.04   0.000     -.573413   -.4797403
       age_c |    .010804   6.50e-10  1.7e+07   0.000      .010804     .010804
      female |   .0786547   6.69e-09  1.2e+07   0.000     .0786547    .0786548
       frail |   .7141457          .        .       .            .           .
    dementia |   .5969457   2.45e-08  2.4e+07   0.000     .5969456    .5969457
        asa3 |   .1162342   1.25e-08  9.3e+06   0.000     .1162342    .1162342
    anticoag |   .1074409   7.05e-09  1.5e+07   0.000     .1074408    .1074409
       _cons |  -1.668433          .        .       .            .           .
------------------------------------------------------------------------------
Warning: Parameter estimates produce inadmissible mean estimates in one or
         more observations.
Warning: Convergence not achieved.
ข้อมูลจำลอง ผลลัพธ์จากโค้ดที่แสดงตั้งแต่รอบการคำนวณสุดท้ายเป็นต้นไป ตารางไม่มีค่าประมาณที่ใช้ได้

ขั้นที่ 2: Poisson ดัดแปลงพร้อมค่าคลาดเคลื่อนมาตรฐานแบบ robust

Poisson ดัดแปลง (modified Poisson regression) คง log link ไว้ แต่ใช้ Poisson family ซึ่งรับความเสี่ยงที่แบบจำลองทำนายเกิน 1 ได้ จึงไม่ค่อยติดขัด [4] ค่า exponential ของสัมประสิทธิ์ยังคงเป็น risk ratio ราคาที่ต้องจ่ายคือความแปรปรวนที่ผิด เพราะความแปรปรวนของ Poisson เท่ากับค่าเฉลี่ย ซึ่งมากกว่าความแปรปรวนของ binomial ดังนั้น SE ที่คำนวณจากแบบจำลองจึงใหญ่เกินไป

วิธีแก้คือ ค่าคลาดเคลื่อนมาตรฐานแบบแซนด์วิช (robust standard error) ซึ่งคำนวณจากความกระจายที่สังเกตได้ของข้อมูล ไม่ใช่จากสูตรของ family ตอนที่ 4 อธิบายว่ามันทำงานอย่างไร robust standard error ช่วยแก้ค่าคลาดเคลื่อนมาตรฐานเมื่อข้อสมมติเรื่องความแปรปรวนผิด แต่ไม่ได้แก้แบบจำลองค่าเฉลี่ยที่ผิด และสัมประสิทธิ์ที่ลำเอียงก็ยังคงลำเอียงอยู่

ในทะเบียนนี้ Poisson ดัดแปลงให้ risk ratio ของการผ่าตัดเร็วเท่ากับ 0.83 (ช่วงเชื่อมั่น 95% หรือ CI เท่ากับ 0.79 ถึง 0.88) แต่ไม่มีสิ่งใดกันความเสี่ยงที่แบบจำลองทำนายไม่ให้เกิน 1 ผู้ป่วย 1,293 รายจาก 20,000 รายมีค่าเกิน 1 โดยค่าสูงสุดคือ 1.548 ในแบบจำลอง log link ผลของตัวแปรร่วมคูณกัน และในผู้ป่วยที่เสี่ยงสูงที่สุดผลเหล่านั้นทบกันจนเกิน 1 แบบจำลองค่าเฉลี่ยจึงไม่เข้ากับผู้ป่วยกลุ่มนั้น

Stata: ขั้นที่ 2 Poisson ดัดแปลง

โค้ด Stata w1_sim.do (บรรทัด 488-489 จาก 719)
* rung 2: modified Poisson with robust SE
glm delirium surg24 age_c female frail dementia asa3 anticoag, family(poisson) link(log) vce(robust) eform
ผลลัพธ์จากการรัน w1_sim.log
. * rung 2: modified Poisson with robust SE
. glm delirium surg24 age_c female frail dementia asa3 anticoag, family(poisson) link(log) vce(robust) eform

Iteration 0:  Log pseudolikelihood = -11055.842
Iteration 1:  Log pseudolikelihood =  -10866.03
Iteration 2:  Log pseudolikelihood = -10865.799
Iteration 3:  Log pseudolikelihood = -10865.799

Generalized linear models                         Number of obs   =     20,000
Optimization     : ML                             Residual df     =     19,992
                                                  Scale parameter =          1
Deviance         =  9325.598464                   (1/df) Deviance =   .4664665
Pearson          =  12149.10313                   (1/df) Pearson  =   .6076982

Variance function: V(u) = u                       [Poisson]
Link function    : g(u) = ln(u)                   [Log]

                                                  AIC             =    1.08738
Log pseudolikelihood = -10865.79923               BIC             =  -188664.9

------------------------------------------------------------------------------
             |               Robust
    delirium |        IRR   std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
      surg24 |    .832129   .0223702    -6.84   0.000     .7894193    .8771494
       age_c |   1.023915   .0008988    26.92   0.000     1.022155    1.025678
      female |   .9842365    .017685    -0.88   0.377     .9501778    1.019516
       frail |   2.775575   .0761548    37.21   0.000     2.630256    2.928922
    dementia |   2.332439   .0471173    41.92   0.000     2.241896     2.42664
        asa3 |   1.269534   .0269659    11.24   0.000     1.217767    1.323502
    anticoag |   1.067201   .0220666     3.15   0.002     1.024816    1.111339
       _cons |   .1001129   .0033522   -68.73   0.000     .0937537    .1069034
------------------------------------------------------------------------------
Note: _cons estimates baseline incidence rate.
ข้อมูลจำลอง ผลลัพธ์จากโค้ดที่แสดง สำหรับผลลัพธ์แบบสองค่า คอลัมน์ IRR (incidence-rate ratio) คือ risk ratio

ขั้นที่ 3: Gaussian family, log link และค่าคลาดเคลื่อนมาตรฐานแบบ robust

ขั้นที่สามคง log link ไว้และใช้ Gaussian family เป็นแบบจำลองทำงาน (working model) ซึ่งเป็นกลไกสำหรับประมาณสัมประสิทธิ์ ไม่ได้อ้างว่าภาวะสับสนเฉียบพลันมีการแจกแจงปกติ glm y x, family(gaussian) link(log) vce(robust) eform ให้ risk ratio ส่วน identity link ให้ผลต่างความเสี่ยง (risk difference) ในที่นี้ y คือผลลัพธ์ x คือตัวแปรสัมผัสและตัวแปรร่วม และ eform สั่งให้พิมพ์สัมประสิทธิ์ที่ยกกำลังเป็น exponential แล้ว เมื่อใช้ identity link ขั้นนี้คือ linear regression ที่มี SE แบบ robust [5]

SE แบบ robust เป็นส่วนหนึ่งของขั้นนี้ เพราะ Gaussian family สมมติความแปรปรวนค่าเดียวสำหรับผู้ป่วยทุกราย การปรับเลือกสัมประสิทธิ์ให้แก้สมการ $\sum x\mu(y - \mu) = 0$ ขณะที่ Poisson แก้ $\sum x(y - \mu) = 0$ มันจึงถ่วงน้ำหนักผู้ป่วยแต่ละรายด้วยความเสี่ยงที่แบบจำลองทำนาย $\mu$ ทำให้ผู้ป่วยเสี่ยงสูงมีน้ำหนักมากกว่าในขั้นที่ 2 เมื่อแบบจำลองค่าเฉลี่ยผิด ขั้นที่ 2 และ 3 จึงลงตัวที่ risk ratio ต่างกันได้ เช่นเดียวกับการปรับแบบ log-binomial และ Poisson [6]

ขั้นนี้ใช้แบบจำลองค่าเฉลี่ยที่มีเฉพาะพจน์หลักและไม่มีเพดานที่ 1 เหมือนขั้นที่ 2 มันอาจช่วยเมื่อขั้นที่ 2 ไม่ลู่เข้า แต่ไม่ได้ออกแบบมาเพื่อกำจัดความเสี่ยงที่แบบจำลองทำนายเกิน 1 ในทะเบียนนี้ เมื่อเริ่มจากสัมประสิทธิ์ของขั้นที่ 2 มันให้ risk ratio เท่ากับ 0.89 CI 95% ของมันคือ 0.85 ถึง 0.93 ใน Stata และ 0.86 ถึง 0.93 ใน R เพราะสูตร SE แบบ robust ของสองโปรแกรมต่างกันเล็กน้อยสำหรับ link นี้

โค้ด Stata w1_sim.do (บรรทัด 497-498 จาก 719)
* rung 3: Gaussian family with a LOG link and robust SE (starts from the Poisson fit)
glm delirium surg24 age_c female frail dementia asa3 anticoag, family(gaussian) link(log) vce(robust) from(bp) eform
ผลลัพธ์จากการรัน w1_sim.log
. * rung 3: Gaussian family with a LOG link and robust SE (starts from the Poisson fit)
. glm delirium surg24 age_c female frail dementia asa3 anticoag, family(gaussian) link(log) vce(robust) from(bp) eform

Iteration 0:  Log pseudolikelihood = -19684.562
Iteration 1:  Log pseudolikelihood = -7773.1115
Iteration 2:  Log pseudolikelihood = -7753.5018
Iteration 3:  Log pseudolikelihood = -7753.4369
Iteration 4:  Log pseudolikelihood = -7753.4369

Generalized linear models                         Number of obs   =     20,000
Optimization     : ML                             Residual df     =     19,992
                                                  Scale parameter =   .1271824
Deviance         =  2542.629794                   (1/df) Deviance =   .1271824
Pearson          =  2542.629794                   (1/df) Pearson  =   .1271824

Variance function: V(u) = 1                       [Gaussian]
Link function    : g(u) = ln(u)                   [Log]

                                                  AIC             =   .7761437
Log pseudolikelihood = -7753.436901               BIC             =  -195447.9

------------------------------------------------------------------------------
             |               Robust
    delirium |     exp(b)   std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
      surg24 |   .8913089   .0203755    -5.03   0.000     .8522551    .9321524
       age_c |   1.013985   .0006799    20.71   0.000     1.012653    1.015318
      female |     1.0022   .0120476     0.18   0.855     .9788635    1.026094
       frail |   2.618539   .0756834    33.31   0.000     2.474326    2.771158
    dementia |   2.263904   .0462291    40.01   0.000     2.175086    2.356349
        asa3 |   1.149668   .0174575     9.19   0.000     1.115956    1.184399
    anticoag |   1.033262   .0137899     2.45   0.014     1.006585    1.060647
       _cons |   .1230081   .0037304   -69.10   0.000     .1159098    .1305412
------------------------------------------------------------------------------
ข้อมูลจำลอง ผลลัพธ์จากโค้ดที่แสดง from(bp) เริ่มจากสัมประสิทธิ์ของขั้นที่ 2 ส่วน V(u) = 1 คือความแปรปรวนของแบบจำลองทำงานแบบ Gaussian

ขั้นที่ 4: logistic regression แล้วปรับมาตรฐาน

ขั้นสุดท้ายใช้ logit link (log ของ odds) ทำให้ความเสี่ยงที่แบบจำลองทำนายทุกค่าอยู่ระหว่าง 0 ถึง 1 ค่า exponential ของสัมประสิทธิ์คือ odds ratio ซึ่งเป็นมาตรวัดที่ใช้ได้ แต่ไม่ใช่ risk ratio ในทะเบียนนี้มีค่า 0.70 (CI 95% 0.64 ถึง 0.76) ห่างจาก 1 มากกว่า risk ratio ทุกค่าข้างต้น

การปรับมาตรฐานระดับประชากร (marginal standardisation) เปลี่ยนแบบจำลองเดียวกันให้เป็น risk ratio และผลต่างความเสี่ยง [7, 8] ทำนายความเสี่ยงของผู้ป่วยทุกรายสองครั้ง โดยกำหนด surg24 เป็น 1 แล้วเป็น 0 และคงตัวแปรร่วมเดิมของผู้ป่วยแต่ละราย เฉลี่ยแต่ละชุดทั่วทะเบียน แล้วหาอัตราส่วนและผลต่าง ใน Stata คำสั่ง margins และ nlcom ทำเช่นนี้ได้ โดยให้ CI แบบ delta method (วิธีประมาณมาตรฐานสำหรับฟังก์ชันของค่าประมาณ)

risk ratio ที่ปรับมาตรฐานแล้วเท่ากับ 0.86 (CI 95% 0.83 ถึง 0.89) และผลต่างความเสี่ยงเท่ากับ -0.0454 ทั้งสองค่าเป็นค่าระดับประชากร (marginal) คือเปรียบเทียบความเสี่ยงเฉลี่ยของทะเบียนเมื่อทุกคนได้ผ่าตัดเร็วกับเมื่อทุกคนได้ผ่าตัดช้ากว่า โดยสมมติว่าแบบจำลองและชุดตัวแปรปรับเพียงพอ ขั้นที่ 1 ถึง 3 ให้ risk ratio แบบมีเงื่อนไข (conditional) แทน ซึ่งเปรียบเทียบผู้ป่วยที่มีค่าตัวแปรร่วมเท่ากัน อีกแบบหนึ่งคือ odds ratio 0.70 ซึ่งเป็นแบบมีเงื่อนไขเช่นกัน และต้องระบุเช่นนั้น

Stata: ขั้นที่ 4 แบบจำลอง logistic

โค้ด Stata w1_sim.do (บรรทัด 503-504 จาก 719)
* rung 4: logistic model, then marginal standardisation for the risk ratio and risk difference
logit delirium i.surg24 age_c female frail dementia asa3 anticoag
ผลลัพธ์จากการรัน w1_sim.log
. * rung 4: logistic model, then marginal standardisation for the risk ratio and risk difference
. logit delirium i.surg24 age_c female frail dementia asa3 anticoag

Iteration 0:  Log likelihood = -12384.413
Iteration 1:  Log likelihood = -8110.2012
Iteration 2:  Log likelihood = -7862.3384
Iteration 3:  Log likelihood = -7859.1356
Iteration 4:  Log likelihood =  -7859.132
Iteration 5:  Log likelihood =  -7859.132

Logistic regression                                    Number of obs =  20,000
                                                       LR chi2(7)    = 9050.56
                                                       Prob > chi2   =  0.0000
Log likelihood = -7859.132                             Pseudo R2     =  0.3654

------------------------------------------------------------------------------
    delirium | Coefficient  Std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
    1.surg24 |  -.3588307   .0437061    -8.21   0.000    -.4444931   -.2731684
       age_c |   .0536275   .0020106    26.67   0.000     .0496868    .0575682
      female |  -.0455033   .0437455    -1.04   0.298    -.1312429    .0402362
       frail |    1.85723   .0425718    43.63   0.000      1.77379    1.940669
    dementia |   2.056683   .0450837    45.62   0.000      1.96832    2.145045
        asa3 |   .4778636   .0438002    10.91   0.000     .3920168    .5637103
    anticoag |   .1739927   .0528003     3.30   0.001      .070506    .2774794
       _cons |  -2.654324   .0611431   -43.41   0.000    -2.774162   -2.534485
------------------------------------------------------------------------------
ข้อมูลจำลอง เมื่อยกกำลังเป็น exponential สัมประสิทธิ์ 1.surg24 คือ odds ratio เท่ากับ 0.70

Stata: ขั้นที่ 4 การปรับมาตรฐาน

โค้ด Stata w1_sim.do (บรรทัด 506-507 จาก 719)
margins surg24, post
nlcom (rd: _b[1.surg24] - _b[0.surg24]) (lnrr: ln(_b[1.surg24]/_b[0.surg24])) (lnor: ln((_b[1.surg24]/(1 - _b[1.surg24]))/(_b[0.surg24]/(1 - _b[0.surg24])))), post
ผลลัพธ์จากการรัน w1_sim.log
. margins surg24, post

Predictive margins                                      Number of obs = 20,000
Model VCE: OIM

Expression: Pr(delirium), predict()

------------------------------------------------------------------------------
             |            Delta-method
             |     Margin   std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
      surg24 |
          0  |   .3274425   .0033774    96.95   0.000      .320823     .334062
          1  |   .2820044   .0042555    66.27   0.000     .2736638    .2903449
------------------------------------------------------------------------------

. nlcom (rd: _b[1.surg24] - _b[0.surg24]) (lnrr: ln(_b[1.surg24]/_b[0.surg24])) (lnor: ln((_b[1.surg24]/(1 - _b[1.surg24
> ]))/(_b[0.surg24]/(1 - _b[0.surg24])))), post

          rd: _b[1.surg24] - _b[0.surg24]
        lnrr: ln(_b[1.surg24]/_b[0.surg24])
        lnor: ln((_b[1.surg24]/(1 - _b[1.surg24]))/(_b[0.surg24]/(1 - _b[0.surg24])))

------------------------------------------------------------------------------
             | Coefficient  Std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
          rd |  -.0454381   .0056018    -8.11   0.000    -.0564174   -.0344587
        lnrr |  -.1493897   .0188227    -7.94   0.000    -.1862814   -.1124979
        lnor |  -.2147655   .0268091    -8.01   0.000    -.2673104   -.1622206
------------------------------------------------------------------------------
ข้อมูลจำลอง ผลลัพธ์จากโค้ดที่แสดง คือความเสี่ยงเฉลี่ยเมื่อกำหนดการผ่าตัดเป็นช้ากว่า (0) และเร็ว (1) แล้วตามด้วยผลต่างความเสี่ยง (rd) และ log ของ risk ratio (lnrr) แถว lnor ซึ่งเป็น log ของ odds ratio ระดับประชากร จะกล่าวถึงในตอนที่ 5

R: ฟังก์ชันช่วยที่เพิ่ม SE แบบ robust

โค้ด R w1_sim_r.R (บรรทัด 194-200 จาก 587)
rr_glm <- function(f, fam, data, robust = FALSE, start = NULL) {
  fit <- glm(f, family = fam, data = data, start = start)
  V <- if (robust) vcovHC(fit, type = "HC0") else vcov(fit)
  b <- coef(fit)[["surg24"]]; se <- sqrt(V["surg24", "surg24"])
  list(fit = fit, est = exp(b), lo = exp(b - z * se), hi = exp(b + z * se), se = se,
       se_naive = sqrt(vcov(fit)["surg24", "surg24"]))
}
ผลลัพธ์จากการรัน w1_sim_r.log
> rr_glm <- function(f, fam, data, robust = FALSE, start = NULL) {
+     fit <- glm(f, family = fam, data = data, start = start)
+     V <- if (robust)
+         vcovHC(fit, type = "HC0")
+     else vcov(fit)
+     b <- coef(fit)[["surg24"]]
+     se <- sqrt(V["surg24", "surg24"])
+     list(fit = fit, est = exp(b), lo = exp(b - z * se), hi = exp(b +
+         z * se), se = se, se_naive = sqrt(vcov(fit)["surg24",
+         "surg24"]))
+ }
rr_glm() ดึง SE แบบ robust จาก vcovHC(fit, type = "HC0") ในแพ็กเกจ sandwich โดย HC0 คือรูปแบบแซนด์วิชพื้นฐาน ส่วน z คือควอนไทล์ปกติสำหรับช่วงเชื่อมั่น 95%

R: บันไดสี่ขั้น

โค้ด R w1_sim_r.R (บรรทัด 239-259 จาก 587)
f_out <- delirium ~ surg24 + age_c + female + frail + dementia + asa3 + anticoag
# rung 1: log-binomial; it stops when a covariate pattern would need a risk above 1
lb <- tryCatch(glm(f_out, family = binomial(link = "log"), data = d),
               error = function(e) { cat("NOTE log-binomial stopped:", conditionMessage(e), "\n"); NULL })
canon_n("c3.logbin_converged", !is.null(lb) && isTRUE(lb$converged))
# rung 2: modified Poisson with robust SE
mp <- rr_glm(f_out, poisson(link = "log"), d, TRUE)
canon_ci("c3.rr_poisson", mp$est, mp$lo, mp$hi)
canon("c3.poisson_max_fitted", max(fitted(mp$fit)))
canon_n("c3.poisson_n_fitted_above1", sum(fitted(mp$fit) > 1))
# rung 3: Gaussian family with a LOG link and robust SE (starts from the Poisson fit)
gl <- rr_glm(f_out, gaussian(link = "log"), d, TRUE, start = coef(mp$fit))
# R's sandwich uses the expected-information bread, so this robust CI differs from Stata's ML glm
canon("c3.rr_gaussian", gl$est); canon("c3.rr_gaussian.lo.r", gl$lo); canon("c3.rr_gaussian.hi.r", gl$hi)
# rung 4: logistic model, then marginal standardisation for the risk ratio and risk difference
lg <- glm(f_out, family = binomial, data = d)
b <- coef(lg)[["surg24"]]; se <- sqrt(vcov(lg)["surg24", "surg24"])
canon_ci("c5.or_cond", exp(b), exp(b - z * se), exp(b + z * se))
std <- function(cmp) avg_comparisons(lg, variables = list(surg24 = c(0, 1)), comparison = cmp)
rr <- std("lnratioavg"); canon_ci("c3.rr_std", exp(rr$estimate), exp(rr$conf.low), exp(rr$conf.high))
rd <- std("differenceavg"); canon_ci("c3.rd_std", rd$estimate, rd$conf.low, rd$conf.high)
ผลลัพธ์จากการรัน w1_sim_r.log
> f_out <- delirium ~ surg24 + age_c + female + frail +
+     dementia + asa3 + anticoag

> lb <- tryCatch(glm(f_out, family = binomial(link = "log"),
+     data = d), error = function(e) {
+     cat("NOTE log-binomial stopped:", conditionMessage(e), "\n")
+     NULL
+ })
NOTE log-binomial stopped: no valid set of coefficients has been found: please supply starting values

> canon_n("c3.logbin_converged", !is.null(lb) && isTRUE(lb$converged))
CANON w1.c3.logbin_converged 0

> mp <- rr_glm(f_out, poisson(link = "log"), d, TRUE)

> canon_ci("c3.rr_poisson", mp$est, mp$lo, mp$hi)
CANON w1.c3.rr_poisson 0.8321
CANON w1.c3.rr_poisson.lo 0.7894
CANON w1.c3.rr_poisson.hi 0.8771

> canon("c3.poisson_max_fitted", max(fitted(mp$fit)))
CANON w1.c3.poisson_max_fitted 1.5484

> canon_n("c3.poisson_n_fitted_above1", sum(fitted(mp$fit) >
+     1))
CANON w1.c3.poisson_n_fitted_above1 1293

> gl <- rr_glm(f_out, gaussian(link = "log"), d, TRUE,
+     start = coef(mp$fit))

> canon("c3.rr_gaussian", gl$est)
CANON w1.c3.rr_gaussian 0.8913

> canon("c3.rr_gaussian.lo.r", gl$lo)
CANON w1.c3.rr_gaussian.lo.r 0.8551

> canon("c3.rr_gaussian.hi.r", gl$hi)
CANON w1.c3.rr_gaussian.hi.r 0.9291

> lg <- glm(f_out, family = binomial, data = d)

> b <- coef(lg)[["surg24"]]

> se <- sqrt(vcov(lg)["surg24", "surg24"])

> canon_ci("c5.or_cond", exp(b), exp(b - z * se), exp(b +
+     z * se))
CANON w1.c5.or_cond 0.6985
CANON w1.c5.or_cond.lo 0.6411
CANON w1.c5.or_cond.hi 0.7610

> std <- function(cmp) avg_comparisons(lg, variables = list(surg24 = c(0,
+     1)), comparison = cmp)

> rr <- std("lnratioavg")

> canon_ci("c3.rr_std", exp(rr$estimate), exp(rr$conf.low),
+     exp(rr$conf.high))
CANON w1.c3.rr_std 0.8612
CANON w1.c3.rr_std.lo 0.8300
CANON w1.c3.rr_std.hi 0.8936

> rd <- std("differenceavg")

> canon_ci("c3.rd_std", rd$estimate, rd$conf.low, rd$conf.high)
CANON w1.c3.rd_std -0.0454
CANON w1.c3.rd_std.lo -0.0564
CANON w1.c3.rd_std.hi -0.0345
ข้อมูลจำลอง ส่วนหนึ่งของสคริปต์จำลองของชุดบทความนี้และผลลัพธ์จากโค้ดที่แสดง d คือทะเบียนจำลอง (ไม่เผยแพร่) และ avg_comparisons() มาจากแพ็กเกจ marginaleffects บรรทัดที่ขึ้นต้นด้วย CANON คือตัวช่วยบันทึกค่าของผู้เขียนที่พิมพ์ค่าประมาณและช่วงเชื่อมั่น 95% (ป้ายที่ลงท้ายด้วย .lo และ .hi) คำนำหน้าเป็นป้ายภายใน และส่วนนี้ R ไม่ได้พิมพ์ตารางผลโมเดล จึงให้อ่านค่าท้ายบรรทัดแต่ละบรรทัด ช่วงเชื่อมั่นของขั้นที่ 3 ต่างจาก Stata เล็กน้อย (ดูขั้นที่ 3)

เมื่อใดควรถอยลงขั้น

ถอยลงขั้นเมื่อมีความล้มเหลวที่ระบุได้ ไม่ใช่เพราะอยากได้ตัวเลขที่ชอบ สัญญาณมีสามอย่าง คือไม่ลู่เข้า การปรับติดอยู่ที่ขอบพร้อม SE ที่หายไปหรือใกล้ศูนย์ และความเสี่ยงที่แบบจำลองทำนายเกิน 1 ทุกขั้นคงผลลัพธ์ ตัวแปรสัมผัส และตัวแปรร่วมชุดเดิม

ในทะเบียนนี้ ขั้นที่ 1 ไม่ลู่เข้า และขั้นที่ 2 มีความเสี่ยงที่ทำนายเกิน 1 อยู่ 1,293 ค่า ขั้นที่ 3 ลู่เข้า แต่การรันนี้ไม่ได้นับความเสี่ยงที่ทำนายเกิน 1 ของขั้นนั้น ตัวอย่างจึงแสดงไม่ได้ว่าควรหยุดที่ขั้นนั้นหรือไม่ ในการใช้งานจริงตัวเลขนั้นเป็นตัวตัดสิน ขั้นที่ 4 ทำนายความเสี่ยงนอกช่วง 0 ถึง 1 ไม่ได้ และมีเพียงค่าประมาณที่ปรับมาตรฐานแล้วที่มีค่าจริงในข้อมูลจำลอง ตัวอย่างจึงไปต่อที่ขั้นนั้น

ถอยลงขั้นเมื่อการตรวจไม่ผ่านเท่านั้น และรายงาน estimand ของขั้นที่หยุด

แต่ละขั้นประมาณปริมาณอะไร

ขั้นที่ 1 ถึง 3 มุ่งไปที่ risk ratio แบบมีเงื่อนไข ส่วนการปรับมาตรฐานของขั้นที่ 4 มุ่งไปที่มาตรวัดระดับประชากร เมื่อ risk ratio ค่าเดียวใช้ได้ในทุกรูปแบบของตัวแปรร่วม risk ratio ทั้งสองแบบจะเท่ากัน แต่ที่นี่ไม่เป็นเช่นนั้น เพราะการจำลองสร้างให้การผ่าตัดเร็วลด odds ของภาวะสับสนเฉียบพลันเฉพาะในผู้ป่วยที่ไม่เปราะบาง และ odds ratio ค่าเดียวให้ risk ratio ต่างกันที่ความเสี่ยงพื้นฐานแต่ละระดับ (ดูตัวอย่างคำนวณด้วยมือด้านล่าง) risk ratio แบบมีเงื่อนไขจึงต่างกันไปตามรูปแบบของตัวแปรร่วม แบบจำลองที่มีเฉพาะพจน์หลักบีบผลที่ต่างกันเหล่านี้ให้เป็นตัวเลขเดียว

ขั้นที่ 2 และ 3 ถ่วงน้ำหนักผู้ป่วยต่างกัน จึงบีบผลเหล่านั้นต่างกัน ได้ 0.83 และ 0.89 มีเพียงค่าประมาณที่ปรับมาตรฐานแล้วเท่านั้นที่มีค่าจริงในข้อมูลจำลองให้เทียบ ค่าจริงนี้คือค่าเฉลี่ยของความเสี่ยงจริงของผู้ป่วยจำลองทุกรายเมื่อกำหนด surg24 เป็น 1 หารด้วยค่าเฉลี่ยเดียวกันเมื่อกำหนด surg24 เป็น 0 (และนำมาลบกันสำหรับผลต่าง) ค่านี้คำนวณในประชากรจำลองขนาดใหญ่ที่สร้างด้วยวิธีเดียวกับทะเบียน ได้ risk ratio เท่ากับ 0.88 และผลต่างความเสี่ยงเท่ากับ -0.0381 ค่าที่ปรับมาตรฐานแล้วคือ 0.86 และ -0.0454 ใกล้เคียงกัน และ CI 95% ของทั้งสองค่าครอบคลุมค่าจริง

แบบจำลอง logistic ของขั้นที่ 4 มีพจน์หลักชุดเดียวกัน จึงตัดผลของการผ่าตัดเร็วที่ขึ้นกับภาวะเปราะบาง และปฏิกิริยาสัมพันธ์ระหว่างภาวะเปราะบางกับภาวะสมองเสื่อมที่การจำลองสร้างไว้ออกด้วย การปรับมาตรฐานกำหนด estimand ไม่ได้แก้แบบจำลองค่าเฉลี่ย และส่วนต่างที่เหลืออาจมาจากเรื่องนี้บางส่วน

ค่าประมาณจากทะเบียน แยกตามขั้น

ข้อมูลจำลอง ผู้ป่วยในทะเบียน 20,000 ราย แถวแบบมีเงื่อนไขไม่มีค่าจริงค่าเดียว เพราะผลต่างกันตามภาวะเปราะบาง และบนมาตรา risk ratio ต่างกันตามความเสี่ยงพื้นฐานของผู้ป่วยแต่ละราย
ขั้นEstimandค่าประมาณ (CI 95%)ค่าจริงในข้อมูลจำลอง
ขั้นที่ 1 Log-binomialRisk ratio แบบมีเงื่อนไขไม่ลู่เข้าไม่มีค่าเดียว
ขั้นที่ 2 Poisson ดัดแปลงRisk ratio แบบมีเงื่อนไข0.83 (0.79 ถึง 0.88)ไม่มีค่าเดียว
ขั้นที่ 3 Gaussian, log linkRisk ratio แบบมีเงื่อนไข0.89 (Stata 0.85 ถึง 0.93; R 0.86 ถึง 0.93) ไม่ได้นับความเสี่ยงที่ทำนายเกิน 1ไม่มีค่าเดียว
ขั้นที่ 4 Logistic regressionOdds ratio แบบมีเงื่อนไข0.70 (0.64 ถึง 0.76)ไม่มีค่าเดียว
ขั้นที่ 4 ปรับมาตรฐานRisk ratio ระดับประชากร0.86 (0.83 ถึง 0.89)0.88
ขั้นที่ 4 ปรับมาตรฐานผลต่างความเสี่ยงระดับประชากร-0.0454 (-0.0564 ถึง -0.0345)-0.0381

ตัวอย่างคำนวณด้วยมือ: ทำไม odds ratio จึงเบี่ยงจาก risk ratio

ตัวอย่างคำนวณด้วยมือ ตัวแปรสัมผัสตัวหนึ่งมี odds ratio เท่ากับ 2.00 ในสองประชากรที่มีความเสี่ยงพื้นฐาน (baseline risk คือความเสี่ยงเมื่อไม่ได้สัมผัส) เท่ากับ 0.05 และ 0.30

  1. ผลลัพธ์ที่พบน้อย: odds

    \[ \frac{0.05}{1 - 0.05} = 0.053, \quad 2.00 \times \frac{0.05}{1 - 0.05} = 0.105 \]

    odds พื้นฐานก่อน แล้วจึงถึง odds ของกลุ่มที่สัมผัส

  2. ผลลัพธ์ที่พบน้อย: ความเสี่ยงและ risk ratio

    \[ \frac{0.105}{1 + 0.105} = 0.095, \quad \mathrm{RR} = \frac{0.095}{0.05} = 1.90 \]

    ความเสี่ยงคือ odds หารด้วย 1 บวก odds risk ratio (RR) เท่ากับ 1.90 ห่างจาก odds ratio 0.10

  3. ผลลัพธ์ที่พบบ่อย: odds

    \[ \frac{0.30}{1 - 0.30} = 0.429, \quad 2.00 \times \frac{0.30}{1 - 0.30} = 0.857 \]

    odds ratio ค่าเดิมที่ความเสี่ยงพื้นฐาน 0.30

  4. ผลลัพธ์ที่พบบ่อย: ความเสี่ยงและ risk ratio

    \[ \frac{0.857}{1 + 0.857} = 0.462, \quad \mathrm{RR} = \frac{0.462}{0.30} = 1.54 \]

    ตอนนี้ risk ratio เท่ากับ 1.54 ห่างออกไป 0.46

ผลลัพธ์: ที่ odds ratio ค่าเดียวคือ 2.00 risk ratio ลดจาก 1.90 เหลือ 1.54 เมื่อความเสี่ยงพื้นฐานสูงขึ้นจาก 0.05 เป็น 0.30 ส่วนต่างขยายตามความเสี่ยงพื้นฐาน ดังนั้นเมื่อผลลัพธ์พบบ่อย จึงอ่าน odds ratio เป็น risk ratio ไม่ได้

ตัวอย่างคำนวณด้วยมือ ลากความเสี่ยงพื้นฐานจาก 0.01 ถึง 0.80 โดยกำหนด odds ratio คงที่ (ค่าเริ่มต้น 2.00 ปรับได้) แล้วดูส่วนต่างระหว่าง risk ratio กับ odds ratio

ความเข้าใจผิดที่พบบ่อยและวิธีแก้

  • อ่าน odds ratio เป็น risk ratio เมื่อผลลัพธ์พบบ่อย

    ในทะเบียนนี้ odds ratio แบบมีเงื่อนไขคือ 0.70 เทียบกับ risk ratio แบบมีเงื่อนไข 0.83 และ 0.89 ที่ขั้นที่ 2 และ 3

    วิธีแก้: ระบุให้ชัดว่าเป็น odds ratio หรือปรับมาตรฐานเป็น risk ratio และผลต่างความเสี่ยง

  • "odds ratio ผิด"

    odds ratio เป็นมาตรวัดที่ใช้ได้

    วิธีแก้: odds ratio เป็นมาตรวัดที่ถูกต้อง มันผิดเฉพาะเมื่อถูกอ่านเป็น risk ratio ในผลลัพธ์ที่พบบ่อย

  • "Poisson ดัดแปลงดีที่สุดเสมอ"

    มันสมมติ risk ratio ค่าเดียวสำหรับทุกรูปแบบของตัวแปรร่วม

    วิธีแก้: Poisson ดัดแปลงเป็นขั้นที่สองที่พึ่งพาได้ ไม่ใช่คำตอบสำหรับทุกกรณี มันทำนายความเสี่ยงเกิน 1 ได้ และ estimand ของมันเป็นแบบมีเงื่อนไข

  • มองข้ามความเสี่ยงที่แบบจำลองทำนายเกิน 1

    ในทะเบียนนี้มี 1,293 ค่าที่เกิน 1 โดยค่าสูงสุดคือ 1.548

    วิธีแก้: รายงานความเสี่ยงที่ทำนายสูงสุดและจำนวนที่เกิน 1 แล้วถอยลงขั้น การหาสิ่งที่แบบจำลองค่าเฉลี่ยพลาดไป เช่นปฏิกิริยาสัมพันธ์ ให้ทำเป็นการวิเคราะห์ความไวที่กำหนดไว้ล่วงหน้าเท่านั้น เมื่อมีปฏิกิริยาสัมพันธ์กับตัวแปรสัมผัสจะไม่มี risk ratio แบบมีเงื่อนไขค่าเดียว จึงควรปรับมาตรฐาน

  • รันขั้น Gaussian โดยไม่ใช้ SE แบบ robust

    SE ที่คำนวณจากแบบจำลองสมมติความแปรปรวนค่าเดียวสำหรับผู้ป่วยทุกราย

    วิธีแก้: เพิ่ม vce(robust) ใน Stata หรือความแปรปรวนแบบแซนด์วิช เช่น vcovHC() ใน R

  • เปลี่ยนตัวแปรร่วมจนกว่าแบบจำลอง log-binomial จะลู่เข้า

    ภาวะเปราะบางเป็นตัวกวน (confounder) ในที่นี้ การตัดออกอาจทำให้การปรับลู่เข้าได้ แต่ทิ้งการกวนของมันไว้โดยไม่ปรับ และเปลี่ยน risk ratio แบบมีเงื่อนไขที่กำลังประมาณ

    วิธีแก้: คงตัวแปรร่วมที่กำหนดไว้ล่วงหน้า แล้วถอยลงตามบันไดแทน

  • เปลี่ยน estimand ระหว่างขั้นโดยไม่บอก

    ขั้นที่ 1 ถึง 3 เป็นแบบมีเงื่อนไข ส่วนขั้นที่ 4 ที่ปรับมาตรฐานแล้วเป็นระดับประชากร

    วิธีแก้: ระบุ estimand ของขั้นที่รายงาน และเหตุผลที่บันไดหยุดที่ขั้นนั้น

สิ่งที่ควรทำในการวิเคราะห์ของคุณเอง

อภิธานศัพท์

log-binomial model (แบบจำลอง log-binomial)
Binomial family ที่ใช้ log link ให้ risk ratio ได้ แต่ล้มเหลวได้เมื่อความเสี่ยงที่แบบจำลองทำนายเข้าใกล้ 1
convergence
การลู่เข้า (convergence): จุดที่ค่าประมาณของขั้นตอนคำนวณหยุดเปลี่ยนแปลง
modified Poisson regression (Poisson ดัดแปลง)
Poisson family และ log link สำหรับผลลัพธ์แบบสองค่า พร้อม SE แบบ robust ให้ risk ratio
robust (sandwich) standard error (ค่าคลาดเคลื่อนมาตรฐานแบบแซนด์วิช)
ตัวประมาณความแปรปรวนที่ยังใช้ได้เมื่อแบบจำลองความแปรปรวนผิด ตราบเท่าที่แบบจำลองค่าเฉลี่ยถูกต้อง
marginal standardisation (การปรับมาตรฐานระดับประชากร)
การเฉลี่ยค่าที่แบบจำลองทำนายตลอดตัวแปรร่วมที่สังเกตได้ เพื่อรายงาน risk ratio หรือผลต่างความเสี่ยงระดับประชากร
conditional versus marginal estimand
แบบมีเงื่อนไข (conditional) เปรียบเทียบผู้ป่วยที่มีค่าตัวแปรร่วมเท่ากัน ส่วนระดับประชากร (marginal) เปรียบเทียบความเสี่ยงเฉลี่ยตลอดประชากรทั้งกลุ่ม

เอกสารอ้างอิง

  1. McNutt LA, Wu C, Xue X, Hafner JP. Estimating the relative risk in cohort studies and clinical trials of common outcomes. Am J Epidemiol. 2003;157(10):940-943. doi:10.1093/aje/kwg074 https://doi.org/10.1093/aje/kwg074
  2. Spiegelman D, Hertzmark E. Easy SAS calculations for risk or prevalence ratios and differences. Am J Epidemiol. 2005;162(3):199-200. doi:10.1093/aje/kwi188 https://doi.org/10.1093/aje/kwi188
  3. Williamson T, Eliasziw M, Fick GH. Log-binomial models: exploring failed convergence. Emerg Themes Epidemiol. 2013;10:14. doi:10.1186/1742-7622-10-14 https://doi.org/10.1186/1742-7622-10-14
  4. Zou G. A modified Poisson regression approach to prospective studies with binary data. Am J Epidemiol. 2004;159(7):702-706. doi:10.1093/aje/kwh090 https://doi.org/10.1093/aje/kwh090
  5. Cheung YB. A modified least-squares regression approach to the estimation of risk difference. Am J Epidemiol. 2007;166(11):1337-1344. doi:10.1093/aje/kwm223 https://doi.org/10.1093/aje/kwm223
  6. Chen W, Qian L, Shi J, Franklin M. Comparing performance between log-binomial and robust Poisson regression models for estimating risk ratios under model misspecification. BMC Med Res Methodol. 2018;18:63. doi:10.1186/s12874-018-0519-5 https://doi.org/10.1186/s12874-018-0519-5
  7. Localio AR, Margolis DJ, Berlin JA. Relative risks and confidence intervals were easily computed indirectly from multivariable logistic regression. J Clin Epidemiol. 2007;60(9):874-882. doi:10.1016/j.jclinepi.2006.12.001 https://doi.org/10.1016/j.jclinepi.2006.12.001
  8. Norton EC, Miller MM, Kleinman LC. Computing adjusted risk ratios and risk differences in Stata. Stata J. 2013;13(3):492-509. doi:10.1177/1536867X1301300304 https://doi.org/10.1177/1536867X1301300304

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

  • เมื่อผลลัพธ์พบบ่อย odds ratio เป็นตัวแทนของ risk ratio ได้ไม่ดี และส่วนต่างขยายตามความเสี่ยงพื้นฐาน
  • บันไดเรียงจาก log-binomial, Poisson ดัดแปลงที่ใช้ SE แบบ robust, แบบจำลอง Gaussian ที่ใช้ log link และ SE แบบ robust แล้วจบที่ logistic regression พร้อมการปรับมาตรฐาน หรือ odds ratio ที่ระบุให้ชัด
  • ถอยลงขั้นเฉพาะเมื่อมีความล้มเหลวที่ระบุได้ คือไม่ลู่เข้า การปรับติดอยู่ที่ขอบ หรือความเสี่ยงที่แบบจำลองทำนายเกิน 1
  • ขั้นที่ 1 ถึง 3 ประมาณ risk ratio แบบมีเงื่อนไข ส่วนการปรับมาตรฐานที่ขั้นที่ 4 ประมาณแบบระดับประชากร จึงต้องระบุ estimand ที่รายงาน

อ่านต่อในวิกิ: [[glm-link-family-guide-th]] [[heteroskedasticity-robust-standard-errors-th]]

0
ถึงนักอ่านชาวไทยและต่างชาติทำความเข้าใจบริบททางการแพทย์ของผมอ่านต่อ →ถึงนักอ่านชาวไทยและต่างชาติทำความเข้าใจเนื้อหาของผมที่นอกเหนือจากการแพทย์อ่านต่อ →

ความคิดเห็น

ยังไม่มีความคิดเห็น มาเป็นคนแรกกันเลย

เข้าสู่ระบบเพื่อแสดงความคิดเห็น