จากความไวสู่ต้นทุนต่อผู้ป่วยหนึ่งรายที่ตรวจพบ: ค่าทำนายผลบวก ความชุก และเศรษฐศาสตร์ของการคัดกรอง

Health EconomicsClinical Epidemiology ResearchMethodology and Research Design TH
จากความไวสู่ต้นทุนต่อผู้ป่วยหนึ่งรายที่ตรวจพบ: ค่าทำนายผลบวก ความชุก และเศรษฐศาสตร์ของการคัดกรอง
On this page

อ่านฉบับภาษาอังกฤษ (English version)

บทคัดย่อ

คณะกรรมการระดับอำเภอได้รับข้อเสนอให้ใช้เครื่องมือ AI คัดกรองผู้ใหญ่ 10,000 คนหนึ่งรอบ เพื่อหาโรคที่ไม่มีอาการในระยะแรก ในการศึกษาของบริษัทซึ่งมีผู้เข้าร่วม 178 คน เครื่องมือระบุว่าผิดปกติ 22 คนจาก 58 คนที่มีโรค และระบุว่าปกติ 98 คนจาก 120 คนที่ไม่มีโรค ผู้ที่ถูกระบุว่าผิดปกติครึ่งหนึ่งมีโรคจริง แต่ในอำเภอมีผู้ใหญ่เพียง 2 ใน 100 คนที่มีโรค เครื่องมือเดิมจึงระบุว่าผิดปกติ 1,873 คน และมีโรคจริงราว 76 คน ผลบวกจึงหมายถึงการมีโรคเพียง 4.05% ขณะที่ความถูกต้องของเครื่องมือกลับเพิ่มจาก 67.42% เป็น 80.79% การตรวจทุกคนและตรวจยืนยันผลบวกทุกรายใช้เงิน 5,746,000 บาท หรือ 75,605 บาทต่อผู้ป่วยหนึ่งรายที่ตรวจพบ และ 62.55% ของเงินนี้จ่ายให้สัญญาณเตือนลวง การพบผู้ป่วยไม่ใช่การช่วยผู้ป่วย การวินิจฉัยเร็วขึ้น โรคที่ดำเนินช้า และโรคที่ไม่ก่ออันตราย ล้วนทำให้การคัดกรองดูดีเกินจริง และกฎของคณะกรรมการเองในการชั่งน้ำหนักสัญญาณเตือนลวงแสดงว่าเครื่องมือนี้แย่กว่าการไม่คัดกรองเลย


Visual summary · ภาพสรุป

เครื่องมือ AI การศึกษาของบริษัท และผู้ใหญ่ 10,000 คนที่จะคัดกรอง

คณะกรรมการสุขภาพระดับอำเภอต้องตัดสินว่าจะคัดกรองผู้ใหญ่ทั้ง 10,000 คนของอำเภอหนึ่งรอบหรือไม่ เพื่อหาโรคที่ไม่มีอาการในระยะแรก บริษัทแห่งหนึ่งเสนอเครื่องมือ AI ที่อ่านภาพสแกนอย่างเร็วจากโรงพยาบาลส่งเสริมสุขภาพตำบล แล้วระบุว่าใครอาจมีโรค ผู้ที่ถูกระบุว่าผิดปกติแต่ละคนจะต้องไปโรงพยาบาลเพื่อตรวจยืนยัน ซึ่งเป็นการตรวจที่ตัดสินได้ว่ามีโรคจริงหรือไม่

แผ่นพับของบริษัทรายงานการศึกษาหนึ่งชิ้นในโรงพยาบาล มีผู้เข้าร่วม 178 คน เป็นผู้ที่รู้แล้วว่ามีโรค 58 คน และรู้แล้วว่าไม่มีโรค 120 คน เครื่องมือระบุว่าผิดปกติ 22 คนจาก 58 คน และพลาดอีก 36 คน ระบุว่าปกติ 98 คนจาก 120 คน และระบุผิดว่าผิดปกติอีก 22 คน ตัวเลขเหล่านี้เป็นตัวอย่างสมมติเพื่อการสอน ไม่ใช่ผลจากการศึกษาจริง

จุดขายของแผ่นพับคือเครื่องมือจัดกลุ่มคนได้ถูกต้อง 67.42% กรรมการคนหนึ่งเสริมว่า ในอำเภอซึ่งมีคนเป็นโรคไม่มาก เครื่องมือน่าจะทำได้ดีกว่านี้อีก แต่คณะกรรมการต้องการคำตอบที่ง่ายกว่านั้นสองข้อ คือ ถ้าชาวบ้านคนหนึ่งถูกระบุว่าผิดปกติ เขามีโอกาสเป็นโรคจริงเท่าใด และโครงการจะใช้เงินเท่าใดต่อผู้ป่วยหนึ่งรายที่ตรวจพบ

ผู้ใหญ่ในอำเภอนี้ราว 2 ใน 100 คนมีโรคนี้อยู่ในขณะนี้ สัดส่วนของประชากรที่มีโรค ณ เวลาหนึ่งเรียกว่าความชุก (prevalence) (อุบัติการณ์ ความชุก และตัวหารที่ถูกต้อง: ระบาดวิทยาเบื้องหลังต้นทุนความเจ็บป่วยและแบบจำลองมาร์คอฟ) ในการศึกษาความชุกสูงกว่านี้มาก และความต่างเพียงข้อเดียวนี้เปลี่ยนคำตอบแทบทุกข้อในบทความนี้

สิ่งที่การศึกษาบอกได้: ความไวและความจำเพาะ

อ่านก่อนในเว็บไซต์นี้:

การศึกษานี้แบ่งคนตามสถานะโรคก่อนตรวจ จึงบอกได้ว่าเครื่องมือตัดสินคนแต่ละกลุ่มถูกบ่อยเพียงใด ในผู้ที่มีโรค 58 คน เครื่องมือระบุว่าผิดปกติ 22 คน หรือ 37.93% คือความไว (sensitivity) ของเครื่องมือ หมายถึงสัดส่วนของผู้มีโรคที่เครื่องมือระบุว่าผิดปกติ ในผู้ที่ไม่มีโรค 120 คน เครื่องมือระบุว่าปกติ 98 คน หรือ 81.67% คือความจำเพาะ (specificity) หมายถึงสัดส่วนของผู้ไม่มีโรคที่เครื่องมือระบุว่าปกติ

การระบุว่าผิดปกติคือผลบวก (positive) และการระบุว่าปกติคือผลลบ (negative) ผู้มีโรค 22 คนที่ถูกระบุว่าผิดปกติจึงเป็นผลบวกจริง (true positive, TP) และผู้มีโรค 36 คนที่ถูกพลาดเป็นผลลบลวง (false negative, FN) ผู้ไม่มีโรค 22 คนที่ถูกระบุว่าผิดปกติเป็นผลบวกลวง (false positive, FP) หรือสัญญาณเตือนลวง และผู้ไม่มีโรค 98 คนที่ถูกระบุว่าปกติเป็นผลลบจริง (true negative, TN)

สำหรับคณะกรรมการ สัดส่วนทั้งสองนี้คือส่วนของการศึกษาที่นำไปใช้กับอำเภอได้ แต่ละค่าคำนวณภายในกลุ่มเดียว จึงไม่ขึ้นกับว่าผู้รับการตรวจป่วยกี่คน แต่ดังที่หัวข้อหลังจะแสดง ค่าทั้งสองยังขึ้นกับว่าผู้รับการตรวจป่วยหนักเพียงใด ความไว 37.93% ถือว่าต่ำ เครื่องมือพลาดผู้มีโรคราว 6 ใน 10 คน และอำเภอจะต้องนับผู้ป่วยที่ถูกพลาดเหล่านี้

ความถูกต้อง: ตัวเลขหลักของแผ่นพับ

ในการศึกษา เครื่องมือตัดสินถูก 22 + 98 = 120 คนจาก 178 คน คิดเป็น 67.42% ตามที่แผ่นพับระบุ สัดส่วนของผู้รับการตรวจทั้งหมดที่จัดกลุ่มได้ถูกนี้เรียกว่าความถูกต้อง (accuracy)

