หา 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 หยุดโดยไม่ลู่เข้า
* 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)
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 ดัดแปลง
* rung 2: modified Poisson with robust SE
glm delirium surg24 age_c female frail dementia asa3 anticoag, family(poisson) link(log) vce(robust) eform
. * 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.
ขั้นที่ 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: ขั้นที่ 3 Gaussian family ที่ใช้ log link
* 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
. * 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
* 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
. * 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
------------------------------------------------------------------------------
1.surg24 คือ odds ratio เท่ากับ 0.70Stata: ขั้นที่ 4 การปรับมาตรฐาน
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
. 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
------------------------------------------------------------------------------
R: ฟังก์ชันช่วยที่เพิ่ม SE แบบ robust
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 <- 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: บันไดสี่ขั้น
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)
> 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 ไม่ได้ และมีเพียงค่าประมาณที่ปรับมาตรฐานแล้วที่มีค่าจริงในข้อมูลจำลอง ตัวอย่างจึงไปต่อที่ขั้นนั้น
แต่ละขั้นประมาณปริมาณอะไร
ขั้นที่ 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 ไม่ได้แก้แบบจำลองค่าเฉลี่ย และส่วนต่างที่เหลืออาจมาจากเรื่องนี้บางส่วน
ค่าประมาณจากทะเบียน แยกตามขั้น
| ขั้น | Estimand | ค่าประมาณ (CI 95%) | ค่าจริงในข้อมูลจำลอง |
|---|---|---|---|
| ขั้นที่ 1 Log-binomial | Risk ratio แบบมีเงื่อนไข | ไม่ลู่เข้า | ไม่มีค่าเดียว |
| ขั้นที่ 2 Poisson ดัดแปลง | Risk ratio แบบมีเงื่อนไข | 0.83 (0.79 ถึง 0.88) | ไม่มีค่าเดียว |
| ขั้นที่ 3 Gaussian, log link | Risk ratio แบบมีเงื่อนไข | 0.89 (Stata 0.85 ถึง 0.93; R 0.86 ถึง 0.93) ไม่ได้นับความเสี่ยงที่ทำนายเกิน 1 | ไม่มีค่าเดียว |
| ขั้นที่ 4 Logistic regression | Odds 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
-
ผลลัพธ์ที่พบน้อย: odds
\[ \frac{0.05}{1 - 0.05} = 0.053, \quad 2.00 \times \frac{0.05}{1 - 0.05} = 0.105 \]
odds พื้นฐานก่อน แล้วจึงถึง odds ของกลุ่มที่สัมผัส
-
ผลลัพธ์ที่พบน้อย: ความเสี่ยงและ 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
-
ผลลัพธ์ที่พบบ่อย: 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
-
ผลลัพธ์ที่พบบ่อย: ความเสี่ยงและ 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 ไม่ได้
ความเข้าใจผิดที่พบบ่อยและวิธีแก้
-
อ่าน 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 ของขั้นที่รายงาน และเหตุผลที่บันไดหยุดที่ขั้นนั้น
สิ่งที่ควรทำในการวิเคราะห์ของคุณเอง
- เขียน estimand และบันไดไว้ในแผนการวิเคราะห์ก่อนปรับแบบจำลองใด ๆ
- ก่อนอ่านสัมประสิทธิ์ของแบบจำลอง log-binomial ให้ตรวจธงการลู่เข้าและคอลัมน์ SE ก่อน
- ที่ขั้นที่ 2 และ 3 ใช้ SE แบบ robust และพิจารณารายงานความเสี่ยงที่ทำนายสูงสุดกับจำนวนที่เกิน 1
- คงผลลัพธ์ ตัวแปรสัมผัส และตัวแปรร่วมไว้เหมือนเดิมทุกขั้น และบอกเหตุผลที่บันไดหยุดที่ขั้นนั้น
- ที่ขั้นที่ 4 risk ratio และผลต่างความเสี่ยงที่ปรับมาตรฐานแล้วมักเป็นรายงานที่ชัดที่สุด และต้องระบุ odds ratio ให้ชัด
อภิธานศัพท์
- 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) เปรียบเทียบความเสี่ยงเฉลี่ยตลอดประชากรทั้งกลุ่ม
เอกสารอ้างอิง
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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]]