Bài 5: Bối cảnh ra quyết định và báo cáo

Đặt kết quả mô hình vào các ngưỡng chi phí-hiệu quả cho Việt Nam, báo cáo theo CHEERS 2022 và tự kiểm tra một báo cáo mô hình

Vì sao bạn nên quan tâm?

Việt Nam chưa có ngưỡng chi phí-hiệu quả chính thức, tức mức chi tối đa chấp nhận được cho mỗi đơn vị sức khỏe có thêm, nên mỗi báo cáo gửi hội đồng đánh giá công nghệ y tế hay cơ quan BHXH tự chọn một con số. Ngưỡng mặc định của khóa học là 1 lần GDP bình quân đầu người năm 2025, tức 125.5 triệu VNĐ cho một QALY (Cục Thống kê (Bộ Tài chính) 2026), bằng khoảng 24 tháng lương tối thiểu vùng I (Chính phủ 2025); ngưỡng thấp theo chi phí cơ hội chỉ bằng một nửa, 62.75 triệu VNĐ. Một kết quả mô hình có thể “đạt” ở ngưỡng này mà “không đạt” ở ngưỡng kia. Bài này giúp bạn trình bày quyết định trên cả dải ngưỡng, nêu điểm đổi chiều, và viết báo cáo mà người ra quyết định kiểm tra được.

Mục tiêu học tập

Sau bài này, bạn có thể:

  1. Giải thích ngưỡng chi phí-hiệu quả theo chi phí cơ hội (opportunity cost) và lý do quy tắc 1–3 lần GDP bình quân đầu người bị phê phán.
  2. Quy các ngưỡng thường gặp trong nghiên cứu Việt Nam về một đơn vị chung (VNĐ/QALY) và trình bày quyết định ở nhiều ngưỡng thay vì một con số.
  3. Dùng bảng kiểm CHEERS 2022 để lập dàn ý báo cáo một đánh giá kinh tế dựa trên mô hình.
  4. Tự rà một báo cáo mô hình cho bối cảnh Việt Nam và dùng code kiểm tra bảng tham số.

Ý chính

  • Ngưỡng chi phí-hiệu quả nên phản ánh chi phí cơ hội: lượng sức khỏe mất đi ở nơi khác khi ngân sách chuyển sang can thiệp mới (Woods và c.s. 2016; Ochalek, Lomas, và Claxton 2018).
  • Quy tắc 1–3 lần GDP bình quân đầu người dễ dùng nhưng thiếu đặc thù quốc gia (Bertram và c.s. 2016) và nhiều khả năng đặt ngưỡng quá cao so với chi phí cơ hội (Marseille và c.s. 2015; Woods và c.s. 2016; Ochalek, Lomas, và Claxton 2018). Ước tính theo chi phí cơ hội cho nước thu nhập thấp và trung bình thường thấp hơn nhiều.
  • Các nghiên cứu gần đây ở Việt Nam dùng nhiều ngưỡng khác nhau, nên khi chưa có ngưỡng chính thức đã được kiểm chứng, hãy trình bày quyết định ở một dải ngưỡng và nêu điểm đổi chiều.
  • Điểm đổi chiều (switching point), tức ngưỡng tại đó chiến lược được chọn đổi sang chiến lược khác, chính là ICER trên đường biên hiệu quả (efficiency frontier); NMB ở nhiều ngưỡng cho chính thông tin ấy dưới dạng dễ đọc.
  • Tỷ lệ chiết khấu 3% của khóa học là thông lệ, nhưng có đề xuất dùng ít nhất 5% cho nước thu nhập thấp và trung bình thấp (Haacker, Hallett, và Atun 2020); hãy phân tích độ nhạy với cả hai mức.
  • CHEERS 2022, bảng kiểm cho báo cáo đánh giá kinh tế y tế, có 28 mục; bốn mục mới về kế hoạch phân tích, tác động phân phối và tham vấn người bệnh (Husereau và c.s. 2022).
  • Báo cáo mô hình ở Việt Nam cần nêu thêm: năm tham chiếu chi phí VNĐ, nguồn chi phí đơn vị (giá hay chi phí), bộ giá trị EQ-5D, nguồn bảng sống, lý do chọn ngưỡng, tỷ lệ tham số minh họa, mã nguồn mở, và ghi chú chủ quyền nếu có bản đồ.

Nội dung

Ngưỡng nghĩa là gì

Can thiệp có ICER (tỷ số chi phí-hiệu quả gia tăng) nhỏ hơn ngưỡng \(\lambda\) thì được coi là đáng đầu tư; tương đương, can thiệp ấy có lợi ích ròng quy ra tiền (NMB) dương, tức sức khỏe có thêm quy ra tiền lớn hơn chi phí tăng thêm: \(\lambda\,\Delta E - \Delta C > 0\). Câu hỏi khó là \(\lambda\) bằng bao nhiêu. Khi ngân sách y tế cố định, tiền chi cho can thiệp mới phải lấy từ dịch vụ khác, và sức khỏe mất đi ở đó là chi phí cơ hội. Vì thế, ngưỡng hợp lý là chi phí để hệ thống “mua” thêm một QALY hay DALY bằng các khoản chi hiện tại, gọi là ngưỡng phía cung (supply-side threshold).