ถ้าจะดูอำเภอ ให้ติดตามผู้ใหญ่ 10,000 คนผ่านเครื่องมือทีละขั้น โดยนับเป็นจำนวนคนแทนการคำนวณร้อยละไปมา ตอนนี้ให้เครื่องมือมีความไวและความจำเพาะเท่าที่การศึกษาวัดได้ไปก่อน ซึ่งเป็นข้อสมมติที่เราจะกลับมาตั้งคำถามภายหลัง

ติดตามผู้ใหญ่ 10,000 คนผ่านเครื่องมือ

จำนวนคนเก็บทศนิยมสองตำแหน่ง เพราะ 37.93% ของ 200 คนไม่ใช่จำนวนเต็ม แล้วจึงปัดเป็นจำนวนคนเต็มในตอนท้าย ผลลัพธ์จาก R ด้านล่างแสดงตัวเลขเหล่านี้ซ้ำอีกครั้ง

  1. ใครมีโรค

    \[ 10000\times0.02=200 \]

    ผู้ใหญ่ 10,000 คน มี 2 ใน 100 คนที่มีโรค คือ 200 คน อีก 9,800 คนไม่มีโรค

  2. ผู้มีโรค: ถูกระบุว่าผิดปกติหรือถูกพลาด

    \[ 200\times\tfrac{22}{58}=75.86 \]

    เครื่องมือระบุว่าผิดปกติ 37.93% ของ 200 คน คือ 75.86 คน หรือพบผู้ป่วยราว 76 คน อีก 124.14 คน หรือราว 124 คน ถูกระบุว่าปกติ คือผู้ป่วยที่ถูกพลาด

  3. ผู้ไม่มีโรค: ระบุว่าปกติหรือเป็นสัญญาณเตือนลวง

    \[ 9800\times\tfrac{98}{120}=8003.33 \]

    เครื่องมือระบุว่าปกติ 81.67% ของ 9,800 คน คือ 8,003.33 คน หรือราว 8,003 คน อีก 1,796.67 คน หรือราว 1,797 คน ถูกระบุผิดว่าผิดปกติ คือสัญญาณเตือนลวง

  4. นับผู้ที่ผิดปกติและผู้ที่ปกติ

    \[ 76+1797=1873,\;124+8003=8127 \]

    เมื่อนับเป็นคนเต็ม มีผู้ใหญ่ถูกระบุว่าผิดปกติ 1,873 คน และระบุว่าปกติ 8,127 คน

  5. ความถูกต้องในอำเภอ

    \[ \frac{75.86+8003.33}{10000}=80.79\% \]

    เครื่องมือตัดสินถูก 75.86 + 8,003.33 คนจากผู้ใหญ่ 10,000 คน คิดเป็นความถูกต้อง 80.79%

ผลลัพธ์: เครื่องมือไม่ได้เปลี่ยนเลย แต่ความถูกต้องกลับเพิ่มจาก 67.42% ในการศึกษาเป็น 80.79% ในอำเภอ

การนับเป็นจำนวนคนแบบนี้แทนการใช้ร้อยละ เรียกว่าความถี่ตามธรรมชาติ (natural frequencies) ซึ่งทำให้ตรวจสอบได้ทุกขั้น

ทำไมความถูกต้องจึงเพิ่ม: ค่าเฉลี่ยถ่วงน้ำหนัก

ความถูกต้องเป็นการผสมคะแนนของสองกลุ่ม โดยถ่วงน้ำหนักตามขนาดของแต่ละกลุ่ม ในการศึกษามีผู้มีโรคราวหนึ่งในสาม (58 จาก 178 คน หรือ 32.58%) ความไวที่ต่ำจึงมีน้ำหนักหนึ่งในสาม คือ 0.3258 × 37.93% + 0.6742 × 81.67% = 12.36% + 55.06% = 67.42% ส่วนในอำเภอ ผู้ใหญ่ 98 ใน 100 คนไม่มีโรค ความจำเพาะจึงแทบเป็นตัวกำหนดความถูกต้องเพียงตัวเดียว

เมื่อใช้ Se แทนความไว Sp แทนความจำเพาะ และ π (อักษรกรีก pi) แทนความชุก

$$Acc=Se\,\pi+Sp\,(1-\pi)$$

ในอำเภอ ค่านี้คือ (22/58) × 0.02 + (98/120) × 0.98 = 0.76% + 80.03% = 80.79% การเพิ่มขึ้นนี้เป็นสัญญาณเตือน ไม่ใช่ข่าวดี เครื่องมือที่ระบุคนไม่มีโรคว่าปกติได้ดีกว่าระบุผู้มีโรคว่าผิดปกติ จะดูถูกต้องขึ้นเมื่อโรคพบน้อยลง ทั้งที่ไม่ได้พบผู้ป่วยเพิ่มเลยสักราย ความถูกต้องเพียงตัวเดียวจึงไม่ควรเป็นตัวเลขหลักที่รายงาน

ผลบวกหมายถึงอะไร: ค่าทำนายผล

อ่านก่อนในเว็บไซต์นี้:

ชาวบ้านที่ถูกระบุว่าผิดปกติถามอีกคำถามหนึ่ง คือ เมื่อฉันถูกระบุว่าผิดปกติแล้ว ฉันมีโอกาสเป็นโรคจริงเท่าใด คำถามนี้เริ่มจากกลุ่มที่ผลผิดปกติ ไม่ได้เริ่มจากกลุ่มที่มีโรค

ในการศึกษา มีผู้ถูกระบุว่าผิดปกติ 44 คน และมีโรคจริง 22 คน คือ 50.00% ในอำเภอ มีผู้ถูกระบุว่าผิดปกติ 1,873 คน และมีโรคจริงราว 76 คน ก่อนปัดเศษ ผู้ที่ผลผิดปกติคือ 75.86 + 1,796.67 = 1,872.53 คน และ 75.86 คนในนั้นคือ 4.05% เครื่องมือเดิมเปลี่ยนจากโอกาสครึ่งต่อครึ่งเป็นราว 4 ใน 100 ของผู้ที่ผลผิดปกติ

สัดส่วนนี้คือค่าทำนายผลบวก (positive predictive value, PPV) หมายถึงสัดส่วนของผู้ที่ผลผิดปกติที่มีโรคจริง ส่วนค่าทำนายผลลบ (negative predictive value, NPV) หมายถึงสัดส่วนของผู้ที่ผลปกติที่ไม่มีโรคจริง ในการศึกษา ผู้ที่ผลปกติ 134 คนไม่มีโรค 98 คน คือ 73.13% ส่วนในอำเภอคือ 98.47%

NPV ที่สูงของอำเภอบอกได้น้อยกว่าที่เห็น ก่อนการตรวจใด ๆ ผู้ใหญ่ในอำเภอ 98.00% ก็ไม่มีโรคอยู่แล้ว เครื่องมือจึงเพิ่มค่านี้ได้ไม่ถึงครึ่งจุดร้อยละ และยังระบุว่าปกติให้ผู้มีโรคอีก 124 คน

เมื่อเขียนเป็นสัญลักษณ์ ค่าทำนายแต่ละตัวเขียนได้ทั้งด้วยจำนวนคนและด้วย Se, Sp และ π

$$PPV=\frac{TP}{TP+FP}=\frac{Se\,\pi}{Se\,\pi+(1-Sp)(1-\pi)}$$

$$NPV=\frac{TN}{TN+FN}=\frac{Sp\,(1-\pi)}{Sp\,(1-\pi)+(1-Se)\,\pi}$$

ความไวและความจำเพาะเริ่มจากสถานะโรคที่แท้จริงแล้วถามถึงผลตรวจ ส่วนค่าทำนายเริ่มจากผลตรวจแล้วถามถึงโรค การกลับทิศนี้เองที่ทำให้ความชุก π เข้ามาเกี่ยวข้อง

