ต้นไม้การตัดสินใจ แบบจำลองมาร์คอฟ และการวิเคราะห์ความไวเชิงความน่าจะเป็น: แบบจำลองแปลงหลักฐานเป็นการตัดสินใจได้อย่างไร

On this page
อ่านฉบับภาษาอังกฤษ (English version)
บทคัดย่อ
คณะกรรมการของโรงพยาบาลอำเภอได้รับรายงานว่าการรักษาเชิงป้องกันแบบใหม่ C ให้ปีสุขภาวะ (quality-adjusted life year, QALY) 6.00 ปีต่อผู้ป่วยตลอดชีวิตด้วยต้นทุน 250,000 บาท เทียบกับ 5.00 ปีด้วยต้นทุน 100,000 บาทของการดูแลตามปกติ แต่การทดลองที่อยู่เบื้องหลัง C ใช้เวลาเพียงหนึ่งปี บทความนี้เปิดดูแบบจำลองที่เปลี่ยนหนึ่งปีนั้นให้เป็นทั้งชีวิต ต้นไม้การตัดสินใจตีราคาปีแรก โดยนำโอกาสของแต่ละผลลัพธ์คูณต้นทุนหรือสุขภาพของผลลัพธ์นั้นแล้วรวมกัน ถ้าดูเพียงหนึ่งปี C จะแพงเกือบหนึ่งล้านบาทต่อ QALY เพราะประโยชน์ของ C มาในปีหลัง ๆ แบบจำลองจึงติดตามคน 1,000 คนที่ย้ายระหว่างสบายดี ป่วย และเสียชีวิตปีละครั้ง จนเสียชีวิตครบทุกคน ซึ่งได้ตัวเลขชุดเดียวกับที่คณะกรรมการเห็น การเปลี่ยนข้อมูลนำเข้าทีละตัวแสดงว่าอัตราส่วนความเสี่ยง (risk ratio) จากการทดลองเป็นตัวตัดสินคำตอบ และการรันแบบจำลองซ้ำ 1,000 ครั้งโดยสุ่มข้อมูลนำเข้าสองตัวที่ไม่แน่นอนที่สุด ทำให้ C นำใน 542 จาก 1,000 การรัน หรือ 54.2% คำตอบจึงเป็นสัดส่วน ไม่ใช่ตัวเลขเดียว
ตัวเลขตลอดชีวิตมาจากไหน
คณะกรรมการของโรงพยาบาลอำเภอแห่งหนึ่งต้องตัดสินใจว่าจะสนับสนุน C ซึ่งเป็นการรักษาเชิงป้องกันแบบใหม่สำหรับผู้ใหญ่ที่เป็นโรคเรื้อรัง หรือจะคงการดูแลตามปกติ (A) ไว้ รายงานของนักวิเคราะห์บอกว่าตลอดชีวิตของผู้ป่วยหนึ่งคน A มีต้นทุน 100,000 บาท และให้ 5.00 QALY ส่วน C มีต้นทุน 250,000 บาท และให้ 6.00 QALY ปีสุขภาวะ (quality-adjusted life year, QALY) คือปีชีวิตที่ถ่วงน้ำหนักด้วยคุณภาพ ตั้งแต่ 1 สำหรับสุขภาพสมบูรณ์ถึง 0 สำหรับการเสียชีวิต ปีสุขภาวะ ปีสุขภาวะที่สูญเสีย และค่าอรรถประโยชน์: เรากำลังวัดอะไรกันแน่
ดังนั้น C ซื้อ QALY ที่เพิ่ม 1.00 ปีด้วยเงินที่เพิ่ม 150,000 บาท คิดเป็นราคา 150,000 บาทต่อ QALY ที่เพิ่ม ต่ำกว่าเพดาน 160,000 บาทของคณะกรรมการ เพดาน 160,000 บาทต่อ QALY ของคณะกรรมการนี้เรียกอีกชื่อหนึ่งว่าเกณฑ์ (threshold)
ตีค่า QALY ที่เพิ่มด้วยเกณฑ์นี้ แล้วลบต้นทุนที่เพิ่ม จะได้ 160,000 × 1.00 − 150,000 = 10,000 บาท ค่านี้คือผลประโยชน์สุทธิในรูปตัวเงินส่วนเพิ่ม (incremental net monetary benefit, INMB) ค่าที่เป็นบวกแปลว่าต้นทุนที่เพิ่มคุ้มที่จะจ่าย เราจะเรียก 10,000 บาทนี้ว่าความได้เปรียบของ C อ่านบทเรียนเต็มได้ที่บทความเรื่อง ICER และผลประโยชน์สุทธิ
การทดลองที่อยู่เบื้องหลัง C ติดตามผู้ป่วยเพียงหนึ่งปี ผู้ป่วยที่ได้การดูแลตามปกติ 13 จาก 60 คน เกิดภาวะแทรกซ้อนที่การรักษานี้ป้องกัน คิดเป็น 21.67% เทียบกับ 8 จาก 66 คนที่ได้ C คิดเป็น 12.12%
กรรมการคนหนึ่งจึงถามสองคำถาม ตัวเลขตลอดชีวิตมาจากไหน ในเมื่อไม่มีใครถูกติดตามทั้งชีวิต และอัตราส่วนความเสี่ยง (risk ratio) 0.56 ของการทดลอง ตามช่วงความเชื่อมั่น 95% อาจอยู่ที่ใดก็ได้ตั้งแต่ 0.25 ถึง 1.26 แล้วความได้เปรียบ 10,000 บาทของ C นั้นแน่นอนแค่ไหน
ทั้งสองคำถามมีคำตอบเดียวกัน คือแบบจำลอง ทางลัดที่พบบ่อยคือมองผลของแบบจำลองเป็นตัวเลขตายตัวตัวเดียว บทความนี้แสดงว่าตัวเลขนั้นมาจากไหนและขยับได้แค่ไหน ด้วยต้นไม้การตัดสินใจสำหรับปีแรก การติดตามผู้ป่วยกลุ่มเดียวทีละปีไปตลอดชีวิต และการรันแบบจำลองซ้ำโดยสุ่มข้อมูลนำเข้าที่ไม่แน่นอนที่สุด
ปีแรกในรูปต้นไม้การตัดสินใจ
อ่านก่อนในเว็บไซต์นี้ บทความเหล่านี้สอนอย่างครบถ้วนว่าสร้างต้นไม้การตัดสินใจทีละขั้นอย่างไร และเมื่อใดต้นไม้จึงเป็นโครงสร้างที่เหมาะ หัวข้อนี้เก็บไว้เฉพาะปีแรกของกรณีคณะกรรมการ
- สร้างแผนภูมิต้นไม้การตัดสินใจทีละขั้น: ตามรอยผลลัพธ์ ต้นทุน และสุขภาพ
- การเลือกแบบจำลองเพื่อการตัดสินใจ: ให้เส้นทางทางคลินิกกำหนดโครงสร้าง
เริ่มจากสิ่งที่การทดลองเห็น คือหนึ่งปี ภายในหนึ่งปี ผู้ป่วยหนึ่งคนอาจเกิดเหตุการณ์ได้สามอย่าง คือยังสบายดี เกิดภาวะแทรกซ้อน หรือเสียชีวิตจากสาเหตุอื่น ตารางชีพ (life table) ของคนวัยนี้แสดงว่า 6.5% เสียชีวิตจากสาเหตุอื่นในแต่ละปี ไม่ว่าจะได้การรักษาใด เมื่อดูแลตามปกติ 21.67% เกิดภาวะแทรกซ้อน จึงมี 71.83% ที่ยังสบายดี เมื่อได้ C มี 12.12% ที่เกิดภาวะแทรกซ้อน จึงมี 81.38% ที่ยังสบายดี
ผลลัพธ์แต่ละอย่างมีต้นทุนและค่าทางสุขภาพของปีนั้น การศึกษาความพึงพอใจของผู้ป่วยต่อสภาวะสุขภาพให้น้ำหนักคุณภาพแก่ปีแต่ละแบบ เรียกว่าค่าอรรถประโยชน์ (utility) คือ 0.80 QALY สำหรับปีที่สบายดี และ 0.50 สำหรับปีที่มีภาวะแทรกซ้อน เมื่อได้ C ปีที่สบายดีมีค่ายาตามราคา 37,800 บาทต่อปีด้วย และบัญชีต้นทุนของโรงพยาบาลให้ค่าดูแลภาวะแทรกซ้อนปีละ 16,900 บาท การเสียชีวิตไม่เพิ่มต้นทุนและไม่เพิ่มสุขภาพ และต้นทุนที่ทั้งสองทางเลือกมีเหมือนกันไม่ถูกนับ ปีที่สบายดีของการดูแลตามปกติจึงมีต้นทุน 0
ต้นทุนคาดหมายของผู้ป่วยหนึ่งคนได้จากการนำต้นทุนของแต่ละผลลัพธ์คูณโอกาสของผลลัพธ์นั้นแล้วรวมกัน สำหรับการดูแลตามปกติคือ 21.67% × 16,900 = 3,662 บาท เพราะอีกสองกิ่งไม่มีต้นทุน สำหรับ C คือ 81.38% × 37,800 + 12.12% × 16,900 = 32,810 บาท สุขภาพคิดแบบเดียวกัน 71.83% × 0.80 + 21.67% × 0.50 = 0.683 QALY สำหรับการดูแลตามปกติ และ 0.712 สำหรับ C
ภาพนี้เรียกว่าต้นไม้การตัดสินใจ (decision tree) [6] มีสี่เหลี่ยมแทนการเลือก วงกลมแทนจุดที่โอกาสเป็นตัวกำหนด และผลลัพธ์ที่ปลายแต่ละกิ่ง การคำนวณจากปลายกิ่งย้อนกลับมาที่วงกลมเรียกว่าการคำนวณย้อนกลับ (rolling back) ซึ่งมีกฎเพียงบรรทัดเดียว โดย p คือโอกาสของกิ่ง และ V คือผลลัพธ์ของกิ่งนั้น ซึ่งเป็นต้นทุนหรือ QALY ก็ได้
$$E[V]=\sum_k p_k\,V_k$$
ทำไมหนึ่งปีจึงไม่พอ
ถ้าอ่านต้นไม้นี้เป็นคำตอบทั้งหมด C จะดูไม่มีทางคุ้ม ในปีที่ 1 C แพงกว่า 29,148 บาทต่อผู้ป่วย และได้เพิ่มเพียง 0.029 QALY คิดเป็นเกือบหนึ่งล้านบาทต่อ QALY ที่เพิ่ม สูงกว่าเพดานของคณะกรรมการเกินหกเท่า
ต้นไม้ไม่ได้ผิด แต่สั้นเกินไป C คุ้มค่าเพราะป้องกันภาวะแทรกซ้อนได้ และภาวะแทรกซ้อนไม่ได้จบในปีเดียว ผู้ป่วยยังป่วยต่อ ต้องได้รับการดูแลทุกปีหลังจากนั้น และเสียชีวิตเร็วขึ้น ต้นไม้จะต้องมีทางแยกใหม่ทุกปีของชีวิตผู้ป่วยแต่ละคน ภาพจึงใหญ่ขึ้นทุกปีที่ครอบคลุม วิธีที่เรียบร้อยกว่าคือเลิกตามผู้ป่วยทีละคนลงไปทุกกิ่ง แล้วติดตามทั้งกลุ่มแทน
# The first year as a decision tree: each branch's chance times its cost or health, added up.
f <- function(x, d = 0) formatC(x, format = "f", digits = d, big.mark = ",")
p_sick <- c(A = 13 / 60, C = 8 / 66) # complication within the year, from the trial
p_well <- 1 - p_sick - 0.065 # 6.5% die of other causes; the rest stay well
cost <- p_well * c(0, 37800) + p_sick * 16900 # C's drug while well; a year of complication care
qaly <- p_well * 0.80 + p_sick * 0.50 # a death adds no cost and no health
cat("Stay well (%): A", f(100 * p_well[1], 2), " C", f(100 * p_well[2], 2), "\n")
cat("Complication (%): A", f(100 * p_sick[1], 2), " C", f(100 * p_sick[2], 2), "\n")
cat("Risk ratio, C over A:", f(p_sick[2] / p_sick[1], 2), "\n")
cat("Expected cost per patient (THB): A", f(cost[1]), " C", f(cost[2]), "\n")
cat("Expected QALYs per patient: A", f(qaly[1], 3), " C", f(qaly[2], 3), "\n")
cat("C minus A: cost (THB)", f(diff(cost)), " QALYs", f(diff(qaly), 3), "\n")
Stay well (%): A 71.83 C 81.38
Complication (%): A 21.67 C 12.12
Risk ratio, C over A: 0.56
Expected cost per patient (THB): A 3,662 C 32,810
Expected QALYs per patient: A 0.683 C 0.712
C minus A: cost (THB) 29,148 QALYs 0.029
คนกลุ่มเดียว สามสถานะ ปีละหนึ่งก้าว
อ่านก่อนในเว็บไซต์นี้ บทความนี้สอนอย่างครบถ้วนว่าสัดส่วนของหนึ่งก้าวได้มาจากอัตราอย่างไร และทำไมความยาวของก้าวต้องอยู่ในการคำนวณ บทเรียนเต็มเรื่องการย้ายคนทั้งกลุ่มระหว่างสถานะอยู่ในลิงก์ใต้ชื่อของแบบจำลองด้านล่าง หัวข้อนี้เก็บไว้เฉพาะคน 1,000 คนของคณะกรรมการ
ให้คน 1,000 คนอยู่ในสถานะใดสถานะหนึ่งจากสามสถานะ คือสบายดี ป่วย หรือเสียชีวิต แล้วปีละครั้งย้ายคนในแต่ละสถานะไปอีกสถานะตามสัดส่วนที่กำหนด สัดส่วนเหล่านี้คือโอกาสในต้นไม้ จากสบายดี คนที่ได้การดูแลตามปกติป่วย 21.67% เสียชีวิตจากสาเหตุอื่น 6.5% และอยู่ต่อ 71.83% จากป่วย 13% เสียชีวิตในแต่ละปี ซึ่งเป็นสัดส่วนการเสียชีวิตต่อปีในการศึกษาแบบติดตามผู้ป่วยหลังเกิดภาวะแทรกซ้อน (cohort study) และ 87% ป่วยต่อ ไม่มีใครหายป่วย และไม่มีใครออกจากสถานะเสียชีวิต
สัดส่วนเหล่านี้เป็นโอกาสต่อหนึ่งก้าวที่ยาวหนึ่งปี ไม่ใช่อัตรา อัตรานับจำนวนเหตุการณ์ต่อเวลาที่ติดตามรวม (person-time) ส่วนสัดส่วนของหนึ่งก้าวได้มาจากอัตราโดยคงความยาวของก้าวไว้ในการคำนวณ ตัวเลข 6.5% ต่อปีจากตารางชีพตรงกับอัตราการเสียชีวิต 0.0672 ต่อคน-ปี เพราะ $1-e^{-0.0672}=0.065$
ก้าวหนึ่งปีเดียวกันนี้กำหนดวิธีใช้ risk ratio ด้วย สัดส่วนจากการทดลองใช้ได้ตามที่เป็นเพียงเพราะการทดลองและก้าวของแบบจำลองยาวหนึ่งปีเท่ากัน ด้วยเหตุผลเดียวกัน risk ratio 0.56 ซึ่งเป็นอัตราส่วนของความเสี่ยงหนึ่งปี จึงคูณกับสัดส่วนหนึ่งปีของการดูแลตามปกติได้โดยตรง ส่วนอัตราส่วนฮาซาร์ด (hazard ratio) ต้องใช้กับอัตรา ไม่ใช่กับสัดส่วน
หลังปีที่ 1 ของการดูแลตามปกติ กลุ่มนี้มีสบายดี 718.3 คน ป่วย 216.7 คน และเสียชีวิต 65.0 คน ซึ่งเท่ากับสามกิ่งของต้นไม้ในรูปจำนวนคน เศษของคนไม่เป็นปัญหา เพราะเป็นจำนวนคาดหมาย คือค่าเฉลี่ยจากกลุ่มแบบนี้หลาย ๆ กลุ่ม ปีที่ 2 เริ่มจากจำนวนเหล่านี้ และขั้นตอนด้านล่างแสดงว่าคนป่วย 216.7 คนกลายเป็น 344.1 คนได้อย่างไร
สองปีแรกของกลุ่มที่ได้การดูแลตามปกติ ทีละขั้น
คน 1,000 คนที่ได้การดูแลตามปกติ นับที่ปลายแต่ละปี แต่ละขั้นใช้เฉพาะจำนวนจากขั้นก่อนหน้า
-
ปีที่ 1
\[ 1000\times 71.83\%=718.3,\ 1000\times 21.67\%=216.7,\ 1000\times 6.5\%=65.0 \]
ทั้ง 1,000 คนเริ่มที่สบายดี ปีที่ 1 จึงแยกคนแบบเดียวกับต้นไม้
-
ปีที่ 2 ป่วย
\[ 216.7\times 87\%+718.3\times 21.67\%=188.5+155.6=344.1 \]
คนป่วยที่ยังป่วยต่อ บวกคนสบายดีที่ป่วยในปีนี้
-
ปีที่ 2 สบายดีและเสียชีวิต
\[ 718.3\times 71.83\%=516.0,\ 65.0+718.3\times 6.5\%+216.7\times 13\%=139.9 \]
คนสบายดีที่ยังสบายดี และคนที่เสียชีวิตแล้ว บวกผู้เสียชีวิตปีนี้จากทั้งสองสถานะ
-
QALY ต่อคน
\[ \frac{718.3\times 0.80+216.7\times 0.50}{1000}=0.683,\ \frac{516.0\times 0.80+344.1\times 0.50}{1000}=0.585 \]
จำนวนคนในแต่ละสถานะของแต่ละปีคูณค่าอรรถประโยชน์ของสถานะนั้น แล้วหารด้วย 1,000
ผลลัพธ์: ปีที่ 1 ได้ 0.683 QALY ต่อคน เท่ากับต้นไม้ และปีที่ 2 ได้ 0.585 เพราะคนสบายดีเหลือน้อยลง แบบจำลองจะก้าวแบบนี้ต่อไปจนทุกคนเสียชีวิต
# 1,000 people start Well and move once a year by the shares in each row; counted at year end.
f <- function(x, d = 1) formatC(x, format = "f", digits = d, big.mark = ",")
p_sick <- 13 / 60 # usual care: the trial's one-year complication risk
move <- rbind(c(1 - p_sick - 0.065, p_sick, 0.065), # from Well: stay, fall sick, die
c(0, 0.87, 0.13), # from Sick: stay sick, die
c(0, 0, 1)) # Dead stays dead
utility <- c(0.80, 0.50, 0)
year1 <- c(1000, 0, 0) %*% move; year2 <- year1 %*% move
cat("Year 1, Well Sick Dead:", f(year1), "\n")
cat("Year 2, Well Sick Dead:", f(year2), "\n")
cat("Year 2 Sick = still sick + newly sick:", f(year1[2] * 0.87), "+", f(year1[1] * p_sick), "\n")
cat("QALYs per person, years 1, 2:", f(c(year1 %*% utility, year2 %*% utility) / 1000, 3), "\n")
cat("Death rate behind the 6.5% yearly share (per person-year):", f(-log(1 - 0.065), 4), "\n")
Year 1, Well Sick Dead: 718.3 216.7 65.0
Year 2, Well Sick Dead: 516.0 344.1 139.9
Year 2 Sick = still sick + newly sick: 188.5 + 155.6
QALYs per person, years 1, 2: 0.683 0.585
Death rate behind the 6.5% yearly share (per person-year): 0.0672
ชื่อในชื่อเรื่อง: แบบจำลองมาร์คอฟแบบกลุ่มประชากร (Markov cohort model)
ชื่อเรื่องของบทความนี้มีคำว่าแบบจำลองมาร์คอฟ (Markov model) ซึ่งคือการติดตามกลุ่มคนที่ย้ายระหว่างสถานะสุขภาพไม่กี่สถานะทีละรอบ ในตัวอย่างหลักของชุดบทความ จาก 1,000 คนที่เริ่มสุขภาพดี รอบแรกมี 800 คนยังสุขภาพดี 150 คนป่วย และ 50 คนเสียชีวิต อ่านบทเรียนเต็มได้ที่ สร้างแบบจำลองมาร์คอฟแบบกลุ่มประชากรทีละขั้น: ติดตามประชากรผ่านเวลา
กฎที่เป็นหัวใจของแบบจำลองนี้คือกฎที่ใช้ข้างบน คือคนจะไปสถานะใดต่อขึ้นกับสถานะที่อยู่ตอนนี้เท่านั้น ไม่ขึ้นกับว่ามาถึงสถานะนี้อย่างไร [1, 2] กลุ่มคนที่แบบจำลองติดตามเรียกว่ากลุ่มประชากร (cohort) และการก้าวแต่ละครั้งเรียกว่ารอบ (cycle) แบบจำลองของคณะกรรมการจึงเป็นแบบจำลองมาร์คอฟแบบกลุ่มประชากรที่มีรอบยาวหนึ่งปี
บทความภาษาอังกฤษในเว็บไซต์นี้ที่วางต้นไม้การตัดสินใจกับแบบจำลองชนิดนี้ไว้เทียบกัน
# The series' own example of one cycle: 1,000 people start healthy and move by one row of shares.
start <- 1000
row <- c(healthy = 0.80, sick = 0.15, dead = 0.05) # from Healthy: stay, fall sick, die
cat("People who start healthy:", start, "\n")
cat("Still healthy after the first cycle:", start * row[["healthy"]], "\n")
cat("Fallen sick in the first cycle:", start * row[["sick"]], "\n")
cat("Died in the first cycle:", start * row[["dead"]], "\n")
People who start healthy: 1000
Still healthy after the first cycle: 800
Fallen sick in the first cycle: 150
Died in the first cycle: 50
รวมทั้งชีวิต
ก้าวต่อไปเรื่อย ๆ 100 ปี จนทุกคนเสียชีวิต แล้วรวมจำนวนปีที่แต่ละคนอยู่ในแต่ละสถานะ การดูแลตามปกติได้สบายดี 2.55 ปีและป่วย 5.92 ปีต่อคน ส่วน C ได้สบายดี 4.37 ปีและป่วย 5.01 ปี
มีทางลัดที่คิดด้วยมือได้ตัวเลขเดียวกัน คนที่อยู่ในสถานะสบายดีจะอยู่ต่อเฉลี่ย 71.83 ÷ (21.67 + 6.5) = 2.55 ปี คือโอกาสอยู่ต่อในแต่ละปีหารด้วยโอกาสออกในแต่ละปี ในคนที่ออกจากสบายดี สัดส่วน 21.67 ÷ (21.67 + 6.5) ไปป่วย แต่ละคนถูกนับเป็นป่วยที่ปลายปีที่เริ่มป่วย แล้วอยู่ต่ออีก 87 ÷ 13 ปี จึงได้ 21.67 ÷ (21.67 + 6.5) × (1 + 87 ÷ 13) = 5.92 สำหรับ C ขั้นตอนเดียวกันให้ 81.38 ÷ (12.12 + 6.5) = 4.37 และ 5.01
จากนั้นตีค่าปีเหล่านั้น การดูแลตามปกติได้ 2.55 × 0.80 + 5.92 × 0.50 = 5.00 QALY และมีต้นทุน 5.92 × 16,900 = 100,000 บาทเมื่อปัดเป็นหลัก 1,000 C ได้ 4.37 × 0.80 + 5.01 × 0.50 = 6.00 QALY และมีต้นทุน 4.37 × 37,800 + 5.01 × 16,900 = 250,000 บาทเมื่อปัดเป็นหลัก 1,000
นี่คือตัวเลขชุดที่คณะกรรมการเห็น QALY ที่ C ได้เพิ่มมาจากปีที่สบายดีมากขึ้น และ C แพงกว่าเพราะแต่ละปีนั้นมีค่ายา ความได้เปรียบของ C คือ 160,000 × 1.00 − 150,000 = 10,000 บาท
| การดูแลตามปกติ A | การรักษาใหม่ C | |
|---|---|---|
| ปีที่สบายดี | 2.55 | 4.37 |
| ปีที่ป่วย | 5.92 | 5.01 |
| QALY | 5.00 | 6.00 |
| ต้นทุน ปัดเป็นหลัก 1,000 บาท | 100,000 | 250,000 |
# Run each option's group of 1,000 for 100 years, until all have died, and add up the years.
f <- function(x, d = 0) formatC(x, format = "f", digits = d, big.mark = ",")
years_in <- function(p_sick, m = c(1000, 0, 0), total = 0) { # m: Well, Sick, Dead at the start
move <- rbind(c(1 - p_sick - 0.065, p_sick, 0.065), c(0, 0.87, 0.13), c(0, 0, 1))
for (t in 1:100) { m <- m %*% move; total <- total + m }; total / 1000 } # years per person
a <- years_in(13 / 60); c_ <- years_in(8 / 66) # A usual care; C, from the trial's risks
qaly <- c(sum(a * c(0.80, 0.50, 0)), sum(c_ * c(0.80, 0.50, 0)))
cost <- c(sum(a * c(0, 16900, 0)), sum(c_ * c(37800, 16900, 0)))
cat("Well and sick years per person: A", f(a[1:2], 2), " C", f(c_[1:2], 2), "\n")
cat("QALYs: A", f(qaly[1], 2), " C", f(qaly[2], 2), "\n")
cat("Cost, nearest 1,000 THB: A", f(round(cost[1], -3)), " C", f(round(cost[2], -3)), "\n")
cat("C minus A: cost", f(round(diff(cost), -3)), " QALYs", f(diff(qaly), 2), "\n")
cat("Lead of C at 160,000 per QALY (THB):", f(round(160000 * diff(qaly) - diff(cost), -3)), "\n")
Well and sick years per person: A 2.55 5.92 C 4.37 5.01
QALYs: A 5.00 C 6.00
Cost, nearest 1,000 THB: A 100,000 C 250,000
C minus A: cost 150,000 QALYs 1.00
Lead of C at 160,000 per QALY (THB): 10,000
สิ่งที่แบบจำลองลืม
อ่านก่อนในเว็บไซต์นี้ บทความเหล่านี้สอนอย่างครบถ้วนว่าเมื่อใดแบบจำลองต้องจำว่าคนป่วยมานานเท่าใด และควรนับจำนวนคนตอนใดของแต่ละปี หัวข้อนี้เก็บไว้เฉพาะผลของกฎทั้งสองต่อตัวเลขของคณะกรรมการ
- การเลือกแบบจำลองเพื่อการตัดสินใจ: ให้เส้นทางทางคลินิกกำหนดโครงสร้าง
- สร้างแบบจำลองมาร์คอฟแบบกลุ่มประชากรทีละขั้น: ติดตามประชากรผ่านเวลา
กฎที่ว่าสถานะปัจจุบันเท่านั้นที่สำคัญเป็นข้อจำกัดหลักของแบบจำลองด้วย ในแบบจำลองนี้ ผู้ป่วยที่อยู่ในปีแรกของภาวะแทรกซ้อน กับผู้ป่วยที่อยู่ในปีที่สิบ เสียชีวิต 13% ในแต่ละปีเท่ากัน ถ้าปีแรกหลังภาวะแทรกซ้อนเป็นปีที่อันตรายที่สุด แบบจำลองต้องแยกสถานะป่วยเป็นสองสถานะ คือปีแรกที่ป่วยซึ่งทุกคนต้องออกหลังหนึ่งก้าว เรียกว่าสถานะอุโมงค์ (tunnel state) และปีหลัง ๆ ที่ป่วย อีกวิธีหนึ่งคือติดตามผู้ป่วยทีละคนพร้อมประวัติของแต่ละคน [2]
การนับทุกคนที่ปลายปีเป็นทางเลือกหนึ่งเช่นกัน คนที่เสียชีวิตระหว่างปีที่ 1 จะไม่ได้อะไรเลยจากปีนั้น และยา C ที่ทั้ง 1,000 คนเริ่มใช้ตั้งแต่วันแรก ถูกคิดเงินเฉพาะคนที่ยังสบายดีเมื่อถึงปลายปี
การปรับที่ใช้กันทั่วไปคือนับแต่ละปีด้วยค่าเฉลี่ยของต้นปีและปลายปี เหมือนคนย้ายสถานะกลางปี (การปรับครึ่งรอบ หรือ half-cycle correction) ซึ่งเป็นการเฉลี่ยจำนวนคนตอนต้นและตอนท้ายของแต่ละรอบ [3] ตัวอย่างหลักของชุดบทความให้ค่าอรรถประโยชน์ของปีที่สุขภาพดีเป็น 1.0 และของปีที่ป่วยเป็น 0.6 (เป็นค่าของตัวอย่างนั้น ไม่ใช่ 0.80 และ 0.50 ของคณะกรรมการ) จาก 1,000 คนที่เริ่มสุขภาพดี รอบแรกมี 800 คนยังสุขภาพดีและ 150 คนป่วย
ถ้านับที่ปลายรอบ จะได้ 0.800 × 1.0 + 0.150 × 0.6 = 0.890 QALY ต่อคน ถ้านับที่ค่าเฉลี่ยของต้นและปลายรอบ จะได้ (1.000 + 0.800) ÷ 2 × 1.0 + 0.150 ÷ 2 × 0.6 = 0.945 QALY ต่อคน อ่านบทเรียนเต็มได้ที่ สร้างแบบจำลองมาร์คอฟแบบกลุ่มประชากรทีละขั้น: ติดตามประชากรผ่านเวลา
ถ้านับแต่ละปีด้วยค่าเฉลี่ยของต้นปีและปลายปี ทุกคนจะได้เวลาในสถานะสบายดีเพิ่มครึ่งปี ทั้งสองทางเลือกจึงได้ QALY เพิ่มเท่ากัน 0.40 (ครึ่งหนึ่งของ 0.80) และ QALY ที่ C ได้มากกว่ายังคงเป็น 1.00 แต่ C ต้องจ่ายค่ายาเพิ่มอีกครึ่งปี คือ 0.5 × 37,800 = 18,900 บาท
ความได้เปรียบ 10,000 บาทของ C จะกลายเป็น 10,000 − 18,900 = −8,900 หรือตามหลังราว 9,000 บาท และต้นทุนต่อ QALY ที่เพิ่มจะขึ้นจาก 150,000 เป็น 168,900 บาท สูงกว่าเพดาน 160,000 ถ้าคณะกรรมการนับแบบนี้ คำตัดสินจะพลิก
คณะกรรมการนับที่ปลายปี ความได้เปรียบจึงเป็น 10,000 บาท ต้นทุนเป็น 150,000 บาทต่อ QALY และทุกการรันในบทความนี้ใช้การนับแบบเดียวกัน กฎการนับจึงเป็นข้อมูลนำเข้าที่ต้องรายงานพร้อมผลลัพธ์ และเครื่องมือโต้ตอบด้านบนให้ลองเปลี่ยนเป็นการนับที่ต้นปี หรือค่าเฉลี่ยของต้นปีและปลายปี
# The series' own example, first cycle: 1,000 start healthy; 800 stay healthy, 150 fall sick.
f <- function(x, d) formatC(x, format = "f", digits = d)
w <- c(healthy = 1.0, sick = 0.6) # that example's weights, not the committee's
start <- c(1000, 0) / 1000; end <- c(800, 150) / 1000 # shares at the cycle's start and end
cat("Weights of a healthy and a sick year:", f(w, 1), "\n")
cat("Shares at the start of the cycle, healthy and sick:", f(start, 3), "\n")
cat("Shares at the end of the cycle, healthy and sick:", f(end, 3), "\n")
cat("QALYs per person, counted at the end:", f(sum(end * w), 3), "\n")
cat("QALYs per person, average of start and end count:", f(sum((start + end) / 2 * w), 3), "\n")
Weights of a healthy and a sick year: 1.0 0.6
Shares at the start of the cycle, healthy and sick: 1.000 0.000
Shares at the end of the cycle, healthy and sick: 0.800 0.150
QALYs per person, counted at the end: 0.890
QALYs per person, average of start and end count: 0.945
# Count each year at its end, or at the average of its start and end; all 1,000 start Well.
f <- function(x, d = 0) formatC(x, format = "f", digits = d, big.mark = ",")
yrs <- function(p) c((1 - p - 0.065) / (p + 0.065), p / (p + 0.065) / 0.13) # Well, Sick years
a <- yrs(13 / 60); c_ <- yrs(8 / 66) # counted at year ends
dq <- round(sum((c_ - a) * c(0.80, 0.50)), 2) # C's extra QALYs, 1.00
dc <- round(c_[1] * 37800 + (c_[2] - a[2]) * 16900, -3); extra <- 0.5 * 37800 # THB
lead <- 160000 * dq - dc - c(0, extra) # C's lead: year ends, average count
cat("QALYs added to each option by the average count:", f(0.5 * 0.80, 2), "\n")
cat("Drug cost added to C by the average count (THB):", f(extra), "\n")
cat("Lead of C (THB), year ends and average:", f(lead), " nearest 1,000:", f(round(lead, -3)), "\n")
cat("Cost per extra QALY (THB), year ends and average:", f(dc / dq), f((dc + extra) / dq), "\n")
QALYs added to each option by the average count: 0.40
Drug cost added to C by the average count (THB): 18,900
Lead of C (THB), year ends and average: 10,000 -8,900 nearest 1,000: 10,000 -9,000
Cost per extra QALY (THB), year ends and average: 150,000 168,900
ข้อมูลนำเข้าแต่ละตัวมาจากไหน
ตัวเลขแต่ละตัวที่แบบจำลองใช้มาจากคนละแหล่งตามที่ตารางแสดง และหน้าที่ของแบบจำลองคือเชื่อมตัวเลขเหล่านี้เข้าด้วยกัน ในตัวอย่างเพื่อการสอนนี้ ข้อมูลนำเข้าทุกตัวสมมติขึ้น ในแบบจำลองจริง ข้อมูลแต่ละตัวต้องมีแหล่งที่มา ค่า และระดับความไม่แน่นอนกำกับไว้ ในตารางแบบนี้
ทางออกจากสถานะสบายดีสองทางมาจากคนละแหล่ง คือการทดลองและตารางชีพ แต่ใช้ผู้ป่วยกลุ่มเดียวกัน คนที่เสียชีวิตจากสาเหตุอื่นไปแล้วจะเกิดภาวะแทรกซ้อนอีกไม่ได้ การแปลงแต่ละทางเป็นสัดส่วนรายปีแยกกันแล้วนำมาบวกกัน อาจทำให้จำนวนคนที่ออกจากสถานะสบายดีในแต่ละปีสูงเกินจริง แบบจำลองที่ละเอียดกว่าจึงรวมอัตราทั้งสองก่อน แล้วจึงแบ่งทางออกรวมนั้นให้แต่ละทาง ตามที่ อัตรา ความน่าจะเป็น และความน่าจะเป็นของการเปลี่ยนสถานะ: คำนวณโดยไม่หลงหน่วยเวลา แสดงไว้
ยา C ใช้เฉพาะช่วงที่ผู้ป่วยสบายดี เมื่อเกิดภาวะแทรกซ้อน การดูแลภาวะแทรกซ้อนจะมาแทน และทุกปีนับเท่ากันไม่ว่าจะอยู่ไกลเพียงใดในอนาคต เพื่อให้ตรงกับตัวเลขของคณะกรรมการ บทความเรื่องต้นทุนแสดงว่าตามปกติปีในอนาคตถูกลดค่าลงอย่างไร
| ข้อมูลนำเข้า | ค่า | แหล่งที่มา |
|---|---|---|
| ภาวะแทรกซ้อนต่อปี การดูแลตามปกติ | 21.67% | การทดลอง: 13 จาก 60 |
| ภาวะแทรกซ้อนต่อปี C | 12.12% | การทดลอง: 8 จาก 66 risk ratio 0.56 |
| เสียชีวิตจากสาเหตุอื่นต่อปี | 6.5% | ตารางชีพของคนวัยนี้ |
| เสียชีวิตต่อปีเมื่อป่วยแล้ว | 13% | การศึกษาแบบติดตามหลังเกิดภาวะแทรกซ้อน |
| ค่าอรรถประโยชน์ของหนึ่งปีที่สบายดี ป่วย | 0.80, 0.50 | การศึกษาความพึงพอใจของผู้ป่วยต่อสภาวะสุขภาพ |
| ค่าดูแลขณะป่วยต่อปี | 16,900 บาท | บัญชีต้นทุนของโรงพยาบาล |
| ค่ายา C ต่อปี ขณะสบายดี | 37,800 บาท | ราคายา |
ตรวจแบบจำลองก่อนใช้
อ่านก่อนในเว็บไซต์นี้ บทความนี้สอนอย่างครบถ้วนว่าทดสอบสมการและโค้ดของแบบจำลองอย่างไร และตัดสินอย่างไรว่าเป็นแบบจำลองที่เหมาะ หัวข้อนี้เก็บไว้เฉพาะการตรวจแบบจำลองของคณะกรรมการ
ก่อนจะเชื่อแบบจำลอง ต้องตรวจสองทาง ทางแรก แบบจำลองสร้างถูกหรือไม่ สัดส่วนในทุกแถวรวมได้ 100% ไม่มีใครกลับจากสถานะเสียชีวิต และปีแรกให้ค่าที่ใช้สร้างแบบจำลองกลับมา คือ 216.7 จาก 1,000 คนป่วยเมื่อดูแลตามปกติ เท่ากับ 21.67% ของการทดลอง และ 12.12% เมื่อได้ C นักสร้างแบบจำลองเรียกการตรวจเหล่านี้ว่าการตรวจสอบ (verification)
ทางที่สอง เป็นแบบจำลองที่เหมาะกับผู้ป่วยกลุ่มนี้หรือไม่ จำนวนปีที่มีชีวิตเทียบกับตารางชีพได้ และผลที่แบบจำลองคาดการณ์เทียบกับข้อมูลที่ไม่ได้ใช้สร้างแบบจำลองได้ เช่น ผู้ป่วยที่ถูกติดตามนานกว่าการทดลอง การตรวจแบบนี้เรียกว่าการประเมินความสมเหตุสมผล (validation) ตั้งแต่ความสมเหตุสมผลเชิงโครงสร้างทางคลินิก ไปจนถึงการทำนายข้อมูลที่ไม่ได้ใช้สร้างแบบจำลอง [2]
ข้อมูลนำเข้าตัวไหนพลิกคำตอบได้
อ่านก่อนในเว็บไซต์นี้ บทความภาษาอังกฤษเรื่องนี้สอนการวิเคราะห์ความไวในการประเมินทางเศรษฐศาสตร์สุขภาพอย่างครบถ้วน ทั้งการเปลี่ยนข้อมูลนำเข้าทีละตัวและการเปลี่ยนทุกตัวพร้อมกัน หัวข้อนี้เก็บไว้เฉพาะข้อมูลนำเข้าของแบบจำลองของคณะกรรมการ
ความได้เปรียบ 10,000 บาท จากต้นทุนตลอดชีวิต 250,000 บาท ถือว่าน้อย วิธีแรกที่ใช้ดูว่าความได้เปรียบนี้เปราะบางแค่ไหน คือเปลี่ยนข้อมูลนำเข้าทีละตัวไปที่ค่าต่ำและค่าสูง ให้ตัวอื่นคงค่าปกติไว้ แล้วรันแบบจำลองอีกครั้ง [4]
ที่ปลายทั้งสองของช่วงจากการทดลอง risk ratio 0.25 ทำให้ C นำ 188,000 บาท และ 1.26 ทำให้ C ตามหลัง 131,000 บาท ราคายา 30,000 หรือ 45,000 บาทต่อปี ทำให้ความได้เปรียบเป็น 44,000 หรือ −21,000 บาท ค่าอรรถประโยชน์ของปีที่ป่วย 0.40 หรือ 0.60 ทำให้เป็น 25,000 หรือ −4,000 บาท ค่าดูแลขณะป่วย 11,000 หรือ 24,000 บาทต่อปี ให้ 5,000 หรือ 17,000 บาท ภาวะแทรกซ้อนที่แพงขึ้นกลับช่วย C เพราะ C ป้องกันมันได้
เมื่อวาดผลเหล่านี้เป็นแท่งโดยให้แท่งที่กว้างที่สุดอยู่บนสุด จะได้แผนภาพทอร์นาโด (tornado diagram) แท่งแสดงความได้เปรียบเป็นบาท ไม่ใช่ต้นทุนต่อ QALY เพราะอัตราส่วนแกว่งแรงและเปลี่ยนเครื่องหมายได้เมื่อ QALY ที่เพิ่มเข้าใกล้ศูนย์ มีเพียง risk ratio ที่เหวี่ยงคำตอบไปไกลทั้งสองด้าน
เมื่อหาค่าที่ทำให้ความได้เปรียบเป็นศูนย์พอดี จะได้ risk ratio 0.59 ซึ่งเรียกว่าค่าที่ทำให้คำตอบพลิก (switching value) C จะนำอยู่ได้ก็ต่อเมื่อ risk ratio ที่แท้จริงต่ำกว่าค่านี้ แต่การทดลองตัดค่าใดตั้งแต่ 0.25 ถึง 1.26 ออกไม่ได้
# Move one input at a time to a low and a high value; C's lead (THB) at 160,000 THB per QALY.
f <- function(x) formatC(round(x, -3), format = "f", digits = 0, big.mark = ",")
lead <- function(rr = 8 / 66 / (13 / 60), drug = 37800, sick = 16900, u_sick = 0.50) {
yrs <- function(p) c((1 - p - 0.065) / (p + 0.065), p / (p + 0.065) / 0.13) # well, sick years
a <- yrs(13 / 60); c_ <- yrs(13 / 60 * rr)
160000 * sum((c_ - a) * c(0.80, u_sick)) - c_[1] * drug - (c_[2] - a[2]) * sick }
cat("Usual values:", f(lead()), "\n")
cat("Risk ratio 0.25 and 1.26:", f(lead(rr = 0.25)), "and", f(lead(rr = 1.26)), "\n")
cat("Drug 30,000 and 45,000:", f(lead(drug = 30000)), "and", f(lead(drug = 45000)), "\n")
cat("Sick care 11,000 and 24,000:", f(lead(sick = 11000)), "and", f(lead(sick = 24000)), "\n")
cat("Sick utility 0.40 and 0.60:", f(lead(u_sick = 0.40)), "and", f(lead(u_sick = 0.60)), "\n")
cat("Risk ratio at a zero lead:", round(uniroot(function(r) lead(rr = r), c(0.3, 1))$root, 2), "\n")
Usual values: 10,000
Risk ratio 0.25 and 1.26: 188,000 and -131,000
Drug 30,000 and 45,000: 44,000 and -21,000
Sick care 11,000 and 24,000: 5,000 and 17,000
Sick utility 0.40 and 0.60: 25,000 and -4,000
Risk ratio at a zero lead: 0.59
รันแบบจำลอง 1,000 ครั้ง
การเปลี่ยนข้อมูลนำเข้าทีละตัวมองไม่เห็นสิ่งที่เกิดเมื่อหลายตัวคลาดพร้อมกัน และมอง 1.26 ว่าเป็นไปได้พอ ๆ กับ 0.56 การทดลองบอกว่าค่าใกล้ 0.56 เป็นไปได้มาก ส่วนค่าใกล้ 1.26 เป็นไปได้แต่เกิดยาก จึงรันแบบจำลองหลายครั้ง และในแต่ละครั้งสุ่มข้อมูลนำเข้าที่ไม่แน่นอน ให้แต่ละค่าปรากฏบ่อยตามที่หลักฐานบอกว่าเป็นไปได้ การวิเคราะห์เต็มรูปแบบสุ่มข้อมูลนำเข้าที่ไม่แน่นอนทุกตัวด้วยวิธีนี้ [4] ในที่นี้เราสุ่มสองตัวที่ไม่แน่นอนที่สุด คือ risk ratio และค่าดูแลขณะป่วยต่อปี ส่วนตัวอื่นคงค่าปกติไว้
สำหรับ risk ratio ค่าที่สุ่มได้อยู่รอบ 0.56 และกระจายจน 95 ใน 100 ตกอยู่ในช่วงของการทดลองเอง คือ 0.25 ถึง 1.26 ราว 1 ใน 40 ต่ำกว่าช่วงนี้ และ 1 ใน 40 สูงกว่า ไม่มีค่าใดต่ำกว่าศูนย์ เพราะ risk ratio ติดลบไม่ได้ สำหรับค่าดูแลขณะป่วยต่อปี ค่าที่สุ่มได้อยู่รอบ 16,900 บาท ไม่ต่ำกว่าศูนย์ และยืดขึ้นไปด้านบนไกลกว่าด้านล่าง เพราะมีผู้ป่วยไม่กี่คนที่ใช้เงินมากกว่าคนอื่นมาก ราว 19 ใน 20 ตกอยู่ระหว่าง 11,000 ถึง 24,000 บาท
การรันครั้งแรกสุ่มได้ risk ratio 0.69 และค่าดูแลขณะป่วย 23,016 บาท C ตามหลัง 28,793 บาท ครั้งที่สองสุ่มได้ 0.36 และ 19,712 บาท C นำ 111,378 บาท ครั้งที่สามสุ่มได้ 0.59 ซึ่งใกล้กับ risk ratio ที่ทำให้ความได้เปรียบของ C หายไป และ 21,313 บาท C นำเพียง 2,244 บาท เพราะได้แรงช่วยจากค่าดูแลขณะป่วยที่แพงขึ้นซึ่ง C ป้องกันได้ ในทุกการรัน สัดส่วนในแถวของสถานะสบายดียังรวมได้ 100% เพราะสัดส่วนคนที่ยังสบายดีคือส่วนที่เหลือหลังหักสัดส่วนภาวะแทรกซ้อนที่สุ่มได้และ 6.5% ที่เสียชีวิตจากสาเหตุอื่น
จากการรัน 1,000 ครั้ง C นำใน 542 ครั้ง หรือ 54.2% ของการรัน สัดส่วนนี้ตอบคำถามที่สองของคณะกรรมการ ในบรรดาสถานการณ์ที่เป็นไปได้ตามหลักฐาน C คุ้มกว่าในเกินครึ่งเพียงเล็กน้อย การรันทั้งหมดใช้การนับที่ปลายปีตามตัวเลขของคณะกรรมการ
วิธีที่เพิ่งเห็นนี้มีชื่อเรียก และมีบทเรียนเต็มในเว็บไซต์นี้ บทความนั้นสอนอย่างครบถ้วนว่าข้อมูลนำเข้าที่ไม่แน่นอนแต่ละตัวได้เส้นโค้งของค่าที่เป็นไปได้อย่างไร ต้องรันกี่ครั้งจึงพอ และสรุปผลการรันอย่างไร หัวข้อนี้เก็บไว้เฉพาะข้อมูลนำเข้าสองตัวที่เราไม่แน่ใจที่สุดในแบบจำลองของคณะกรรมการ
สัดส่วนและค่าเฉลี่ย ไม่ใช่ตัวเลขเดียว
กราฟทางขวานับซ้ำว่ามีกี่การรันที่ C นำ ที่ราคาต่อ QALY ทุกระดับที่คณะกรรมการอาจยอมรับ เส้นจึงสูงขึ้นเมื่อเพดานสูงขึ้น แม้ที่ราคาสูงสุดทางขวา เส้นก็ยังไม่ถึง 100% เพราะในบางการรัน C ให้สุขภาพเพิ่มน้อยมากหรือไม่เพิ่มเลย แต่ยังแพงกว่ามาก จึงไม่มีราคาใดที่ทำให้คุ้ม [5]
การตัดสินใจเองอาศัยความได้เปรียบเฉลี่ยจากทุกการรัน คือ 14,054 บาท ซึ่งสูงกว่า 10,000 บาทที่ได้จากข้อมูลนำเข้าค่าปกติ เพราะความได้เปรียบไม่ได้เปลี่ยนเป็นเส้นตรงตาม risk ratio ค่าที่สุ่มได้ต่ำช่วย C มากกว่าที่ค่าที่สุ่มได้สูงทำร้าย C จึงควรเลือกทางเลือกที่มีความได้เปรียบเฉลี่ยสูงสุด ซึ่งในที่นี้คือ C ที่ 14,054 บาท เพราะค่าเฉลี่ยชั่งว่า C ชนะหรือแพ้มากน้อยเท่าใด ไม่ใช่แค่บ่อยเท่าใด และรายงานสัดส่วนไว้คู่กัน
อย่าใช้ค่าเฉลี่ยของต้นทุนต่อ QALY จาก 1,000 การรันแทน เพราะในการรันที่ C เพิ่มสุขภาพแทบไม่ได้เลย อัตราส่วนนี้พุ่งไปเป็นค่าบวกหรือลบที่ใหญ่มาก ขณะที่ความได้เปรียบยังเป็นจำนวนเงินธรรมดา
การรัน 1,000 ครั้งเป็นเพียงตัวอย่างชุดหนึ่งเช่นกัน ถ้ารันซ้ำด้วยการสุ่มใหม่ 19 ใน 20 ครั้ง สัดส่วนจะอยู่ห่างจาก 54.2% ไม่เกินราว 3.1 จุด การกำหนดตัวเลขตั้งต้นของการสุ่ม ซึ่งเรียกว่า seed ทำให้ได้การรัน 1,000 ครั้งชุดเดิมทุกครั้ง ใครก็ตรวจซ้ำได้
# Rerun the model 1,000 times; each run draws the risk ratio and the yearly cost of sick care.
f <- function(x, d = 0) formatC(x, format = "f", digits = d, big.mark = ",")
set.seed(2026); n <- 1000
rr <- exp(rnorm(n, log(8 / 66 / (13 / 60)), sqrt(1 / 8 - 1 / 66 + 1 / 13 - 1 / 60))) # the trial
care <- rgamma(n, shape = 25, scale = 16900 / 25) # centred on 16,900 THB; never below zero
well_years <- function(p) (1 - p - 0.065) / (p + 0.065) # years in Well, counted at year ends
sick_years <- function(p) p / (p + 0.065) / 0.13 # share who fall sick x 1 / 0.13 years
p <- 13 / 60 * rr; a <- 13 / 60 # C's yearly risk in each run; A's
d_well <- well_years(p) - well_years(a); d_sick <- sick_years(p) - sick_years(a)
lead <- 160000 * (0.80 * d_well + 0.50 * d_sick) - 37800 * well_years(p) - care * d_sick
cat("Runs 1-3: risk ratio", f(rr[1:3], 2), " sick care", f(care[1:3]), " lead", f(lead[1:3]), "\n")
w <- mean(lead > 0); cat("C ahead in", sum(lead > 0), "of", n, "runs:", f(100 * w, 1), "%\n")
cat("Average lead:", f(mean(lead)), " give or take:", f(196 * sqrt(w * (1 - w) / n), 1), "points\n")
Runs 1-3: risk ratio 0.69 0.36 0.59 sick care 23,016 19,712 21,313 lead -28,793 111,378 2,244
C ahead in 542 of 1000 runs: 54.2 %
Average lead: 14,054 give or take: 3.1 points
ชื่อในชื่อเรื่อง: การวิเคราะห์ความไวเชิงความน่าจะเป็น (probabilistic sensitivity analysis)
ชื่อเรื่องของบทความนี้มีคำว่า PSA ด้วย การวิเคราะห์ความไวเชิงความน่าจะเป็น (probabilistic sensitivity analysis, PSA) คือการรันแบบจำลองซ้ำหลายครั้งโดยสุ่มข้อมูลนำเข้าที่ไม่แน่นอนทุกตัวจากการแจกแจงของตัวนั้น ผลจึงเป็นสัดส่วนของการรัน ไม่ใช่ตัวเลขเดียว และแสดงว่าคำตอบไวต่อข้อมูลนำเข้าที่ถูกสุ่มขึ้นมาแค่ไหน [4] ตัวอย่างหลักของชุดบทความเป็นคนละตัวอย่างกับของคณะกรรมการ ในตัวอย่างนั้น เมื่อผลประโยชน์สุทธิส่วนเพิ่มเฉลี่ย 10,000 บาท และส่วนเบี่ยงเบนมาตรฐาน 40,000 บาท จะมีราว 599 จาก 1,000 การรันที่การรักษาคุ้มค่า
เส้นโค้งการยอมรับความคุ้มค่า (cost-effectiveness acceptability curve, CEAC) คือเส้นที่แสดงสัดส่วนของการรันที่การรักษาคุ้มที่สุดในแต่ละระดับเกณฑ์ ในตัวอย่างของชุดบทความ เส้นนี้อยู่ที่ 0.60 ที่ 160,000 บาทต่อ QALY เพราะราว 599 จาก 1,000 การรันเอียงไปทางการรักษา ส่วนเส้นของคณะกรรมการทางขวาของภาพด้านบนอยู่ที่ 54.2% ที่ระดับเดียวกัน [5] บทเรียนเดียวกันสอนทั้งวิธีนี้และเส้นนี้อย่างครบถ้วน การวิเคราะห์ความไวแบบอาศัยความน่าจะเป็น: จากการแจกแจงพารามิเตอร์สู่ CEAC
# The series' own example of 1,000 reruns: the extra net benefit changes from run to run.
f <- function(x, d = 0) formatC(x, format = "f", digits = d, big.mark = ",")
gain_mean <- 10000; gain_sd <- 40000; runs <- 1000 # THB, THB, reruns of the model
share <- pnorm(gain_mean / gain_sd) # share of runs with an extra gain above 0
cat("Extra net benefit, average (THB):", f(gain_mean), "\n")
cat("Extra net benefit, standard deviation (THB):", f(gain_sd), "\n")
cat("Runs that favour the treatment, of", f(runs), "runs:", round(share * runs), "\n")
cat("Height of the acceptability curve at 160,000 THB per QALY:", f(share, 2), "\n")
Extra net benefit, average (THB): 10,000
Extra net benefit, standard deviation (THB): 40,000
Runs that favour the treatment, of 1,000 runs: 599
Height of the acceptability curve at 160,000 THB per QALY: 0.60
สิ่งที่การรัน 1,000 ครั้งแก้ไม่ได้
ทุกการรันใช้แบบจำลองเดิมและการทดลองเดิม ถ้าการทดลองมีอคติ เช่น ผู้ป่วยที่ป่วยหนักกว่าไปอยู่ในกลุ่มดูแลตามปกติ ค่า risk ratio ที่สุ่มทุกครั้งจะอยู่รอบค่าที่ผิด และการรัน 1,000 ครั้งจะให้ภาพที่แม่นยำของคำตอบที่ผิด ความบังเอิญ อคติ และปัจจัยกวน: เหตุใดความสัมพันธ์ที่พบจึงยังไม่ใช่ผลของการรักษา
ถ้าโครงสร้างผิด เช่น ถ้าปีแรกที่ป่วยเป็นปีที่อันตราย การสุ่มมากเท่าใดก็แก้ไม่ได้ ต้องสร้างโครงสร้างอีกแบบแล้วเทียบคำตอบ ดังนั้นให้รายงานข้อมูลนำเข้าพร้อมแหล่งที่มา โครงสร้าง ผลจากการเปลี่ยนทีละตัว และสัดส่วนจากการรันไว้ด้วยกัน เพื่อให้ผู้อ่านตรวจได้ทีละส่วน
สามทางที่แบบจำลองชวนเข้าใจผิด
-
หยุดเมื่อการทดลองหยุด
ปีที่ 1 ปีเดียวตีราคา C ไว้เกือบหนึ่งล้านบาทต่อ QALY เพราะประโยชน์ของ C มาในปีหลัง ๆ
วิธีแก้: รันแบบจำลองให้นานเท่าที่ผลยังอยู่ ในที่นี้คือจนทุกคนเสียชีวิต
-
หยุดอยู่แค่การเปลี่ยนทีละตัว
แท่งของการเปลี่ยนทีละตัวให้น้ำหนัก risk ratio 1.26 เท่ากับ 0.56 และไม่เคยขยับข้อมูลนำเข้าสองตัวพร้อมกัน
วิธีแก้: สุ่มข้อมูลนำเข้าที่ไม่แน่นอนพร้อมกัน ให้แต่ละค่าปรากฏบ่อยตามที่เป็นไปได้ แล้วรันแบบจำลองหลายครั้ง
-
หวังให้การรันแก้อคติ
การรันเพียงกระจายความไม่แน่นอนของการทดลองเอง risk ratio ที่มีอคติก็ยังมีอคติในทุกการรัน
วิธีแก้: ประเมินอคติและโครงสร้างแยกต่างหาก และทดสอบโครงสร้างอื่นเทียบกัน
คำศัพท์ที่เราใช้
- Decision tree (ต้นไม้การตัดสินใจ)
- ภาพของการเลือก (สี่เหลี่ยม) โอกาสที่ตามมา (วงกลม) และผลลัพธ์ที่ปลายแต่ละกิ่ง
- Rolling back (การคำนวณย้อนกลับ)
- การนำผลลัพธ์ของแต่ละกิ่งคูณโอกาสแล้วรวมกัน จากปลายกิ่งย้อนกลับมาที่การเลือก ปีที่ 1 ของการดูแลตามปกติได้ 3,662 บาท
- Expected value (ค่าคาดหมาย)
- ผลลัพธ์เฉลี่ยของทุกกิ่งที่ถ่วงน้ำหนักด้วยโอกาสของแต่ละกิ่ง
- Health state (สถานะสุขภาพ)
- กล่องที่คนหนึ่งคนอยู่ได้ คือสบายดี ป่วย หรือเสียชีวิต
- Cohort and cycle (กลุ่มประชากรและรอบ)
- คน 1,000 คนที่แบบจำลองติดตาม และการก้าวหนึ่งครั้งของแบบจำลอง ในที่นี้คือหนึ่งปี
- Expected count (จำนวนคาดหมาย)
- จำนวนเฉลี่ยในสถานะหนึ่งจากกลุ่มแบบนี้หลาย ๆ กลุ่ม จึงเป็นเศษได้ เช่น 216.7
- Tunnel state (สถานะอุโมงค์)
- สถานะที่ทุกคนต้องออกหลังหนึ่งก้าว เช่น ปีแรกที่ป่วย เพื่อให้แบบจำลองจำได้ว่าคนป่วยมานานเท่าใด
- Verification and validation (การตรวจสอบและการประเมินความสมเหตุสมผล)
- การตรวจสอบ (verification) ดูว่าแบบจำลองสร้างถูก เช่น ปีแรกให้ 21.67% และ 12.12% ตรงกับการทดลองที่ใช้สร้าง ส่วนการประเมินความสมเหตุสมผล (validation) ดูว่าเป็นแบบจำลองที่เหมาะกับผู้ป่วยกลุ่มนี้ โดยเทียบกับข้อมูลที่ไม่ได้ใช้สร้างแบบจำลอง
- One input at a time (เปลี่ยนข้อมูลนำเข้าทีละตัว)
- การรันแบบจำลองซ้ำโดยให้ข้อมูลนำเข้าหนึ่งตัวอยู่ที่ค่าต่ำหรือค่าสูง และตัวอื่นอยู่ที่ค่าปกติ
- Tornado diagram (แผนภาพทอร์นาโด)
- แท่งหนึ่งแท่งต่อข้อมูลนำเข้าหนึ่งตัว แท่งที่กว้างที่สุดอยู่บนสุด แสดงว่าแต่ละตัวขยับผลได้ไกลแค่ไหน
- Switching value (ค่าที่ทำให้คำตอบพลิก)
- ค่าของข้อมูลนำเข้าที่ทำให้สองทางเลือกเท่ากัน ในที่นี้คือ risk ratio 0.59
- Run and seed (การรันและ seed)
- การคำนวณแบบจำลองหนึ่งรอบด้วยข้อมูลนำเข้าที่สุ่มได้หนึ่งชุด ส่วน seed คือตัวเลขตั้งต้นของการสุ่ม seed เดิมจึงให้การรันชุดเดิม
เอกสารอ้างอิง
- Sonnenberg FA, Beck JR. Markov models in medical decision making: a practical guide. Med Decis Making. 1993;13(4):322-338. doi:10.1177/0272989X9301300409
- Siebert U, Alagoz O, Bayoumi AM, Jahn B, Owens DK, Cohen DJ, Kuntz KM. State-transition modeling: a report of the ISPOR-SMDM Modeling Good Research Practices Task Force-3. Med Decis Making. 2012;32(5):690-700. doi:10.1177/0272989X12455463
- Naimark DMJ, Bott M, Krahn M. The half-cycle correction explained: two alternative pedagogical approaches. Med Decis Making. 2008;28(5):706-712. doi:10.1177/0272989X08315241
- Briggs AH, Weinstein MC, Fenwick EAL, Karnon J, Sculpher MJ, Paltiel AD. Model parameter estimation and uncertainty: a report of the ISPOR-SMDM Modeling Good Research Practices Task Force-6. Value Health. 2012;15(6):835-842. doi:10.1016/j.jval.2012.04.014
- Fenwick E, Claxton K, Sculpher M. Representing uncertainty: the role of cost-effectiveness acceptability curves. Health Econ. 2001;10(8):779-787. doi:10.1002/hec.635
- Briggs A, Claxton K, Sculpher M. Decision Modelling for Health Economic Evaluation. Oxford: Oxford University Press; 2006. ISBN 9780198526629
ลำดับการเรียนในชุดนี้
- คู่มือชุดบทความเศรษฐศาสตร์สุขภาพ: อ่านหลักฐานก่อนอ่านต้นทุน
- อุบัติการณ์ ความชุก และตัวหารที่ถูกต้อง: ระบาดวิทยาเบื้องหลังต้นทุนความเจ็บป่วยและแบบจำลองมาร์คอฟ
- รูปแบบการศึกษา แบบจำลองทางสถิติ และเป้าหมายการประมาณค่า: แต่ละรูปแบบการศึกษาประมาณค่าอะไรได้จริง
- อัตราส่วนความเสี่ยง อัตราส่วนออดส์ ผลต่างความเสี่ยง และจำนวนที่ต้องรักษา: ตารางสองคูณสองเดียว คำตอบสี่แบบ
- อัตราส่วนฮาซาร์ดไม่ใช่อัตราส่วนความเสี่ยง: ข้อสมมติความเป็นสัดส่วนของฮาซาร์ด เวลารอดชีพเฉลี่ยแบบจำกัดช่วง และข้อมูลนำเข้าแบบจำลอง
- ความบังเอิญ อคติ และปัจจัยกวน: เหตุใดความสัมพันธ์ที่พบจึงยังไม่ใช่ผลของการรักษา
- พ้นจากพีระมิดหลักฐาน: ระดับความเชื่อมั่นตามแนวทาง GRADE และการเลือกข้อมูลประสิทธิผลเข้าสู่แบบจำลองทางเศรษฐศาสตร์
- จากความไวสู่ต้นทุนต่อผู้ป่วยหนึ่งรายที่ตรวจพบ: ค่าทำนายผลบวก ความชุก และเศรษฐศาสตร์ของการคัดกรอง
- ต้นทุนของใคร ณ ปีใด: มุมมองการวิเคราะห์ ต้นทุนค่าเสียโอกาส การปรับค่าเงินเฟ้อ และการปรับลดค่าตามเวลา
- ปีสุขภาวะ ปีสุขภาวะที่สูญเสีย และค่าอรรถประโยชน์: เรากำลังวัดอะไรกันแน่
- อัตราส่วนต้นทุนประสิทธิผลส่วนเพิ่มและระนาบต้นทุนประสิทธิผล: ทางเลือกที่ด้อยกว่า ผลประโยชน์สุทธิ และเกณฑ์ 160,000 บาทต่อปีสุขภาวะ
- ต้นไม้การตัดสินใจ แบบจำลองมาร์คอฟ และการวิเคราะห์ความไวเชิงความน่าจะเป็น: แบบจำลองแปลงหลักฐานเป็นการตัดสินใจได้อย่างไร (บทความนี้)
- คุ้มค่าไม่ได้แปลว่าจ่ายไหว มีประสิทธิภาพไม่ได้แปลว่าเป็นธรรม: ผลกระทบด้านงบประมาณและความเป็นธรรมทางสุขภาพ
- การคัดเลือกพารามิเตอร์ บัญชีต้นทุนอ้างอิง และฐานข้อมูลค่าอรรถประโยชน์เมื่อข้อมูลในประเทศมีจำกัด
- การประเมินเทคโนโลยีสุขภาพระยะเริ่มต้น เพดานราคาที่คุ้มค่า และการตัดสินใจชุดสิทธิประโยชน์
- การสื่อสารหลักฐานเศรษฐศาสตร์สุขภาพ: จากผลลัพธ์แบบจำลองสู่ข้อเสนอแนะเชิงนโยบาย
ประเด็นสำคัญ
- ต้นไม้การตัดสินใจนำโอกาสของแต่ละกิ่งคูณผลลัพธ์แล้วรวมกัน ปีแรกของการดูแลตามปกติได้ 3,662 บาท และ 0.683 QALY ต่อผู้ป่วย
- หนึ่งปีสั้นเกินไปเมื่อประโยชน์มาทีหลัง ปีที่ 1 ปีเดียวตีราคา C ไว้เกือบหนึ่งล้านบาทต่อ QALY
- การติดตามคน 1,000 คนระหว่างสบายดี ป่วย และเสียชีวิตปีละครั้งจนเสียชีวิตครบ ได้ 5.00 เทียบกับ 6.00 QALY และ 100,000 เทียบกับ 250,000 บาท เมื่อนับที่ปลายปี
- เปลี่ยนข้อมูลนำเข้าทีละตัวเพื่อหาตัวที่พลิกคำตอบ ในที่นี้คือ risk ratio ซึ่งต้องต่ำกว่า 0.59 C จึงจะนำ
- รันแบบจำลอง 1,000 ครั้งโดยสุ่มข้อมูลนำเข้าสองตัวที่ไม่แน่นอนที่สุด C นำ 542 ครั้ง หรือ 54.2% และมีความได้เปรียบเฉลี่ย 14,054 บาท จึงต้องรายงานสัดส่วนและค่าเฉลี่ย ไม่ใช่ตัวเลขเดียว
อ่านต่อในวิกิ: อุบัติการณ์ ความชุก และตัวหารที่ถูกต้อง: ระบาดวิทยาเบื้องหลังต้นทุนความเจ็บป่วยและแบบจำลองมาร์คอฟ · อัตราส่วนฮาซาร์ดไม่ใช่อัตราส่วนความเสี่ยง: ข้อสมมติความเป็นสัดส่วนของฮาซาร์ด เวลารอดชีพเฉลี่ยแบบจำกัดช่วง และข้อมูลนำเข้าแบบจำลอง · พ้นจากพีระมิดหลักฐาน: ระดับความเชื่อมั่นตามแนวทาง GRADE และการเลือกข้อมูลประสิทธิผลเข้าสู่แบบจำลองทางเศรษฐศาสตร์ · อัตราส่วนต้นทุนประสิทธิผลส่วนเพิ่มและระนาบต้นทุนประสิทธิผล: ทางเลือกที่ด้อยกว่า ผลประโยชน์สุทธิ และเกณฑ์ 160,000 บาทต่อปีสุขภาวะ · ความบังเอิญ อคติ และปัจจัยกวน: เหตุใดความสัมพันธ์ที่พบจึงยังไม่ใช่ผลของการรักษา · ต้นทุนของใคร ณ ปีใด: มุมมองการวิเคราะห์ ต้นทุนค่าเสียโอกาส การปรับค่าเงินเฟ้อ และการปรับลดค่าตามเวลา · ปีสุขภาวะ ปีสุขภาวะที่สูญเสีย และค่าอรรถประโยชน์: เรากำลังวัดอะไรกันแน่