Woods và cộng sự ước tính ngưỡng theo chi phí cơ hội cho nhiều nước: ở Campuchia, ngưỡng nằm trong khoảng 4%–51% GDP bình quân đầu người, ở El Salvador 11%–51% (Woods và c.s. 2016). Ochalek và cộng sự dùng cách tiếp cận khác cho nhiều nước thu nhập thấp và trung bình, và cũng thấy ngưỡng thường thấp hơn 1–3 lần GDP (Ochalek, Lomas, và Claxton 2018). Phần chính của hai bài này không công bố ước tính riêng cho Việt Nam (ước tính theo từng nước của Ochalek nằm ở tệp bổ sung mà chúng tôi chưa mở được); bài học dùng các tỷ lệ trên chỉ để minh họa cỡ độ lớn. Vì thế khóa học dùng 0.5 lần GDP bình quân đầu người (wtp_low trong vn_context()) làm ngưỡng thấp cho phân tích độ nhạy.

Vì sao quy tắc GDP bị phê phán

Quy tắc “dưới 1 lần GDP bình quân đầu người cho mỗi DALY tránh được là rất chi phí-hiệu quả, dưới 3 lần là chi phí-hiệu quả” gắn với WHO-CHOICE và được nhiều nước dùng. Quy tắc này bị phê phán ở hai điểm. Thứ nhất, ngưỡng này dễ đạt đến mức hầu như can thiệp nào có bằng chứng hiệu quả cũng qua được, nên không giúp xếp hạng và không nói gì về khả năng chi trả (Marseille và c.s. 2015). Thứ hai, quy tắc thiếu đặc thù quốc gia, nên một ICER có thể dẫn đến quyết định sai ở nước này mà đúng ở nước khác. Nhóm tác giả WHO đề nghị đọc chi phí-hiệu quả cùng tác động ngân sách và tính khả thi trong một quy trình minh bạch, không dùng một ngưỡng đơn lẻ (Bertram và c.s. 2016). Áp vào phác đồ MDR-TB (lao đa kháng thuốc), ICER dưới 3 lần GDP vẫn chưa cho biết nên tài trợ phác đồ ấy thay cho dịch vụ nào. Quy tắc vẫn phổ biến: trong cơ sở dữ liệu Tufts, 66% nghiên cứu chi phí cho mỗi DALY ở nước thu nhập thấp và trung bình xuất bản 2000–2015 viện dẫn quy tắc này. Trong 60 bài được đọc toàn văn, không bài nào lý giải vì sao quy tắc hợp với nước được nghiên cứu, ngoài việc trích hướng dẫn chung (Leech và c.s. 2018).

Bối cảnh Việt Nam

Từ năm 2018, Bộ Y tế đã yêu cầu đánh giá công nghệ y tế (HTA) với thuốc mới đề nghị đưa vào danh mục bảo hiểm y tế, và khi đó hướng dẫn HTA quốc gia đang được xây dựng (Mai và c.s. 2020). Các phân tích chi phí-hiệu quả công bố gần đây ở Việt Nam dùng những ngưỡng rất khác nhau. Mốc hay gặp nhất là 1 lần GDP bình quân đầu người, nhưng đó là quy ước của người nghiên cứu, không phải ngưỡng do cơ quan quản lý ban hành. Cụ thể, các nghiên cứu dùng 1 lần GDP bình quân đầu người, tương đương US$4,700 mỗi QALY (Ong và c.s. 2026); 3 lần GDP bình quân đầu người (Nguyen và c.s. 2026); 305.7 triệu VNĐ mỗi QALY (Toan và c.s. 2026); và US$12,000 mỗi QALY (Horta và c.s. 2026). Khi các con số khác nhau nhiều lần như vậy, kết luận “đạt chi phí-hiệu quả” phụ thuộc vào lựa chọn ngưỡng nhiều hơn vào mô hình. Cách trung thực là trình bày kết quả ở cả dải ngưỡng, nêu ngưỡng tại đó quyết định đổi chiều, và để người ra quyết định thấy rõ đánh đổi. M03 làm việc này đầy đủ bằng đường cong chấp nhận chi phí-hiệu quả (CEAC).

Tỷ lệ chiết khấu, dùng để quy chi phí và sức khỏe tương lai về giá trị hiện tại, là lựa chọn thứ hai cần lý giải. Mức 3% mỗi năm (giá trị dùng chung của khóa học) thường dùng trong y tế toàn cầu và trong các CEA Việt Nam gần đây (Ong và c.s. 2026), nhưng Haacker và cộng sự lập luận rằng với nước thu nhập thấp và trung bình thấp, tỷ lệ ít nhất 5% phù hợp hơn với tốc độ tăng trưởng kinh tế (Haacker, Hallett, và Atun 2020). Các tác giả trong nước mô tả Việt Nam là nước thu nhập trung bình thấp (Nguyen và c.s. 2026). Ít nhất, hãy chạy cả hai mức.

Báo cáo: CHEERS 2022 và khung tham chiếu

CHEERS 2022 là bảng kiểm 28 mục cho báo cáo đánh giá kinh tế y tế, áp dụng cho cả nghiên cứu dựa trên mô hình (Husereau và c.s. 2022). So với bản 2013, các mục mới gồm kế hoạch phân tích kinh tế y tế, mô tả tác động phân phối (ai được lợi, ai chịu thiệt) và cách tham vấn người bệnh cùng các bên liên quan. Khung tham chiếu iDSI gồm các nguyên tắc về phương pháp và tiêu chuẩn báo cáo cho đánh giá kinh tế ở nước thu nhập thấp và trung bình, và tự mô tả là công cụ hỗ trợ tư duy chứ không thay thế suy xét theo bối cảnh (Wilkinson và c.s. 2016). Khung tham chiếu của Mỹ khuyến nghị kèm bảng liệt kê tác động, để người đọc thấy phân tích đã tính những tác động nào (Sanders và c.s. 2016).