ไล่จากกล่องสีน้ำเงินเข้มและกล่องสีส้มลงไปยังแถบบน ผู้ที่ผิดปกติ 1,797 คนจาก 1,873 คน มาจากผู้ไม่มีโรค 9,800 คน ผลบวกในอำเภอจึงมีเพียงราว 4 ใน 100 ที่หมายถึงการมีโรค
โค้ด R study.R
# Illustrative numbers for the committee's case: the company's study of 178 people
tp <- 22; fn <- 36; fp <- 22; tn <- 98; n <- tp + fn + fp + tn
pct <- function(x) formatC(100 * x, format = "f", digits = 2)
f4 <- function(x) formatC(x, format = "f", digits = 4)
cat("With the disease: ", tp + fn, "  without: ", fp + tn, "  all: ", n, "\n", sep = "")
cat("Sensitivity: ", tp, " of ", tp + fn, " = ", pct(tp / (tp + fn)), "%\n", sep = "")
cat("Specificity: ", tn, " of ", tn + fp, " = ", pct(tn / (tn + fp)), "%\n", sep = "")
cat("Accuracy: ", tp + tn, " of ", n, " = ", pct((tp + tn) / n), "%\n", sep = "")
cat("Prevalence in the study: ", tp + fn, " of ", n, " = ", pct((tp + fn) / n), "%\n", sep = "")
cat("Weighted: ", f4((tp + fn) / n), " x ", pct(tp / (tp + fn)), "% + ", f4((fp + tn) / n), " x ",
    pct(tn / (tn + fp)), "% = ", pct(tp / n), "% + ", pct(tn / n), "%\n", sep = "")
cat("PPV: ", tp, " of ", tp + fp, " flagged = ", pct(tp / (tp + fp)), "%\n", sep = "")
cat("NPV: ", tn, " of ", tn + fn, " cleared = ", pct(tn / (tn + fn)), "%\n", sep = "")
ผลลัพธ์จากการรัน study.log
With the disease: 58  without: 120  all: 178
Sensitivity: 22 of 58 = 37.93%
Specificity: 98 of 120 = 81.67%
Accuracy: 120 of 178 = 67.42%
Prevalence in the study: 58 of 178 = 32.58%
Weighted: 0.3258 x 37.93% + 0.6742 x 81.67% = 12.36% + 55.06%
PPV: 22 of 44 flagged = 50.00%
NPV: 98 of 134 cleared = 73.13%
ดูสองบรรทัดสุดท้าย ในผู้ที่เครื่องมือระบุว่าผิดปกติ 44 คนในการศึกษา มีโรคจริง 22 คน (PPV 50.00%) อำเภอจะไม่ได้ค่านี้ซ้ำ
โค้ด R screening.R
# Illustrative numbers for the committee's case: 10,000 adults screened once, 2% with the disease
people <- 10000; prevalence <- 0.02; se <- 22 / 58; sp <- 98 / 120
sick <- people * prevalence; well <- people - sick
tp <- sick * se; fn <- sick - tp; fp <- well * (1 - sp); tn <- well - fp
f2 <- function(x) formatC(x, format = "f", digits = 2, big.mark = ",")
cat("With the disease: ", sick, "  without: ", well, "\n", sep = "")
cat("Sick flagged, sick cleared, well flagged, well cleared:", f2(c(tp, fn, fp, tn)), "\n")
cat("Rounded to whole people:", round(c(tp, fn, fp, tn)), "\n")
cat("Flagged: ", round(tp) + round(fp), "  cleared: ", round(fn) + round(tn), "\n", sep = "")
cat("PPV: ", f2(tp), " / ", f2(tp + fp), " = ", f2(100 * tp / (tp + fp)), "%\n", sep = "")
cat("NPV: ", f2(100 * tn / (tn + fn)), "%  (no test: ", f2(100 * well / people), "%)\n", sep = "")
cat("Accuracy: ", f2(100 * se * prevalence), "% + ", f2(100 * sp * (1 - prevalence)), "% = ",
    f2(100 * (tp + tn) / people), "%\n", sep = "")
ผลลัพธ์จากการรัน screening.log
With the disease: 200  without: 9800
Sick flagged, sick cleared, well flagged, well cleared: 75.86 124.14 1,796.67 8,003.33
Rounded to whole people: 76 124 1797 8003
Flagged: 1873  cleared: 8127
PPV: 75.86 / 1,872.53 = 4.05%
NPV: 98.47%  (no test: 98.00%)
Accuracy: 0.76% + 80.03% = 80.79%
ดูบรรทัด PPV ในอำเภอ ผู้ใหญ่ที่ผลผิดปกติ 1,872.53 คนมีโรคจริงเพียง 75.86 คน คือ 4.05% ขณะที่บรรทัดความถูกต้องไต่ขึ้นเป็น 80.79%

เครื่องมือเดิมที่ความชุกต่าง ๆ

ระหว่างการศึกษากับอำเภอ มีเพียงความชุกที่เปลี่ยน รูปด้านล่างตรึงเครื่องมือไว้ แล้วเลื่อนความชุกตั้งแต่ 0% ถึง 40%

PPV ไต่ขึ้นเร็วที่สุดตอนความชุกต่ำแล้วไต่ช้าลง จาก 4.05% ที่ความชุก 2% ของอำเภอ เป็น 50.00% ที่ความชุก 32.58% ของการศึกษา และยังไต่ขึ้นต่อที่ 40% NPV ลดลงเมื่อโรคพบบ่อยขึ้น ส่วนความถูกต้องค่อย ๆ ลดลงเป็นเส้นตรงจากค่าความจำเพาะไปทางค่าความไว PPV, NPV หรือความถูกต้องที่ยกมาจากการศึกษาจึงเป็นของกลุ่มคนในการศึกษานั้น และต้องคำนวณใหม่สำหรับอำเภอ

อ่านเส้น PPV สีน้ำเงินที่เส้นประทั้งสอง ได้ 4.05% ที่ความชุก 2% ของอำเภอ และ 50.00% ที่ 32.58% ของการศึกษา เครื่องมือไม่ได้เปลี่ยนเลย มีเพียงสัดส่วนของผู้มีโรคที่เปลี่ยน PPV จึงต้องคำนวณใหม่สำหรับแต่ละประชากร

โอกาสของคนหนึ่งคนก่อนและหลังทราบผล: อัตราส่วนความน่าจะเป็น (likelihood ratio)

อ่านก่อนในเว็บไซต์นี้:

แพทย์ที่มีผู้ป่วยผลผิดปกติหนึ่งคนต้องรู้ว่าผลนี้ควรเปลี่ยนโอกาสของผู้ป่วยไปมากเพียงใด ไม่ว่าโอกาสนั้นจะเริ่มจากเท่าใด เครื่องมือระบุว่าผิดปกติ 37.93% ของผู้มีโรค แต่ก็ระบุว่าผิดปกติ 18.33% ของผู้ไม่มีโรคด้วย ผลบวกจึงพบในผู้มีโรคบ่อยกว่าในผู้ไม่มีโรค 37.93 / 18.33 = 2.069 เท่า คืออัตราส่วนความน่าจะเป็นของผลบวก (positive likelihood ratio) หรือ LR+ ส่วนผลลบพบในผู้มีโรคเป็น 62.07 / 81.67 = 0.760 เท่าของที่พบในผู้ไม่มีโรค คืออัตราส่วนความน่าจะเป็นของผลลบ (negative likelihood ratio) หรือ LR−

อัตราส่วนความน่าจะเป็น (likelihood ratio) ใช้คูณกับออดส์ (odds) ไม่ใช่คูณกับโอกาส ออดส์ในอำเภอคือ 2 ต่อ 98 หรือ 0.0204 หลังผลบวก ออดส์กลายเป็น 0.0204 × 2.069 = 0.0422 คิดเป็นโอกาส 0.0422 / (1 + 0.0422) = 4.05% ซึ่งเท่ากับ PPV อีกครั้ง หลังผลลบ ออดส์คือ 0.0204 × 0.760 = 0.0155 คิดเป็นโอกาส 1.53% คือผู้ป่วย 124 คนที่ถูกพลาดในผู้ที่ผลปกติ 8,127 คน

$$LR^{+}=\frac{Se}{1-Sp}$$

$$\text{odds}_{\text{after}}=\text{odds}_{\text{before}}\times LR$$

กฎเดียวกันนี้ให้ผลของการศึกษาคืนมา ออดส์ 58 ต่อ 120 หรือ 0.4833 คูณ 2.069 ได้ 1.000 คือโอกาสครึ่งต่อครึ่ง เท่ากับ PPV 50.00% ของการศึกษา ถ้าจะให้ผลบวกในอำเภอมีโอกาสครึ่งต่อครึ่ง อัตราส่วนนี้ต้องสูงถึงราว 49