CHEERS nói cần báo cáo gì, chứ không nói làm thế nào cho đúng. Với mô hình dùng đầu vào Việt Nam, bài học đề xuất 12 câu hỏi bổ sung, gắn với các mục CHEERS tương ứng (xem phần thực hành). Câu hỏi cuối cùng áp dụng cho mọi bản đồ Việt Nam trong báo cáo: bản đồ phải thể hiện rõ quần đảo Hoàng Sa thuộc thành phố Đà Nẵng và quần đảo Trường Sa thuộc tỉnh Khánh Hòa.

Thực hành

Nạp tham số của bài, cùng GDP bình quân đầu người, ngưỡng và tỷ lệ chiết khấu từ vn_context(): không module nào tự gõ lại các giá trị này.

if (!isTRUE(l10n_info()[["UTF-8"]])) invisible(Sys.setlocale("LC_CTYPE", "en_US.UTF-8"))
source("../_shared/R/helpers.R")
source("../_shared/R/vn_data.R")   # GDP per capita, thresholds, discount rate: course-wide values
source("code/model.R")
library(ggplot2)
ctx <- vn_context()
pd <- read_params("params/decision.csv")
m <- macro_series(read_params("params/macro.csv"))
yr <- ctx$cost_year
gdp <- ctx$gdp_pc_vnd
disc_high <- param_range(ctx, "disc_rate")[["hi"]]
# A long-lasting benefit used in the discounting example: QALYs per year and number of years
ben_qaly <- 0.05; ben_years <- 20
# Published thresholds do not state a price year in the abstracts: we assume pd$thr_assumed_year
# (an assumption, flagged illustrative), convert USD at that year's rate, and inflate with the
# Vietnamese CPI to the model's cost year, like any other cost (Lesson 2).
thr_year <- pd$thr_assumed_year

Đoạn mã sau quy mọi ngưỡng về VNĐ mỗi QALY của năm tham chiếu chi phí 2025 và sắp xếp từ thấp đến cao. Tóm tắt các nghiên cứu Việt Nam không nêu năm tham chiếu chi phí, nên bài giả định năm 2024 (giả định, đánh dấu minh họa), vì với nghiên cứu của Ong, ngưỡng US$4,700 đúng bằng GDP bình quân đầu người năm 2024 của Cục Thống kê (Cục Thống kê (Bộ Tài chính) 2026). Ngưỡng USD đổi theo tỷ giá năm đó rồi quy về giá 2025 bằng CPI, như mọi chi phí khác (Bài 2). Các tỷ lệ mà Woods và cộng sự ước tính là của nước khác, nên áp vào GDP Việt Nam chỉ để minh họa cỡ độ lớn. Kiểm tra: mọi ngưỡng dương, và dòng “1 lần GDP” có bội số GDP đúng bằng 1.

# Candidate thresholds expressed in VND per QALY (VND of the cost year; published values moved
# from their assumed price year with the Vietnamese CPI)
usd_to_cost_year <- function(usd) cost_to_vnd(usd, "USD", thr_year, yr, m, "cpi", "local")
thr <- data.frame(
  label = c(paste(fmt_num(pd$woods_kh_low, 2), "lần GDP (cận dưới, Campuchia)"),
            paste(fmt_num(pd$woods_sv_low, 2), "lần GDP (cận dưới, El Salvador)"),
            paste(fmt_num(ctx$wtp_low / gdp, 2), "lần GDP (ngưỡng thấp của khóa học)"),
            paste(fmt_num(pd$woods_sv_high, 2), "lần GDP (cận trên, hai nước)"),
            "1 lần GDP bình quân đầu người",
            paste0(fmt_usd(pd$thr_ong2026_usd), "/QALY (nghiên cứu Việt Nam)"),
            paste0(fmt_usd(pd$thr_horta2026_usd), "/QALY (nghiên cứu Việt Nam)"),
            paste(fmt_num(pd$thr_toan2026_vnd / 1e6, 1), "triệu VNĐ/QALY (nghiên cứu Việt Nam)"),
            paste(fmt_num(pd$thr_nguyen2026_mult), "lần GDP bình quân đầu người")),
  basis = c("chi phí cơ hội", "chi phí cơ hội", "chi phí cơ hội", "chi phí cơ hội",
            "GDP", "dùng trong nghiên cứu", "dùng trong nghiên cứu", "dùng trong nghiên cứu", "GDP"),
  vnd = c(pd$woods_kh_low * gdp, pd$woods_sv_low * gdp, ctx$wtp_low,
          pd$woods_sv_high * gdp, ctx$wtp, usd_to_cost_year(pd$thr_ong2026_usd),
          usd_to_cost_year(pd$thr_horta2026_usd), inflate(pd$thr_toan2026_vnd, thr_year, yr, m$vn_cpi),
          pd$thr_nguyen2026_mult * gdp)
)
thr$times_gdp <- thr$vnd / gdp
thr <- thr[order(thr$vnd), ]
thr
                                       label                 basis       vnd