อัตราส่วนที่มากกว่า 10 หรือน้อยกว่าหนึ่งในสิบจะเปลี่ยนการประเมินของแพทย์ได้มาก ส่วนอัตราส่วนที่ใกล้ 1 แทบไม่เปลี่ยน [1] ค่า 2.069 และ 0.760 ของเครื่องมือนี้ใกล้ 1 ทั้งคู่ จึงเป็นการตรวจที่อ่อน ผลบวกเพิ่มโอกาสได้เพียงจาก 2% เป็น 4.05% ชาวบ้านส่วนใหญ่ที่ผลผิดปกติจึงยังไม่มีโรค และผลลบลดโอกาสได้เพียงจาก 2% เป็น 1.53%

โค้ด R likelihood.R
# Illustrative numbers for the committee's case: how far one result moves one person's chance
se <- 22 / 58; sp <- 98 / 120; lrp <- se / (1 - sp); lrn <- (1 - se) / sp; pre <- 0.02 / 0.98
f <- function(x, d = 3) formatC(x, format = "f", digits = d); p <- function(o) f(100*o / (1+o), 2)
cat("Flagged if sick: ", f(100 * se, 2), "%  if well: ", f(100 * (1 - sp), 2), "%; cleared, sick: ",
    f(100 * (1 - se), 2), "%  well: ", f(100 * sp, 2), "%\n", sep = "")
cat("Positive LR: ", f(lrp), "  negative LR: ", f(lrn), "\n", sep = "")
cat("District odds 2 to 98 = ", f(pre, 4), "; after a positive x ", f(lrp), " = ", f(pre * lrp, 4),
    " -> ", p(pre * lrp), "%\n", sep = "")
cat("After a negative: ", f(pre, 4), " x ", f(lrn), " = ", f(pre * lrn, 4), " -> ", p(pre * lrn),
    "%\n", sep = "")
cat("Study odds: 58 to 120 = ", f(58 / 120, 4), " -> after a positive ", f(58 / 120 * lrp), "\n",
    sep = "")
cat("LR a positive would need for even odds in the district: ", f(1 / pre, 0), "\n", sep = "")
ผลลัพธ์จากการรัน likelihood.log
Flagged if sick: 37.93%  if well: 18.33%; cleared, sick: 62.07%  well: 81.67%
Positive LR: 2.069  negative LR: 0.760
District odds 2 to 98 = 0.0204; after a positive x 2.069 = 0.0422 -> 4.05%
After a negative: 0.0204 x 0.760 = 0.0155 -> 1.53%
Study odds: 58 to 120 = 0.4833 -> after a positive 1.000
LR a positive would need for even odds in the district: 49
ดูอัตราส่วนความน่าจะเป็นของผลบวกและบรรทัดถัดไป ค่า 2.069 เปลี่ยนออดส์ของอำเภอจาก 0.0204 ได้เพียงเป็น 0.0422 คือโอกาส 4.05% การตรวจนี้จึงอ่อน

ตามผู้ที่ผลผิดปกติไปถึงงบประมาณ: ต้นทุนต่อผู้ป่วยหนึ่งรายที่ตรวจพบ

คณะกรรมการต้องจ่ายสองส่วน คือค่าตรวจคัดกรองของทุกคน และค่าตรวจยืนยันของทุกคนที่ผลผิดปกติ ใช้ราคาสมมติ 200 บาทต่อการตรวจคัดกรองหนึ่งครั้ง และ 2,000 บาทต่อการตรวจยืนยันหนึ่งครั้ง เงินจ่ายเป็นรายคน หัวข้อนี้จึงนับเป็นคนเต็ม คือผู้ป่วย 76 คนและสัญญาณเตือนลวง 1,797 ราย

ค่าตรวจคัดกรองคือ 10,000 × 200 = 2,000,000 บาท ค่าตรวจยืนยันผู้ใหญ่ 1,873 คนที่ผลผิดปกติคือ 1,873 × 2,000 = 3,746,000 บาท การคัดกรองหนึ่งรอบจึงใช้เงินรวม 5,746,000 บาท และพบผู้ป่วย 76 คน คิดเป็น 5,746,000 / 76 = 75,605 บาทต่อผู้ป่วยหนึ่งรายที่ตรวจพบ

ตัวเลขนี้คือต้นทุนต่อผู้ป่วยหนึ่งรายที่ตรวจพบ (cost per case detected) คือเงินที่โครงการใช้ หารด้วยจำนวนผู้ป่วยจริงที่พบ เป็นตัวเลขแรกที่มีประโยชน์ แต่ยังไม่ได้บอกเลยว่าการพบผู้ป่วยเหล่านั้นช่วยใครได้หรือไม่

ลองดูว่าเงินไปอยู่ที่ใด การตรวจยืนยันสัญญาณเตือนลวง 1,797 รายใช้เงิน 3,594,000 บาท หรือ 62.55% ของทั้งหมด อีก 152,000 บาทใช้ตรวจยืนยันผู้ป่วยจริง 76 คน (76 × 2,000) ค่าตรวจคัดกรอง ค่าตรวจยืนยันสัญญาณเตือนลวง และค่าตรวจยืนยันผู้ป่วยจริงรวมกันได้ 5,746,000 บาท

ผู้ป่วยแต่ละรายที่พบมาพร้อมสัญญาณเตือนลวง 1,797 / 76 = 23.64 ราย แต่ละรายคือชาวบ้านที่กังวล และต้องเดินทางไปโรงพยาบาล ขณะเดียวกัน ผู้มีโรค 124 คนได้รับแจ้งว่าปกติ

โค้ด R screening_costs.R
# Illustrative prices for the committee's case: one screening round of 10,000 adults
people <- 10000; test <- 200; confirm <- 2000; tp <- 76; fp <- 1797
testing <- people * test; confirming <- (tp + fp) * confirm; total <- testing + confirming
thb <- function(x) formatC(x, format = "d", big.mark = ",")
cat("Testing: ", thb(people), " x ", test, " = ", thb(testing), " THB\n", sep = "")
cat("Confirming: ", thb(tp + fp), " x ", thb(confirm), " = ", thb(confirming), " THB\n", sep = "")
cat("Total: ", thb(total), " THB\n", sep = "")
cat("Per case found: ", thb(total), " / ", tp, " = ", thb(round(total / tp)), " THB\n", sep = "")
cat("Confirming false positives: ", thb(fp * confirm), " THB = ",
    formatC(100 * fp * confirm / total, format = "f", digits = 2), "% of the total\n", sep = "")
cat("Confirming cases: ", tp, " x ", thb(confirm), " = ", thb(tp * confirm), " THB\n", sep = "")
cat("False positives per true case: ", thb(fp), " / ", tp, " = ",
    formatC(fp / tp, format = "f", digits = 2), "\n", sep = "")
ผลลัพธ์จากการรัน screening_costs.log
Testing: 10,000 x 200 = 2,000,000 THB
Confirming: 1,873 x 2,000 = 3,746,000 THB
Total: 5,746,000 THB
Per case found: 5,746,000 / 76 = 75,605 THB
Confirming false positives: 3,594,000 THB = 62.55% of the total
Confirming cases: 76 x 2,000 = 152,000 THB
False positives per true case: 1,797 / 76 = 23.64
ดูบรรทัดต้นทุนต่อผู้ป่วยที่พบและบรรทัดสัญญาณเตือนลวง 75,605 บาทต่อผู้ป่วยหนึ่งรายที่พบ และ 62.55% ของเงินทั้งรอบจ่ายให้การตรวจยืนยันสัญญาณเตือนลวง
ตัวควบคุมเริ่มที่อำเภอ คือความชุก 2% ความไวและความจำเพาะของการศึกษา และค่าตรวจยืนยัน 2,000 บาท การ์ดจึงแสดง PPV 4.05% และ 75,605 บาทต่อผู้ป่วยที่พบ ลองลากความชุกขึ้นไปราว 33% เท่ากับกลุ่มคนในการศึกษา PPV จะไต่ขึ้นราว 50% และต้นทุนต่อผู้ป่วยที่พบจะลดลง ทั้งที่เครื่องมือไม่ได้เปลี่ยน ช่องขวาวางหนึ่งในสิบของร้อยละหนึ่ง 1% และ 10% ห่างเท่ากัน (สเกลลอการิทึม) เพื่อให้อ่านความชุกต่ำ ๆ ของการคัดกรองได้ชัด