1         0.04 lần GDP (cận dưới, Campuchia)        chi phí cơ hội   5020000
2       0.11 lần GDP (cận dưới, El Salvador)        chi phí cơ hội  13805000
3    0.50 lần GDP (ngưỡng thấp của khóa học)        chi phí cơ hội  62750000
4          0.51 lần GDP (cận trên, hai nước)        chi phí cơ hội  64005000
6        US$4,700/QALY (nghiên cứu Việt Nam) dùng trong nghiên cứu 117334287
5              1 lần GDP bình quân đầu người                   GDP 125500000
7       US$12,000/QALY (nghiên cứu Việt Nam) dùng trong nghiên cứu 299576903
8 305.7 triệu VNĐ/QALY (nghiên cứu Việt Nam) dùng trong nghiên cứu 315818649
9              3 lần GDP bình quân đầu người                   GDP 376500000
  times_gdp
1 0.0400000
2 0.1100000
3 0.5000000
4 0.5100000
6 0.9349346
5 1.0000000
7 2.3870670
8 2.5164833
9 3.0000000
stopifnot(all(thr$vnd > 0), abs(thr$times_gdp[thr$label == "1 lần GDP bình quân đầu người"] - 1) < 1e-12)
# Everyday reading of the course threshold: months of region-I minimum wage per QALY
wtp_in_wage_months <- c(wtp = ctx$wtp, wtp_low = ctx$wtp_low) / ctx$min_wage_region1_month
wtp_in_wage_months
     wtp  wtp_low 
23.63465 11.81733 
spread <- max(thr$vnd) / min(thr$vnd)

GDP bình quân đầu người năm 2025 là 125.5 triệu VNĐ (Cục Thống kê (Bộ Tài chính) 2026). Ngưỡng cao nhất gấp 75 lần ngưỡng thấp nhất trong bảng.

Bây giờ lấy bốn chiến lược minh họa cho người bệnh lao kháng thuốc: A là phác đồ dài hạn, B là phác đồ sáu tháng, C là B cộng hỗ trợ tuân thủ, D là B cộng theo dõi tại bệnh viện (chi phí và QALY đều là giá trị minh họa). Ta dựng đường biên hiệu quả, tức đường nối các chiến lược không bị lấn át. Kiểm tra: còn đúng hai chiến lược trên đường biên.

strategies <- data.frame(
  strategy = c("A: phác đồ dài hạn", "B: phác đồ 6 tháng", "C: B + hỗ trợ tuân thủ",
               "D: B + theo dõi tại bệnh viện"),
  cost = c(pd$s1_cost, pd$s2_cost, pd$s3_cost, pd$s4_cost),
  qaly = c(pd$s1_qaly, pd$s2_qaly, pd$s3_qaly, pd$s4_qaly)
)
fr <- frontier(strategies$strategy, strategies$cost, strategies$qaly)
# A hypothetical extra strategy for Exercise 2 (cost in VND, QALYs)
e_cost <- 58e6; e_qaly <- 14.68
fr
                       strategy    cost effect          status      icer
1            B: phác đồ 6 tháng 5.2e+07  14.60 trên đường biên        NA
2            A: phác đồ dài hạn 6.0e+07  14.20       bị lấn át        NA
3        C: B + hỗ trợ tuân thủ 6.8e+07  14.75 trên đường biên 106666667
4 D: B + theo dõi tại bệnh viện 7.5e+07  14.70       bị lấn át        NA
icer_c <- fr$icer[fr$strategy == "C: B + hỗ trợ tuân thủ"]
stopifnot(sum(fr$status == "trên đường biên") == 2, !is.na(icer_c),
          fr$status[fr$strategy == strategies$strategy[1]] == "bị lấn át",
          fr$status[fr$strategy == strategies$strategy[4]] == "bị lấn át")
# Test on a case with a known answer: C is extendedly dominated (its ICER of 40 against B is
# above the ICER of 10 of D against C), so the frontier is A, B, D with ICERs 10 and 25
known <- frontier(c("A", "B", "C", "D"), c(0, 10, 30, 35), c(0, 1, 1.5, 2))
known
  strategy cost effect          status icer
1        A    0    0.0 trên đường biên   NA
2        B   10    1.0 trên đường biên   10
3        C   30    1.5  lấn át mở rộng   NA
4        D   35    2.0 trên đường biên   25
stopifnot(known$status[known$strategy == "C"] == "lấn át mở rộng",
          all(abs(known$icer[known$status == "trên đường biên"][-1] - c(10, 25)) < 1e-9))

Chiến lược A bị B lấn át (đắt hơn, ít QALY hơn), D bị C lấn át. ICER của C so với B là 106.7 triệu VNĐ mỗi QALY, tức 0.85 lần GDP bình quân đầu người.

Đoạn mã sau chọn chiến lược tốt nhất (NMB lớn nhất) ở từng ngưỡng:

# The decision at each candidate threshold: the strategy with the highest NMB
thr$best <- best_at(strategies$strategy, strategies$cost, strategies$qaly, thr$vnd)
thr[, c("label", "times_gdp", "best")]
                                       label times_gdp                   best