อำเภอเชื่อตัวเลข 37.93% และ 81.67% ได้หรือไม่

อ่านก่อนในเว็บไซต์นี้:

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

การศึกษานี้มีผู้มีโรคเพียง 58 คน ค่า 22 จาก 58 จึงเป็นค่าประมาณคร่าว ๆ ช่วงความเชื่อมั่น 95% ของค่านี้จึงกว้าง ข้อมูลเข้ากันได้กับความไวที่แท้จริงตั้งแต่ 26.56% ถึง 50.80% ส่วนความจำเพาะซึ่งได้จากคน 120 คนมีช่วงตั้งแต่ 73.80% ถึง 87.57% ช่วงทั้งสองคำนวณด้วยวิธีของ Wilson [2] ซึ่งเป็นวิธีสำหรับสัดส่วนที่ไม่หลุดออกนอก 0% ถึง 100% แม้ในกลุ่มเล็ก

ถ้าคิดกรณีดีที่สุดแบบคร่าว ๆ ให้ทั้งสองค่าอยู่ที่ปลายที่ดีที่สุด PPV ของอำเภอจะเป็น 7.70% และถ้าอยู่ที่ปลายที่แย่ที่สุดจะเป็น 2.03% ไม่ว่าทางใด ผู้ใหญ่ส่วนใหญ่ที่ผลผิดปกติในอำเภอก็ยังเป็นสัญญาณเตือนลวง แบบจำลองของคณะกรรมการจึงควรนำช่วงความเชื่อมั่นทั้งสองและช่วงของ PPV นี้เข้าไปในการวิเคราะห์ความไม่แน่นอน แทนการใช้ค่าเดียว

อคติเป็นเรื่องที่น่ากังวลกว่า การศึกษานี้รับผู้ป่วย 58 คนที่ได้รับการวินิจฉัยแล้วในโรงพยาบาล และอาสาสมัครสุขภาพดี 120 คน ผู้มีโรคและผู้ไม่มีโรคจึงเข้ามาทางประตูต่างกัน เรียกว่าการออกแบบสองประตู (two-gate design) ผู้ป่วยในโรงพยาบาลมักเป็นโรคระยะลุกลามที่เห็นชัด และอาสาสมัครสุขภาพดีก็ไม่มีอะไรคล้ายโรคเลย งานของเครื่องมือจึงง่ายกว่าในหมู่บ้าน

ความไวหรือความจำเพาะที่ต่างไปจากสถานการณ์จริงเพราะกลุ่มคนในการศึกษา เรียกว่ามีอคติจากสเปกตรัมของผู้ป่วย (spectrum bias) ในการคัดกรอง โรคมักอยู่ในระยะแรกและมีขนาดเล็กกว่า ความไวที่แท้จริงในอำเภอจึงน่าจะต่ำกว่า 37.93% แบบจำลองที่ยังใช้ 37.93% จะนับผู้ป่วยที่พบมากเกินไปและผู้ป่วยที่ถูกพลาดน้อยเกินไป ความไวที่ต่ำกว่านี้จึงควรอยู่ในสถานการณ์ทดสอบของแบบจำลอง

การศึกษาที่เหมาะกับคณะกรรมการควรตรวจผู้ใหญ่ที่เข้ามาต่อเนื่องกันและคล้ายผู้ใหญ่ในอำเภอ แล้วตรวจยืนยันทุกคน ไม่ว่าผลจะผิดปกติหรือไม่ ด้วยการตรวจแบบเดียวกัน QUADAS-2 [3] ใช้ประเมินความเสี่ยงของอคติเหล่านี้ และ STARD 2015 [4] ระบุสิ่งที่การศึกษาแบบนี้ต้องรายงาน

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

โค้ด R uncertainty.R
# Illustrative numbers for the committee's case: how sure 22 of 58 and 98 of 120 can be
pct <- function(x) formatC(100 * x, format = "f", digits = 2)
wilson <- function(k, m) prop.test(k, m, correct = FALSE)$conf.int
se <- wilson(22, 58); sp <- wilson(98, 120)
cat("Sensitivity: ", pct(22 / 58), "% (95% CI ", pct(se[1]), "% to ", pct(se[2]), "%)\n", sep = "")
cat("Specificity: ", pct(98 / 120), "% (95% CI ", pct(sp[1]), "% to ", pct(sp[2]), "%)\n", sep = "")
ppv <- function(a, b) 0.02 * a / (0.02 * a + 0.98 * (1 - b))
cat("District PPV with both at their best ends: ", pct(ppv(se[2], sp[2])), "%\n", sep = "")
cat("District PPV with both at their worst ends: ", pct(ppv(se[1], sp[1])), "%\n", sep = "")
ผลลัพธ์จากการรัน uncertainty.log
Sensitivity: 37.93% (95% CI 26.56% to 50.80%)
Specificity: 81.67% (95% CI 73.80% to 87.57%)
District PPV with both at their best ends: 7.70%
District PPV with both at their worst ends: 2.03%
ดูสองบรรทัดสุดท้าย แม้ทั้งสองสัดส่วนอยู่ที่ปลายที่ดีที่สุด PPV ของอำเภอก็เป็นเพียง 7.70% และที่ปลายที่แย่ที่สุดเป็น 2.03% ผู้ใหญ่ส่วนใหญ่ที่ผลผิดปกติจึงยังเป็นสัญญาณเตือนลวง

การพบผู้ป่วยไม่เหมือนกับการช่วยผู้ป่วย

สมมติว่าการตรวจยืนยันแม่นยำสมบูรณ์ และผู้ป่วยทั้ง 76 คนที่พบได้รับการรักษา คณะกรรมการก็ยังไม่รู้ว่ามีใครมีชีวิตยืนยาวขึ้นหรือดีขึ้นหรือไม่ มีสามปรากฏการณ์ที่ทำให้โครงการคัดกรองดูดีได้ แม้จะไม่ได้ช่วยใครเลย

ข้อแรก นาฬิกาเริ่มเดินเร็วขึ้น ลองนึกถึงชาวบ้านคนหนึ่งที่โรคจะทำให้เกิดอาการเมื่ออายุ 62 ปี และเสียชีวิตเมื่ออายุ 70 ปีไม่ว่าจะทำอะไร ถ้าไม่คัดกรอง เขามีชีวิตอยู่ 8 ปีหลังการวินิจฉัย ถ้าคัดกรองพบเมื่ออายุ 58 ปี เขาจะมีชีวิตอยู่ 12 ปีหลังการวินิจฉัย แต่ก็ยังเสียชีวิตเมื่ออายุ 70 ปีเหมือนเดิม ช่วงที่รู้ก่อน 4 ปีนี้เรียกว่าเวลานำ (lead time) และการรอดชีพที่ดูยาวขึ้นเพียงเพราะเริ่มนับเวลาเร็วขึ้น เรียกว่าอคติจากเวลานำ (lead-time bias)

ข้อสอง การคัดกรองครั้งเดียวมักพบโรคแบบช้า สมมติว่าโรคมีแบบดำเนินช้าซึ่งตรวจพบได้ 4 ปีก่อนมีอาการ และแบบดำเนินเร็วซึ่งตรวจพบได้ 1 ปี และแต่ละปีมีผู้เริ่มเป็นโรคทั้งสองแบบเท่ากัน การคัดกรองจะจับแบบช้าได้บ่อยกว่า 4 เท่า ผู้ป่วยที่พบจากการคัดกรอง 80% เป็นแบบช้า เทียบกับ 50% ของผู้ป่วยใหม่ทั้งหมด การเอียงไปหาโรคที่ดำเนินช้า ซึ่งจะมีผลดีกว่าอยู่แล้วแม้ไม่คัดกรอง เรียกว่าอคติจากความยาวของช่วงที่ตรวจพบได้ (length-time bias)

ข้อสาม โรคบางส่วนไม่เคยก่อปัญหา สมมติว่าหนึ่งในสี่ของผู้ป่วย 76 คนที่พบจะไม่มีอาการเลยตลอดชีวิต จะมี 19 คนที่ถูกวินิจฉัยว่าป่วยและได้รับการรักษาโดยไม่มีทางได้ประโยชน์ การพบโรคแบบนี้เรียกว่าการวินิจฉัยเกิน (overdiagnosis) ซึ่งไม่ใช่ผลบวกลวง เพราะโรคมีอยู่จริง แต่การพบโรคช่วยอะไรไม่ได้

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

โค้ด R outcomes.R
# Illustrative numbers for the committee's case: finding the disease earlier is not helping
screened_at <- 58; symptoms_at <- 62; death_at <- 70
cat("Years from diagnosis to death: ", death_at - symptoms_at, " without screening, ",
    death_at - screened_at, " with\n", sep = "")
cat("Age at death either way: ", death_at, "  lead time: ", symptoms_at - screened_at, " years\n",
    sep = "")
slow <- 4; fast <- 1
cat("Slow form among the cases one screen finds: ", 100 * slow / (slow + fast),
    "% (", 100 * 1 / 2, "% of new cases)\n", sep = "")
found <- 76; harmless <- 0.25
cat("Cases found that would never have caused harm: ", found * harmless, " of ", found, "\n",
    sep = "")
ผลลัพธ์จากการรัน outcomes.log
Years from diagnosis to death: 8 without screening, 12 with
Age at death either way: 70  lead time: 4 years
Slow form among the cases one screen finds: 80% (50% of new cases)
Cases found that would never have caused harm: 19 of 76
ดูสองบรรทัดแรก การคัดกรองเพิ่มเวลาหลังการวินิจฉัย 4 ปี แต่ยังเสียชีวิตเมื่ออายุ 70 ปีเหมือนเดิม บรรทัดสุดท้ายแสดงว่าผู้ป่วยที่พบ 19 คนจาก 76 คนจะไม่ก่ออันตรายเลย

ผู้ป่วยหนึ่งรายคุ้มกับสัญญาณเตือนลวงกี่ราย: เกณฑ์และประโยชน์สุทธิ

อ่านก่อนในเว็บไซต์นี้:

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

คณะกรรมการตกลงกฎข้อหนึ่ง คือส่งคนไปตรวจยืนยันเมื่อโอกาสที่เขาจะมีโรคอย่างน้อย 5% ที่โอกาสนี้ มีผู้มีโรค 5 คนต่อผู้ไม่มีโรค 95 คน คณะกรรมการจึงยอมรับสัญญาณเตือนลวงได้ไม่เกิน 95 / 5 = 19 ราย ต่อผู้ป่วยที่พบหนึ่งราย โอกาสเป็นโรคขั้นต่ำที่ถ้าถึงหรือสูงกว่านี้ การลงมือทำจะคุ้มกับผลเสีย จุดตัดนี้เรียกว่าความน่าจะเป็นเกณฑ์ (threshold probability)

เครื่องมือนี้ให้สัญญาณเตือนลวง 23.64 รายต่อผู้ป่วยที่พบหนึ่งราย (1,797 / 76 เมื่อนับเป็นคนเต็ม และ 23.68 ก่อนปัดเศษ) มากกว่า 19 รายที่คณะกรรมการยอมรับ พูดอีกแบบคือ โอกาสมีโรคของชาวบ้านที่ผลผิดปกติ ซึ่งเท่ากับ PPV 4.05% ต่ำกว่าเกณฑ์ 5% ตามกฎของคณะกรรมการเอง การส่งผู้ที่ผลผิดปกติไปตรวจยืนยันจึงก่อผลเสียมากกว่าผลดี

เรื่องนี้รวมเป็นตัวเลขเดียวได้ ให้นับผู้ป่วยจริงที่พบ แล้วหักสัญญาณเตือนลวง โดยนับแต่ละรายเป็น 1/19 ของผู้ป่วยหนึ่งราย ต่อผู้ใหญ่ 10,000 คน ได้ 75.86 − 1,796.67 / 19 = 75.86 − 94.56 = −18.7 การตรวจยืนยันทุกคนได้ 200 − 515.79 = −315.8 และการไม่ตรวจยืนยันใครเลยได้ 0 ตัวเลขนี้เรียกว่าประโยชน์สุทธิ (net benefit)

เครื่องมือจึงชนะการตรวจยืนยันทุกคน แต่แพ้การไม่ทำอะไรเลย ถ้าคณะกรรมการยอมรับสัญญาณเตือนลวงได้ 49 รายต่อผู้ป่วยหนึ่งราย (98 / 2 = 49 คือเกณฑ์ 2%) ประโยชน์สุทธิของเครื่องมือจะเป็น 75.86 − 36.67 = 39.2 ต่อ 10,000 คน และการคัดกรองจะชนะ

ข้อควรระวังสำหรับตัวเลขทั้งหมดนี้คือ ตัวเลขเหล่านี้เข้าข้างเครื่องมือ เพราะนับผู้ป่วยทุกคนที่พบว่าได้รับความช่วยเหลือ ซึ่งหัวข้อก่อนหน้าแสดงแล้วว่าไม่แน่เสมอไป ประโยชน์สุทธิที่แท้จริงของเครื่องมือจึงมีแต่จะต่ำกว่านี้

เมื่อคำนวณซ้ำที่ทุกค่าของเกณฑ์ ผลรวมเหล่านี้วาดได้เป็นเส้นละหนึ่งเส้น สำหรับเครื่องมือ การตรวจยืนยันทุกคน และการไม่ตรวจยืนยันใครเลย การเปรียบเทียบเส้นเหล่านี้เรียกว่าการวิเคราะห์เส้นโค้งการตัดสินใจ (decision curve analysis) [5] เส้นของเครื่องมือเป็นบวกที่ 2% เป็นศูนย์ที่ 4.05% ซึ่งเท่ากับ PPV ของมัน และติดลบที่ 5% ส่วนเมื่อเกณฑ์ต่ำกว่า 1.53% ซึ่งเป็นโอกาสที่เหลืออยู่หลังผลลบ การตรวจยืนยันทุกคนได้คะแนนสูงสุด ระหว่าง 1.53% ถึง 4.05% เครื่องมือดีที่สุด และเมื่อเกณฑ์สูงกว่า 4.05% การไม่ทำอะไรเลยชนะ

เมื่อคัดกรองผู้ใหญ่ N คน และใช้เกณฑ์ pt ประโยชน์สุทธิต่อคนคือ

$$NB=\frac{TP}{N}-\frac{FP}{N}\times\frac{p_t}{1-p_t}$$

ที่ pt = 5% น้ำหนัก pt/(1 − pt) เท่ากับ 5/95 คือ 1/19 ที่ใช้ข้างต้น และสูตรนี้ให้ −18.7 / 10,000 = −0.00187 ต่อคน เรารายงานเป็นต่อผู้ใหญ่ 10,000 คนเพราะอ่านง่ายกว่า ประโยชน์สุทธินับเป็นจำนวนผู้ป่วย ไม่ได้นับเป็นบาท ฉบับเศรษฐศาสตร์จะตีค่าสุขภาพที่ได้เป็นเงินแล้วหักต้นทุน และบทความถัด ๆ ไปในชุดนี้จะสร้างขึ้นทีละขั้น ในฉบับนั้น ราคาต่อหนึ่งหน่วยสุขภาพทำหน้าที่เดียวกับเกณฑ์ในที่นี้ ทั้งสองบอกไว้ก่อนเห็นข้อมูลว่าผลลัพธ์ที่ดีหนึ่งครั้งมีค่าเท่าใด

โค้ด R net_benefit.R
# Illustrative numbers for the committee's case: net benefit per 10,000 adults screened
people <- 10000; sick <- 200; well <- people - sick
tp <- sick * 22 / 58; fp <- well * (1 - 98 / 120)
f <- function(x, d = 2) formatC(x, format = "f", digits = d, big.mark = ",")
cat("False alarms per case found before rounding: ", f(fp), " / ", f(tp), " = ", f(fp / tp),
    "\n", sep = "")