1         0.04 lần GDP (cận dưới, Campuchia) 0.0400000     B: phác đồ 6 tháng
2       0.11 lần GDP (cận dưới, El Salvador) 0.1100000     B: phác đồ 6 tháng
3    0.50 lần GDP (ngưỡng thấp của khóa học) 0.5000000     B: phác đồ 6 tháng
4          0.51 lần GDP (cận trên, hai nước) 0.5100000     B: phác đồ 6 tháng
6        US$4,700/QALY (nghiên cứu Việt Nam) 0.9349346 C: B + hỗ trợ tuân thủ
5              1 lần GDP bình quân đầu người 1.0000000 C: B + hỗ trợ tuân thủ
7       US$12,000/QALY (nghiên cứu Việt Nam) 2.3870670 C: B + hỗ trợ tuân thủ
8 305.7 triệu VNĐ/QALY (nghiên cứu Việt Nam) 2.5164833 C: B + hỗ trợ tuân thủ
9              3 lần GDP bình quân đầu người 3.0000000 C: B + hỗ trợ tuân thủ
switch_point <- icer_c / gdp
# The text states: every opportunity-cost threshold picks B; from the lowest published-study
# threshold (Ong 2026) upwards, C is picked. Guard those statements against changes in inputs.
b_name <- "B: phác đồ 6 tháng"; c_name <- "C: B + hỗ trợ tuân thủ"
opp <- thr$basis == "chi phí cơ hội"
stopifnot(all(thr$best[opp] == b_name),
          abs(min(thr$vnd[thr$best == c_name]) - usd_to_cost_year(pd$thr_ong2026_usd)) < 1)

Mọi ngưỡng theo chi phí cơ hội đều chọn B, còn mọi ngưỡng từ US$4,700 mỗi QALY trở lên chọn C; quyết định đổi chiều tại 0.85 lần GDP. Đó là câu trả lời nên đưa cho người ra quyết định: “C đáng đầu tư nếu hệ thống sẵn lòng trả hơn 106.7 triệu VNĐ cho một QALY”, thay vì “C đạt chi phí-hiệu quả”.

Đoạn mã sau vẽ hiệu NMB của từng chiến lược với B theo ngưỡng. Kiểm tra bằng mắt: các đường cắt nhau đúng tại điểm đổi chiều (nét đứt), và đường của A và D không bao giờ là cao nhất.

wtp_grid <- seq(0, 3.2 * gdp, length.out = 200)
nmb_dat <- do.call(rbind, lapply(seq_len(nrow(strategies)), function(i) {
  data.frame(wtp = wtp_grid, nmb = nmb(strategies$cost[i], strategies$qaly[i], wtp_grid),
             strategy = strategies$strategy[i])
}))
# Show NMB relative to strategy B so the lines are easy to compare
nmb_b <- nmb(pd$s2_cost, pd$s2_qaly, wtp_grid)
nmb_dat$nmb_vs_b <- nmb_dat$nmb - rep(nmb_b, nrow(strategies))
fig_nmb <- ggplot(nmb_dat, aes(wtp / gdp, nmb_vs_b / 1e6, colour = strategy)) +
  geom_line(linewidth = 1) +
  geom_vline(xintercept = switch_point, linetype = "dashed", colour = "grey40") +
  geom_hline(yintercept = 0, colour = "grey60") +
  scale_colour_manual(values = pal_course[1:4], name = NULL) +
  labs(x = "Ngưỡng chi phí-hiệu quả (bội số GDP bình quân đầu người 2025)",
       y = "NMB so với chiến lược B (triệu VNĐ)",
       title = "Quyết định đổi chiều khi ngưỡng vượt ICER của C so với B (giá trị minh họa)") +
  guides(colour = guide_legend(nrow = 2)) +
  theme_course()
save_fig(fig_nmb, "l05-nmb-threshold.png")
Figure 51.1: NMB của từng chiến lược so với B theo ngưỡng (giá trị minh họa). Đường đứt: ICER của C so với B.

Đoạn mã sau đo ảnh hưởng của tỷ lệ chiết khấu lên một lợi ích kéo dài: 0.05 QALY mỗi năm trong 20 năm. Thời điểm chiết khấu cũng là quy ước phải báo cáo (xem M01 về chiết khấu): pv_start chiết khấu đầu mỗi năm (năm đầu không bị chiết khấu), pv_end chiết khấu cuối năm. Kiểm tra: ở 0% cả hai bằng 1 QALY, và cuối năm không bao giờ lớn hơn đầu năm.

# A benefit of ben_qaly QALY a year for ben_years years, valued today at 0%, the course rate and
# the upper rate. Timing is a convention to report: "đầu năm" discounts year 1 by 0 years
# (t = 0..ben_years-1), "cuối năm" by 1 year (t = 1..ben_years).
disc_tab <- data.frame(rate = c(0, ctx$disc_rate, disc_high))
disc_tab$pv_start <- vapply(disc_tab$rate, function(r) sum(ben_qaly * discount_weights(0:(ben_years - 1), r)), numeric(1))
disc_tab$pv_end <- vapply(disc_tab$rate, function(r) sum(ben_qaly * discount_weights(1:ben_years, r)), numeric(1))
disc_tab
  rate pv_start    pv_end
1 0.00 1.000000 1.0000000
2 0.03 0.766190 0.7438737
3 0.05 0.654266 0.6231105
stopifnot(abs(disc_tab$pv_start[1] - ben_qaly * ben_years) < 1e-12, all(disc_tab$pv_end <= disc_tab$pv_start))

Ở 5%, giá trị hiện tại của lợi ích (chiết khấu đầu năm) chỉ còn 0.65 QALY, so với 0.77 ở 3%; chiết khấu cuối năm cho 0.62 và 0.74. Can thiệp có lợi ích đến muộn (dự phòng, kiểm soát kháng thuốc) chịu ảnh hưởng nhiều nhất, vì lợi ích càng xa hiện tại thì càng bị chiết khấu nhiều.

Đoạn mã sau nạp bảng kiểm CHEERS 2022 dưới dạng dữ liệu, để dùng làm dàn ý báo cáo:

cheers <- cheers_items()
table(cheers$section)[unique(cheers$section)]

       Tiêu đề        Tóm tắt     Giới thiệu    Phương pháp        Kết quả 
             1              1              1             18              4 
      Bàn luận Thông tin khác 
             1              2 
stopifnot(nrow(cheers) == 28)
Table 51.1: Các mục của CHEERS 2022 (tên mục rút gọn; xem bài báo gốc cho hướng dẫn chi tiết).
Mục Phần Chủ đề Topic (English)
1 Tiêu đề Tiêu đề Title
2 Tóm tắt Tóm tắt Abstract
3 Giới thiệu Bối cảnh và mục tiêu Background and objectives
4 Phương pháp Kế hoạch phân tích kinh tế y tế Health economic analysis plan
5 Phương pháp Quần thể nghiên cứu Study population
6 Phương pháp Bối cảnh và địa điểm Setting and location
7 Phương pháp Các phương án so sánh Comparators
8 Phương pháp Quan điểm phân tích Perspective
9 Phương pháp Khung thời gian Time horizon
10 Phương pháp Tỷ lệ chiết khấu Discount rate
11 Phương pháp Lựa chọn kết cục Selection of outcomes
12 Phương pháp Đo lường kết cục Measurement of outcomes
13 Phương pháp Định giá kết cục Valuation of outcomes
14 Phương pháp Đo lường và định giá nguồn lực, chi phí Measurement and valuation of resources and costs
15 Phương pháp Tiền tệ, năm giá và quy đổi Currency, price date, and conversion
16 Phương pháp Lý do chọn và mô tả mô hình Rationale and description of model
17 Phương pháp Phân tích và giả định Analytics and assumptions
18 Phương pháp Mô tả tính không đồng nhất Characterising heterogeneity
19 Phương pháp Mô tả tác động phân phối Characterising distributional effects
20 Phương pháp Mô tả bất định Characterising uncertainty
21 Phương pháp Cách tham vấn người bệnh và các bên liên quan Approach to engagement with patients and others
22 Kết quả Tham số của nghiên cứu Study parameters
23 Kết quả Tóm tắt kết quả chính Summary of main results
24 Kết quả Ảnh hưởng của bất định Effect of uncertainty
25 Kết quả Ảnh hưởng của việc tham vấn Effect of engagement with patients and others
26 Bàn luận Phát hiện, hạn chế, khả năng khái quát Study findings, limitations, generalisability, and current knowledge
27 Thông tin khác Nguồn tài trợ Source of funding
28 Thông tin khác Xung đột lợi ích Conflicts of interest

Đoạn mã sau áp các câu hỏi bổ sung cho báo cáo mô hình ở Việt Nam vào bản thảo báo cáo về mô hình lao kháng thuốc; trường nào để trống thì tính là chưa báo cáo.

# Metadata of a draft report on the MDR-TB model (fields left empty are not reported yet)
draft <- list(
  perspective = "Hệ thống y tế",
  currency_year = paste0("VNĐ, giá năm ", yr, ", CPI Việt Nam"),
  unit_cost_sources = "",
  charges_vs_costs = NA,
  value_set = "EQ-5D-5L, bộ giá trị Việt Nam",
  life_table = "",
  threshold = "1 lần GDP bình quân đầu người",
  discount_rates = paste0(fmt_pct(ctx$disc_rate, 0), "/năm; độ nhạy ", fmt_pct(0, 0), " và ", fmt_pct(disc_high, 0)),
  evidence_synthesis = "RR của thử nghiệm áp lên nguy cơ nền Việt Nam",
  illustrative_share = "",
  code_url = "",
  map_note = NA
)
rep_check <- check_report(draft)
rep_check
     id
1   VN1
2   VN2
3   VN3
4   VN4
5   VN5
6   VN6
7   VN7
8   VN8
9   VN9
10 VN10
11 VN11
12 VN12
                                                                                                    check_vi
1                            Nêu rõ quan điểm (BHXH, hệ thống y tế, xã hội) và chi phí nào nằm trong phạm vi
2                                     Ghi đơn vị tiền và năm giá (VNĐ năm nào), chỉ số giá và tỷ giá đã dùng
3                    Liệt kê nguồn của từng chi phí đơn vị (giá dịch vụ, giá trúng thầu, nghiên cứu chi phí)
4                         Nói rõ số liệu là giá/hóa đơn hay chi phí nguồn lực thật, và cách xử lý chênh lệch
5                                  Ghi bộ giá trị EQ-5D dùng để tính thỏa dụng (ưu tiên bộ giá trị Việt Nam)
6  Ghi nguồn bảng sống (năm, giới, nguồn) cho tử vong nền, và chọn bảng quốc gia hay bảng tham chiếu cho YLL
7                                     Giải thích ngưỡng chi phí-hiệu quả và trình bày kết quả ở nhiều ngưỡng
8                                             Ghi tỷ lệ chiết khấu cơ sở và phân tích độ nhạy với tỷ lệ khác
9                                         Mô tả cách gộp bằng chứng và cách chuyển HR, RR, OR thành xác suất
10                                             Báo cáo số tham số là giá trị minh họa hoặc ý kiến chuyên gia
11                                                       Công khai mã và bảng tham số để người khác chạy lại
12                            Bản đồ Việt Nam (nếu có) ghi Hoàng Sa thuộc Đà Nẵng, Trường Sa thuộc Khánh Hòa
      status