cat("Threshold 5%: one false positive counts as 1/", 0.95 / 0.05, " of a true case\n", sep = "")
cat("Tool: ", f(tp), " - ", f(fp), " / 19 = ", f(tp), " - ", f(fp / 19), " = ",
    f(tp - fp / 19, 1), "; per person ", f((tp - fp / 19) / people, 5), "\n", sep = "")
cat("Confirm everyone: ", sick, " - ", f(well / 19), " = ", f(sick - well / 19, 1),
    "; confirm no one: ", f(0, 1), "\n", sep = "")
cat("Threshold 2% (1/", 0.98 / 0.02, "): tool ", f(tp), " - ", f(fp / 49), " = ",
    f(tp - fp / 49, 1), "; confirm everyone ", f(sick - well / 49, 1), "\n", sep = "")
ผลลัพธ์จากการรัน net_benefit.log
False alarms per case found before rounding: 1,796.67 / 75.86 = 23.68
Threshold 5%: one false positive counts as 1/19 of a true case
Tool: 75.86 - 1,796.67 / 19 = 75.86 - 94.56 = -18.7; per person -0.00187
Confirm everyone: 200 - 515.79 = -315.8; confirm no one: 0.0
Threshold 2% (1/49): tool 75.86 - 36.67 = 39.2; confirm everyone 0.0
ดูบรรทัดของเครื่องมือ ที่เกณฑ์ 5% ประโยชน์สุทธิเป็น −18.7 ต่อผู้ใหญ่ 10,000 คน ต่ำกว่าการไม่ตรวจยืนยันใครเลย (0) และที่เกณฑ์ 2% กลายเป็นบวก 39.2

แบบจำลองเศรษฐศาสตร์ของคณะกรรมการยังต้องการอะไรอีก

อ่านก่อนในเว็บไซต์นี้:

ต้นทุน 75,605 บาทต่อผู้ป่วยที่พบเป็นเพียงผลลัพธ์ระหว่างทาง การประเมินทางเศรษฐศาสตร์ของโครงการต้องเปรียบเทียบกับสิ่งที่อำเภอทำอยู่ในปัจจุบัน การเปรียบเทียบนั้นคือต้นทุนที่เพิ่มขึ้นต่อสุขภาพที่ได้เพิ่มหนึ่งหน่วยเมื่อเทียบกับวิธีปฏิบัติปัจจุบันของอำเภอ เป็นขั้นต่อไปของชุดบทความนี้ และรายการชุดบทความท้ายบทความนี้แสดงว่าขั้นนั้นอยู่ตรงไหน ในขั้นนี้ แบบจำลองต้องติดตามคนแต่ละกลุ่มไปจนถึงผลลัพธ์ที่สำคัญ [6]

  • ผู้ป่วย 76 คนที่พบ: การรักษาที่เร็วขึ้นเปลี่ยนสุขภาพของพวกเขาได้เท่าใด โดยใช้ข้อมูลจากการทดลองคัดกรองแบบสุ่ม ไม่ใช่จากการรอดชีพหลังการวินิจฉัย
  • สัญญาณเตือนลวง 1,797 ราย: ค่าตรวจยืนยันและความกังวลที่เกิดขึ้น
  • ผู้ป่วย 124 คนที่ถูกพลาดและได้รับความมั่นใจผิด ๆ และผู้ป่วยที่พบซึ่งไม่จำเป็นต้องพบเลย
  • ความถี่ของการคัดกรอง: รอบแรกพบโรคที่สะสมมาหลายปี ส่วนรอบต่อ ๆ ไปส่วนใหญ่พบผู้ป่วยใหม่ ความชุกและ PPV ของรอบหลังจึงต่ำกว่ารอบแรก

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

เครื่องมือ AI ต้องตรวจเพิ่มอีกหนึ่งเรื่อง เครื่องมือแบบนี้หลายตัวให้โอกาสมีโรคที่ทำนายไว้ของแต่ละคน ไม่ได้ให้เพียงผลผิดปกติหรือปกติ ความตรงกันระหว่างโอกาสที่ทำนายกับความจริงเรียกว่าความสอดคล้องของค่าทำนาย (calibration) ในกลุ่มคนที่ได้รับแจ้งว่ามีโอกาส 1 ใน 10 ควรมีโรคจริงราว 1 ใน 10 คน

เครื่องมืออาจเรียงลำดับคนได้ดี แต่ยังทำนายโอกาสคลาดเคลื่อนในอำเภอที่มีความชุกต่างจากข้อมูลที่เครื่องมือเรียนรู้มา จึงต้องตรวจความชุกในพื้นที่ ความสอดคล้องของค่าทำนาย และจุดตัดของผลผิดปกติในอำเภอก่อนใช้งาน

คำศัพท์ที่เราใช้

False positive (ผลบวกลวง)
ผู้ที่การตรวจระบุว่าผิดปกติแต่ไม่มีโรค หรือสัญญาณเตือนลวง
False negative (ผลลบลวง)
ผู้ที่การตรวจระบุว่าปกติแต่มีโรค หรือผู้ป่วยที่ถูกพลาด
Accuracy (ความถูกต้อง)
สัดส่วนของผู้รับการตรวจทั้งหมดที่จัดกลุ่มได้ถูก ค่านี้ขึ้นกับความชุก
Natural frequencies (ความถี่ตามธรรมชาติ)
การนับเป็นจำนวนคน เช่น 76 จาก 1,873 แทนการใช้ร้อยละ
Positive predictive value (PPV) (ค่าทำนายผลบวก)
สัดส่วนของผู้ที่ผลผิดปกติที่มีโรคจริง
Negative predictive value (NPV) (ค่าทำนายผลลบ)
สัดส่วนของผู้ที่ผลปกติที่ไม่มีโรคจริง
Likelihood ratio (อัตราส่วนความน่าจะเป็น)
ผลตรวจหนึ่งพบในผู้มีโรคบ่อยกว่าในผู้ไม่มีโรคกี่เท่า ใช้คูณกับออดส์
Cost per case detected (ต้นทุนต่อผู้ป่วยหนึ่งรายที่ตรวจพบ)
เงินที่โครงการใช้หารด้วยผู้ป่วยจริงที่พบ เป็นผลลัพธ์ระหว่างทาง ไม่ใช่ความคุ้มค่า
Wilson interval (ช่วงความเชื่อมั่นแบบ Wilson)
ช่วงความเชื่อมั่นของสัดส่วนที่อยู่ระหว่าง 0% ถึง 100% แม้ในกลุ่มเล็ก
Two-gate design (การออกแบบสองประตู)
การศึกษาความแม่นยำที่รับผู้มีโรคและผู้ไม่มีโรคมาจากแหล่งต่างกัน
Spectrum bias (อคติจากสเปกตรัมของผู้ป่วย)
ความไวหรือความจำเพาะของการศึกษาที่ต่างไปจากสถานการณ์จริงเพราะกลุ่มคนที่การศึกษาตรวจ
Lead-time bias (อคติจากเวลานำ)
การรอดชีพหลังวินิจฉัยที่ยาวขึ้นเพียงเพราะวินิจฉัยเร็วขึ้น
Length-time bias (อคติจากความยาวของช่วงที่ตรวจพบได้)
การที่การคัดกรองเอียงไปพบโรคที่ดำเนินช้า ซึ่งตรวจพบได้นานกว่าก่อนเกิดอาการ
Overdiagnosis (การวินิจฉัยเกิน)
การพบโรคที่มีอยู่จริงแต่จะไม่ก่ออาการเลยตลอดชีวิตของคนนั้น
Threshold probability (ความน่าจะเป็นเกณฑ์)
โอกาสเป็นโรคขั้นต่ำที่ถ้าถึงหรือสูงกว่านี้ การลงมือทำจะคุ้มกับผลเสีย ที่ 5% ผู้ป่วยหนึ่งรายคุ้มกับสัญญาณเตือนลวง 19 ราย
Net benefit (ประโยชน์สุทธิ)
ผู้ป่วยจริงที่พบลบด้วยสัญญาณเตือนลวงที่ถ่วงน้ำหนักตามเกณฑ์ ต่อผู้รับการคัดกรองหนึ่งคน (ในบทความนี้รายงานต่อผู้ใหญ่ 10,000 คน)
Decision curve analysis (การวิเคราะห์เส้นโค้งการตัดสินใจ)
การวาดประโยชน์สุทธิตลอดช่วงของเกณฑ์ สำหรับการตรวจ การลงมือกับทุกคน และการไม่ลงมือกับใครเลย
Calibration (ความสอดคล้องของค่าทำนาย)
ความตรงกันระหว่างโอกาสที่เครื่องมือทำนายกับความถี่ที่พบโรคจริง

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

  1. Deeks JJ, Altman DG. Diagnostic tests 4: likelihood ratios. BMJ. 2004;329(7458):168-169. doi:10.1136/bmj.329.7458.168
  2. Newcombe RG. Two-sided confidence intervals for the single proportion: comparison of seven methods. Stat Med. 1998;17(8):857-872. doi:10.1002/(SICI)1097-0258(19980430)17:8<857::AID-SIM777>3.0.CO;2-E
  3. Whiting PF, Rutjes AW, Westwood ME, Mallett S, Deeks JJ, Reitsma JB, Leeflang MM, Sterne JA, Bossuyt PM. QUADAS-2: a revised tool for the quality assessment of diagnostic accuracy studies. Ann Intern Med. 2011;155(8):529-536. doi:10.7326/0003-4819-155-8-201110180-00009
  4. Bossuyt PM, Reitsma JB, Bruns DE, Gatsonis CA, Glasziou PP, Irwig L, Lijmer JG, Moher D, Rennie D, de Vet HCW, Kressel HY, Rifai N, Golub RM, Altman DG, Hooft L, Korevaar DA, Cohen JF. STARD 2015: an updated list of essential items for reporting diagnostic accuracy studies. BMJ. 2015;351:h5527. doi:10.1136/bmj.h5527
  5. Vickers AJ, Elkin EB. Decision curve analysis: a novel method for evaluating prediction models. Med Decis Making. 2006;26(6):565-574. doi:10.1177/0272989X06295361
  6. Hunink MGM, Weinstein MC, Wittenberg E, Drummond MF, Pliskin JS, Wong JB, Glasziou PP. Decision Making in Health and Medicine: Integrating Evidence and Values. 2nd ed. Cambridge: Cambridge University Press; 2014. ISBN 9781107690479