1      Đã có
2      Đã có
3  Còn thiếu
4  Còn thiếu
5      Đã có
6  Còn thiếu
7      Đã có
8      Đã có
9      Đã có
10 Còn thiếu
11 Còn thiếu
12 Còn thiếu
n_missing <- sum(rep_check$status == "Còn thiếu")

Bản thảo còn thiếu 6 trên 12 mục. Phần thiếu gồm nguồn chi phí đơn vị, bản chất số liệu chi phí, nguồn bảng sống và các mục về minh bạch (tỷ lệ tham số minh họa, mã nguồn, bản đồ).

Cuối cùng, đoạn mã sau kiểm tra toàn bộ bảng tham số của module: tham số thật có nguồn, mọi khóa trích dẫn (mã ngắn trỏ tới một tài liệu) đều có trong refs.bib, khoảng thấp–cao hợp lệ. Nên chạy kiểm tra này mỗi khi sửa bảng tham số.

# Audit every parameter file of this module against refs.bib
keys <- bib_keys("refs.bib")
files <- list.files("params", pattern = "\\.csv$", full.names = TRUE)
audit <- do.call(rbind, lapply(files, function(f) {
  cbind(file = basename(f), audit_params(attr(read_params(f), "table"), keys))
}))
# Share of illustrative values per file. The macro file (World Bank series) and the life table
# are published data, not modelling assumptions, so a single pooled share would be misleading.
audit$share_illustrative <- audit$n_illustrative / audit$n_params
audit
                   file n_params n_illustrative n_missing_source
1           costing.csv       55              5                0
2          decision.csv       18              9                0
3 lifetable_gso2009.csv       74              0                0
4             macro.csv       43              0                0
5          outcomes.csv       65              0                0
6         synthesis.csv       25              9                0
  n_low_above_high n_value_outside_range n_dist_unparameterised
1                0                     0                      0
2                0                     0                      0
3                0                     0                      0
4                0                     0                      0
5                0                     0                      0
6                0                     0                      0
  n_unknown_citekey share_illustrative
1                 0         0.09090909
2                 0         0.50000000
3                 0         0.00000000
4                 0         0.00000000
5                 0         0.00000000
6                 0         0.36000000
stopifnot(all(audit$n_missing_source == 0), all(audit$n_unknown_citekey == 0),
          all(audit$n_low_above_high == 0), all(audit$n_value_outside_range == 0),
          all(audit$n_dist_unparameterised == 0))

Module có 280 dòng tham số riêng (chưa kể các giá trị dùng chung trong _shared), nhưng tỷ lệ minh họa gộp toàn module sẽ đánh lừa: chuỗi vĩ mô và bảng sống 2009 cho bài tập là số liệu đã công bố, không phải giả định mô hình. Hãy báo cáo tỷ lệ minh họa theo nhóm tham số mà mô hình dùng: 9% ở tệp chi phí, 50% ở tệp bối cảnh ra quyết định, 36% ở tệp tổng hợp bằng chứng, 0% ở tệp kết cục. Kiểm tra cũng bắt các dòng khai báo phân phối ngẫu nhiên nhưng không có tham số hay khoảng để chạy PSA (hiện còn 0 dòng). Đến đây, bạn đã tự rà được cả báo cáo lẫn bảng tham số bằng code.

Mẹo thực hành
  • Báo cáo kết quả ở dạng “can thiệp đáng đầu tư nếu ngưỡng lớn hơn X”, kèm hình NMB theo ngưỡng, để người đọc tự đặt ngưỡng của họ vào.
  • Đổi mọi ngưỡng về cùng đơn vị tiền và năm tham chiếu chi phí với mô hình trước khi so sánh (Bài 2).
  • Dùng CHEERS 2022 làm dàn ý trước khi viết, không phải bảng kiểm điền sau khi viết xong.
  • Đưa hàm kiểm tra bảng tham số (audit_params()) vào quy trình: chạy trước mỗi lần xuất kết quả.
Lỗi thường gặp
  • Kết luận “đạt chi phí-hiệu quả” theo 1–3 lần GDP mà không lý giải. Ở ví dụ trên, chính kết quả mô hình ấy cho hai quyết định ngược nhau tùy ngưỡng.
  • So ICER với ngưỡng khác năm tham chiếu chi phí hoặc khác đơn vị tiền. Ngưỡng tính bằng USD phải đổi theo đúng tỷ giá và năm tham chiếu chi phí.
  • Tính ICER của mọi cặp chiến lược. Chỉ ICER giữa các chiến lược kề nhau trên đường biên hiệu quả mới có ý nghĩa.
  • Bỏ qua mục báo cáo về nguồn đầu vào. Người phản biện ở Việt Nam sẽ hỏi chi phí lấy từ đâu, năm nào, là giá hay chi phí.

Bài tập

  1. (Dễ) Ở bội số nào của GDP bình quân đầu người thì C trở thành lựa chọn tốt nhất?
# Exercise 1: at which multiple of GDP per capita does C become the best choice?
switch_point
[1] 0.8499336

Đó là ICER của C so với B chia cho GDP bình quân đầu người, nên mọi ngưỡng lớn hơn giá trị này đều chọn C.

  1. (Vừa) Thêm chiến lược E: chi phí 58 triệu VNĐ, 14.68 QALY. Đường biên hiệu quả thay đổi thế nào?
# Exercise 2: add strategy E (cost 58 million, 14.68 QALYs) and redo the frontier
fr_e <- frontier(c(strategies$strategy, "E: mới"), c(strategies$cost, e_cost), c(strategies$qaly, e_qaly))
fr_e
                       strategy    cost effect          status      icer
1            B: phác đồ 6 tháng 5.2e+07  14.60 trên đường biên        NA
2                        E: mới 5.8e+07  14.68 trên đường biên  75000000
3            A: phác đồ dài hạn 6.0e+07  14.20       bị lấn át        NA
4        C: B + hỗ trợ tuân thủ 6.8e+07  14.75 trên đường biên 142857143
5 D: B + theo dõi tại bệnh viện 7.5e+07  14.70       bị lấn át        NA
icer_c_new <- fr_e$icer[fr_e$strategy == c_name]
# The solution text: E joins the frontier between B and C, and C's ICER (now against E) rises
stopifnot(fr_e$status[fr_e$strategy == "E: mới"] == "trên đường biên", icer_c_new > icer_c)

E nằm trên đường biên, giữa B và C. ICER của C bây giờ tính so với E: 142.9 triệu VNĐ mỗi QALY, cao hơn 106.7 triệu trước đó, nên C cần ngưỡng cao hơn mới được chọn. Thêm một phương án hợp lý có thể thay đổi kết luận về các phương án khác.

  1. (Khó) Hoàn thiện bản thảo báo cáo sao cho đủ mọi mục, rồi chạy lại bảng kiểm. Với mỗi mục bạn điền, nêu bài học nào trong module cung cấp nội dung đó.
# Exercise 3: complete the draft and re-run the checklist
draft2 <- draft
draft2$unit_cost_sources <- "Giá dịch vụ y tế, giá trúng thầu thuốc, nghiên cứu chi phí đã công bố"
draft2$charges_vs_costs <- "Hóa đơn viện phí, không điều chỉnh bằng tỷ số chi phí/giá"
draft2$life_table <- "Bảng sống WHO 2023 cho Việt Nam (tệp dùng chung của khóa học), gộp theo giới người bệnh; độ nhạy với tuổi thọ của Cục Thống kê; YLL tính cả bằng bảng tham chiếu"
cost_row <- audit[audit$file == "costing.csv", ]
draft2$illustrative_share <- sprintf("%d trên %d tham số chi phí là giá trị minh họa", cost_row$n_illustrative, cost_row$n_params)
draft2$code_url <- "Kho mã của nhóm nghiên cứu"
draft2$map_note <- "Không có bản đồ"
table(check_report(draft2)$status)

Đã có 
   12 

Nguồn chi phí đơn vị và giá hay chi phí: Bài 1. Năm tham chiếu chi phí và tỷ giá: Bài 2. Bộ giá trị và bảng sống: Bài 3. Gộp bằng chứng và chuyển đổi hiệu quả: Bài 4. Ngưỡng, chiết khấu, tỷ lệ tham số minh họa và mã nguồn: Bài 5.

Tài liệu tham khảo

# Slide Lời giảng chính Hình/Code
1 Một ICER, nhiều câu trả lời kết luận phụ thuộc ngưỡng —
2 Ngưỡng là chi phí cơ hội ngân sách cố định; sức khỏe mất ở nơi khác công thức NMB
3 Quy tắc GDP và phê phán quá cao, thiếu đặc thù; 66% nghiên cứu vẫn dùng —
4 Ngưỡng trong nghiên cứu Việt Nam bốn ngưỡng khác nhau; quy về VNĐ/QALY chunk l05-thresholds
5 Đường biên hiệu quả A, D bị lấn át; ICER C so với B = 106.7 triệu VNĐ chunk l05-frontier
6 Điểm đổi chiều 0.85 lần GDP; NMB theo ngưỡng figs/l05-nmb-threshold.png
7 Tỷ lệ chiết khấu 3% hay 5%; lợi ích đến muộn chịu ảnh hưởng nhất chunk l05-discount
8 CHEERS 2022 28 mục; mục mới: kế hoạch phân tích, phân phối, tham vấn bảng CHEERS
9 Câu hỏi bổ sung cho Việt Nam năm tham chiếu chi phí, giá hay chi phí, bộ giá trị, bảng sống, ngưỡng, bản đồ chunk l05-vn-check
10 Kiểm tra bảng tham số bằng code nguồn, khóa trích dẫn, khoảng, phân phối; tỷ lệ minh họa theo nhóm (chi phí 9%) chunk l05-audit
11 Tổng kết module đầu vào Việt Nam: chi phí, kết cục, bằng chứng, quyết định → M10 tác động ngân sách —