ลำดับการเรียนในชุดนี้

  1. คู่มือชุดบทความเศรษฐศาสตร์สุขภาพ: อ่านหลักฐานก่อนอ่านต้นทุน
  2. อุบัติการณ์ ความชุก และตัวหารที่ถูกต้อง: ระบาดวิทยาเบื้องหลังต้นทุนความเจ็บป่วยและแบบจำลองมาร์คอฟ
  3. รูปแบบการศึกษา แบบจำลองทางสถิติ และเป้าหมายการประมาณค่า: แต่ละรูปแบบการศึกษาประมาณค่าอะไรได้จริง
  4. อัตราส่วนความเสี่ยง อัตราส่วนออดส์ ผลต่างความเสี่ยง และจำนวนที่ต้องรักษา: ตารางสองคูณสองเดียว คำตอบสี่แบบ
  5. อัตราส่วนฮาซาร์ดไม่ใช่อัตราส่วนความเสี่ยง: ข้อสมมติความเป็นสัดส่วนของฮาซาร์ด เวลารอดชีพเฉลี่ยแบบจำกัดช่วง และข้อมูลนำเข้าแบบจำลอง
  6. ความบังเอิญ อคติ และปัจจัยกวน: เหตุใดความสัมพันธ์ที่พบจึงยังไม่ใช่ผลของการรักษา
  7. พ้นจากพีระมิดหลักฐาน: ระดับความเชื่อมั่นตามแนวทาง GRADE และการเลือกข้อมูลประสิทธิผลเข้าสู่แบบจำลองทางเศรษฐศาสตร์
  8. จากความไวสู่ต้นทุนต่อผู้ป่วยหนึ่งรายที่ตรวจพบ: ค่าทำนายผลบวก ความชุก และเศรษฐศาสตร์ของการคัดกรอง (บทความนี้)
  9. ต้นทุนของใคร ณ ปีใด: มุมมองการวิเคราะห์ ต้นทุนค่าเสียโอกาส การปรับค่าเงินเฟ้อ และการปรับลดค่าตามเวลา
  10. ปีสุขภาวะ ปีสุขภาวะที่สูญเสีย และค่าอรรถประโยชน์: เรากำลังวัดอะไรกันแน่
  11. อัตราส่วนต้นทุนประสิทธิผลส่วนเพิ่มและระนาบต้นทุนประสิทธิผล: ทางเลือกที่ด้อยกว่า ผลประโยชน์สุทธิ และเกณฑ์ 160,000 บาทต่อปีสุขภาวะ
  12. ต้นไม้การตัดสินใจ แบบจำลองมาร์คอฟ และการวิเคราะห์ความไวเชิงความน่าจะเป็น: แบบจำลองแปลงหลักฐานเป็นการตัดสินใจได้อย่างไร
  13. คุ้มค่าไม่ได้แปลว่าจ่ายไหว มีประสิทธิภาพไม่ได้แปลว่าเป็นธรรม: ผลกระทบด้านงบประมาณและความเป็นธรรมทางสุขภาพ
  14. การคัดเลือกพารามิเตอร์ บัญชีต้นทุนอ้างอิง และฐานข้อมูลค่าอรรถประโยชน์เมื่อข้อมูลในประเทศมีจำกัด
  15. การประเมินเทคโนโลยีสุขภาพระยะเริ่มต้น เพดานราคาที่คุ้มค่า และการตัดสินใจชุดสิทธิประโยชน์
  16. การสื่อสารหลักฐานเศรษฐศาสตร์สุขภาพ: จากผลลัพธ์แบบจำลองสู่ข้อเสนอแนะเชิงนโยบาย

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

  • 22 จาก 58 และ 98 จาก 120 ของการศึกษาให้ความไว 37.93% และความจำเพาะ 81.67% สัดส่วนทั้งสองนี้ ไม่ใช่ PPV ของการศึกษา คือสิ่งที่นำไปใช้กับอำเภอได้
  • ที่ความชุก 2% ของอำเภอ PPV เท่ากับ 4.05% เทียบกับ 50.00% ในการศึกษา ขณะที่ความถูกต้องกลับเพิ่มจาก 67.42% เป็น 80.79%
  • LR+ เท่ากับ 2.069 คือการตรวจที่อ่อน ผลบวกเพิ่มโอกาสของชาวบ้านหนึ่งคนได้เพียงจาก 2% เป็น 4.05%
  • การคัดกรองหนึ่งรอบใช้เงิน 5,746,000 บาท หรือ 75,605 บาทต่อผู้ป่วยหนึ่งรายที่พบ และ 62.55% ของเงินนี้จ่ายให้สัญญาณเตือนลวง
  • การพบผู้ป่วยไม่ใช่การช่วยผู้ป่วย ที่เกณฑ์ 5% ของคณะกรรมการ ประโยชน์สุทธิของเครื่องมือคือ −18.7 ต่อผู้ใหญ่ 10,000 คน แย่กว่าการไม่คัดกรองเลย

อ่านต่อในวิกิ: อุบัติการณ์ ความชุก และตัวหารที่ถูกต้อง: ระบาดวิทยาเบื้องหลังต้นทุนความเจ็บป่วยและแบบจำลองมาร์คอฟ · พ้นจากพีระมิดหลักฐาน: ระดับความเชื่อมั่นตามแนวทาง GRADE และการเลือกข้อมูลประสิทธิผลเข้าสู่แบบจำลองทางเศรษฐศาสตร์ · อัตราส่วนต้นทุนประสิทธิผลส่วนเพิ่มและระนาบต้นทุนประสิทธิผล: ทางเลือกที่ด้อยกว่า ผลประโยชน์สุทธิ และเกณฑ์ 160,000 บาทต่อปีสุขภาวะ · ต้นไม้การตัดสินใจ แบบจำลองมาร์คอฟ และการวิเคราะห์ความไวเชิงความน่าจะเป็น: แบบจำลองแปลงหลักฐานเป็นการตัดสินใจได้อย่างไร · Diagnostic Indices: Sensitivity, Specificity, Predictive Values, and Beyond · ทำไม Sensitivity จึงไม่ใช่ Kappa: Performance vs Agreement

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

ความคิดเห็น

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

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