M08 · Hiệu chuẩn mô hình (calibration)

Ước lượng tham số không đo được của một mô hình lao từ số ca báo cáo và điều tra tỷ lệ hiện mắc, rồi mang bất định đó vào đánh giá kinh tế

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

Năm 2024, Việt Nam báo cáo 106,392 ca lao mới và tái phát, trong khi WHO ước tính khoảng 184,000 người mắc (khoảng bất định 95%: 113,000–267,000): chênh lệch cỡ 78,000 người là những ca chưa được chẩn đoán hoặc chưa được báo cáo (World Health Organization 2026b). Sàng lọc X-quang ngực rồi Xpert (chiến lược 2X) tốn khoảng 102,800 VNĐ mỗi người theo giá BHYT, bằng 2.6 bát phở (Bộ Y tế 2024; Nhadautu.vn 2025). Muốn biết có nên chi số tiền đó cho hàng triệu người hay không, ta phải ước lượng những con số không ai đếm được, như bệnh lây nhanh đến đâu và người bệnh chờ bao lâu mới được phát hiện; hiệu chuẩn mô hình là cách làm việc đó.

Tổng quan

Nhiều tham số quan trọng nhất của mô hình bệnh truyền nhiễm không đo trực tiếp được: hệ số lây truyền, tỷ suất phát hiện ca bệnh, xu hướng của dịch theo thời gian. Ta chỉ quan sát được hệ quả của chúng, như số ca được báo cáo hay tỷ lệ hiện mắc trong một cuộc điều tra. Hiệu chuẩn mô hình (calibration) suy ngược từ những quan sát đó về các tham số. Module này đi từ câu hỏi “khớp” nghĩa là gì, qua tìm kiếm và tối ưu hóa, đến hiệu chuẩn Bayes viết từ đầu trong base R, rồi đưa kết quả vào phân tích độ nhạy xác suất và thẩm định mô hình. Ví dụ xuyên suốt là bệnh lao ở Việt Nam, hiệu chuẩn theo hai bộ mục tiêu đặt cạnh nhau: một bộ mô phỏng, để kiểm tra từng phương pháp có tìm lại giá trị thật không, và một bộ thật từ WHO và điều tra quốc gia 2017–2018.

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

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

  1. Xác định tham số nào cần hiệu chuẩn, chọn mục tiêu hiệu chuẩn và viết hàm hợp lý phản ánh đúng cách dữ liệu được sinh ra.
  2. Phát hiện tính không nhận dạng được bằng hàm hợp lý profile, nhiều điểm khởi đầu và phân phối hậu nghiệm.
  3. Tìm bộ tham số phù hợp nhất bằng tìm kiếm ngẫu nhiên, lấy mẫu siêu khối Latin và thuật toán Nelder–Mead, trên số liệu mô phỏng và số liệu thật của Việt Nam.
  4. Cài đặt hiệu chuẩn Bayes bằng thuật toán SIR và hai vòng của phiên bản rút gọn của IMIS, kèm chẩn đoán bằng cỡ mẫu hiệu dụng (effective sample size, ESS).
  5. Đưa hậu nghiệm vào PSA mà giữ tương quan giữa tham số, thẩm định mô hình bằng dữ liệu giữ lại, và báo cáo một hiệu chuẩn.

Kiến thức cần có

  • M00: R cơ bản, hàm, vòng lặp, ma trận, ggplot2, số ngẫu nhiên và set.seed().
  • M01: chi phí, DALY, chiết khấu, ICER và lợi ích ròng quy ra tiền (NMB).
  • M02: đổi tỷ suất thành xác suất, hiệu chỉnh nửa chu kỳ, xác minh mô hình.
  • M03 (nên có): PSA và đường cong chấp nhận chi phí-hiệu quả. M05 (nên có): lực lây nhiễm, mô hình lây truyền động và giải hệ phương trình vi phân bằng deSolve.

Ví dụ xuyên suốt

Chương trình Chống lao Quốc gia có chuỗi số ca được báo cáo hằng năm và hai cuộc điều tra tỷ lệ hiện mắc quốc gia, năm 2006–2007 và 2017–2018 (Nguyen và c.s. 2020). Module dựng một “thế giới mô phỏng” giống Việt Nam năm 2017: các giá trị thật của ba tham số hiệu chuẩn được chọn gần bộ khớp nhất với số liệu thật, rồi từ đó sinh số ca báo cáo 2010–2024 và hai điều tra cộng sai số lấy mẫu. Độ chính xác của điều tra mô phỏng lấy từ hệ số thiết kế hiệu dụng của điều tra quốc gia lần 2. Bên cạnh là mục tiêu thật: số ca lao mới và tái phát mà Việt Nam báo cáo cho WHO (World Health Organization 2026b) và kết quả điều tra 2017–2018. Câu hỏi chính sách ở cuối module: mở rộng phát hiện ca bệnh chủ động (ACF) theo chiến lược 2X cho 25% dân số mỗi năm từ 2026, so với khoảng 0.8% ở Thái Nguyên hiện nay (Dương, Lê, và Phạm 2025), có chi phí-hiệu quả không, và câu trả lời phụ thuộc vào hiệu chuẩn thế nào?

flowchart LR
  S["S: chưa nhiễm"] -- "λ(t) = β(t)·I" --> E["E: tiềm ẩn sớm"]
  E -- "tiến triển nhanh" --> I["I: lao hoạt động,<br/>chưa phát hiện"]
  E -- "ổn định" --> L["L: tiềm ẩn muộn"]
  L -- "tái hoạt động" --> I
  L -- "tái nhiễm" --> E
  I -- "δ (+ sàng lọc 2X): phát hiện" --> T["T: đang điều trị"]
  I -- "tự khỏi" --> R["R: đã khỏi"]
  I -- "tử vong do lao" --> D(("tử vong"))
  T -- "hoàn thành" --> R
  T -- "tử vong do lao" --> D
  R -- "tái phát" --> I
  R -- "tái nhiễm" --> E

Ba tham số được hiệu chuẩn: hệ số lây truyền \(\beta\), tỷ suất phát hiện \(\delta\) và tốc độ giảm lây truyền \(k_\beta\). Mọi ngăn còn chịu tử vong nền lấy từ bảng sống WHO 2023 của Việt Nam (World Health Organization 2026a); người chết được thay bằng trẻ sinh vào S. Mô hình là hệ phương trình vi phân, tích phân bằng Runge–Kutta bậc 4 (RK4) viết từ đầu với bước 0.50 năm, có 200 năm chạy khởi động; Bài 1 kiểm chứng nó.

Giới hạn cần nhớ. Mô hình không có cấu trúc tuổi, giới, HIV hay lao kháng thuốc, và giả định tỷ suất phát hiện không đổi theo thời gian. Khi hiệu chuẩn theo số liệu thật, nó khớp số ca báo cáo nhưng cho số tử vong do lao cao hơn hẳn ước tính của WHO (Bài 2). Chi phí và trọng số bệnh tật lấy từ nguồn công bố (giá BHYT, số liệu của Chương trình Chống lao Quốc gia, GBD); độ phủ sàng lọc là một kịch bản; các tham số diễn tiến tự nhiên được giữ cố định nên bất định của chúng không có trong PSA; khung thời gian đến 2035. Kết quả dùng để học phương pháp, không phải khuyến nghị chính sách.

Bản đồ bài học

Bài Chủ đề Bạn sẽ làm được Code
1 Vì sao phải hiệu chuẩn chọn mục tiêu, mô phỏng và thật; hàm hợp lý và WSSE; mẫu cụm; tính nhận dạng được code/l01-why-calibrate.R
2 Tìm kiếm tham số tìm kiếm ngẫu nhiên; LHS từ đầu; Nelder–Mead với nhiều điểm khởi đầu; hiệu chuẩn theo số liệu Việt Nam code/l02-search-methods.R
3 Hiệu chuẩn Bayes tiên nghiệm, hậu nghiệm; SIR từ đầu; ESS; hai vòng của phiên bản rút gọn của IMIS; ABC, MCMC code/l03-bayes-sir.R
4 PSA, thẩm định và báo cáo hậu nghiệm trong PSA; đánh giá sàng lọc 2X; kiểm tra dự báo; dữ liệu giữ lại và một phép thẩm định thất bại; bảng kiểm báo cáo code/l04-psa-validation.R

Mọi hàm nằm trong code/model.R (chỉ định nghĩa hàm, không chạy gì khi được nạp). Hàm tb_params() đọc bảng tham số của module rồi tính thêm các giá trị lấy từ dữ liệu dùng chung của khóa học (../_shared): tử vong nền, số năm sống mất đi, ngưỡng, tỷ lệ chiết khấu, giá BHYT, tỷ giá và chỉ số giá. Hàm mô hình run_tb_model() nhận một ma trận tham số, mỗi hàng một bộ, nên cùng một lệnh chạy được một bộ hay hàng chục nghìn bộ. Mỗi script bài học chạy độc lập từ thư mục module, ví dụ Rscript code/l03-bayes-sir.R, và xong trong dưới hai phút trên máy M4 Pro.

Tham số và dữ liệu

Tham số nằm trong hai tệp. params/calibration.csv chứa 3 tham số hiệu chuẩn: cột value là giá trị thật dùng để mô phỏng mục tiêu, cột dist_p1–dist_p2 là khoảng của phân phối tiên nghiệm đều (giá trị minh họa). params/tb_natural_history.csv chứa 49 tham số cố định và thiết lập mô hình; 27 có nguồn công bố, 22 là lựa chọn mô hình hóa, kịch bản hoặc giá trị minh họa (illustrative = TRUE) vì chưa có con số công bố dùng được. Dữ liệu thật nằm trong data/vn_tb_who.csv (số ca báo cáo, ước tính tỷ lệ mới mắc và tử vong của WHO 2000–2024, dân số của Ngân hàng Thế giới (World Health Organization 2026b; World Bank 2026b)) và data/vn_tb_notif_age_2021.csv (số ca báo cáo theo tuổi và giới năm 2021).

Table 1: Tham số hiệu chuẩn (params/calibration.csv)
Tham số Mô tả Giá trị thật Tiên nghiệm Đơn vị
beta Hệ số lây truyền hiệu dụng (số người bị nhiễm do một ca lao hoạt động trong một năm, khi mọi người đều cảm nhiễm) 6.7 Đều(4, 30) mỗi năm
delta Tỷ suất phát hiện và bắt đầu điều trị khi mắc lao hoạt động 0.45 Đều(0.1, 2) mỗi năm
k_beta Tốc độ giảm hệ số lây truyền sau năm 2000 0.02 Đều(0, 0.1) mỗi năm
Table 2: Tham số cố định và thiết lập (params/tb_natural_history.csv)
Tham số Mô tả Giá trị Thấp Cao Đơn vị Nguồn
dt Bước tích phân RK4 cho các năm được báo cáo 0.5 năm lựa chọn mô hình hóa / minh họa
dt_burnin Bước tích phân trong giai đoạn chạy khởi động 1 năm lựa chọn mô hình hóa / minh họa
burnin_years Số năm chạy khởi động (burn-in) trước năm bắt đầu báo cáo 200 năm lựa chọn mô hình hóa / minh họa
year_start Năm đầu tiên ghi kết quả 2000 năm lựa chọn mô hình hóa / minh họa
year_end Năm cuối cùng của mô phỏng 2035 năm lựa chọn mô hình hóa / minh họa
year_trend Năm lây truyền bắt đầu giảm 2000 năm lựa chọn mô hình hóa / minh họa
init_S Tỷ lệ cảm nhiễm lúc bắt đầu chạy khởi động 0.4 tỷ lệ lựa chọn mô hình hóa / minh họa
init_E Tỷ lệ nhiễm tiềm ẩn sớm lúc bắt đầu chạy khởi động 0.02 tỷ lệ lựa chọn mô hình hóa / minh họa
init_L Tỷ lệ nhiễm tiềm ẩn muộn lúc bắt đầu chạy khởi động 0.5 tỷ lệ lựa chọn mô hình hóa / minh họa
init_I Tỷ lệ mắc lao hoạt động chưa phát hiện lúc bắt đầu chạy khởi động 0.003 tỷ lệ lựa chọn mô hình hóa / minh họa
init_T Tỷ lệ đang điều trị lao lúc bắt đầu chạy khởi động 0.001 tỷ lệ lựa chọn mô hình hóa / minh họa
p_fast Tỷ lệ người mới nhiễm đi theo nhánh tiến triển nhanh 0.14 0.09 0.14 tỷ lệ (Vynnycky và Fine 1997)
dur_early Thời gian trung bình ở giai đoạn nhiễm tiềm ẩn sớm 2 1 5 năm lựa chọn mô hình hóa / minh họa
nu_react Tỷ suất tái hoạt động từ nhiễm tiềm ẩn muộn 0.0005 0.0001 0.001 mỗi năm lựa chọn mô hình hóa / minh họa
prot_reinf Mức bảo vệ chống bệnh sau tái nhiễm ở người đã nhiễm 0.79 0.7 0.86 tỷ lệ (Andrews và c.s. 2012)
rho_relapse Tỷ suất tái phát sau khi khỏi (điều trị hoặc tự khỏi) 0.01 0.005 0.02 mỗi năm lựa chọn mô hình hóa / minh họa
cf_untreated_sp Tỷ lệ tử vong 10 năm của lao phổi AFB dương, HIV âm, không điều trị 0.7 0.53 0.86 tỷ lệ (Tiemersma và c.s. 2011)
cf_untreated_sn Tỷ lệ tử vong 10 năm của lao AFB âm, cấy dương, HIV âm, không điều trị 0.2 tỷ lệ (Tiemersma và c.s. 2011)
share_sp Tỷ lệ lao AFB dương trong các ca lao hoạt động chưa phát hiện 0.25 0.17 0.36 tỷ lệ (Nguyen và c.s. 2020)
vn_prev2017_smear Tỷ lệ hiện mắc lao phổi AFB dương ở người từ 15 tuổi, 2017-2018 79 55 115 /100,000 (Nguyen và c.s. 2020)
dur_untreated Thời gian mắc lao không điều trị đến khi tự khỏi hoặc tử vong 3 2 4 năm (Tiemersma và c.s. 2011)
dur_tx Thời gian điều trị lao 0.5 năm lựa chọn mô hình hóa / minh họa
cf_tx Tỷ lệ tử vong do lao trong thời gian điều trị 0.03 0.01 0.06 tỷ lệ lựa chọn mô hình hóa / minh họa
tx_success_vn Tỷ lệ điều trị thành công của Chương trình Chống lao Quốc gia, báo cáo năm 2024 0.89 tỷ lệ (Báo Đại biểu Nhân dân 2025)
notif_from Năm đầu của chuỗi số ca được báo cáo (mục tiêu) 2010 năm lựa chọn mô hình hóa / minh họa
notif_to Năm cuối của chuỗi số ca được báo cáo (mục tiêu) 2024 năm lựa chọn mô hình hóa / minh họa
notif_cv Hệ số biến thiên của sai số báo cáo 0.05 tỷ lệ lựa chọn mô hình hóa / minh họa
notif_excluded Năm bị loại khỏi chuỗi số ca báo cáo thật 2021 năm (Bui và c.s. 2025)
survey_year_cal Năm điều tra tỷ lệ hiện mắc dùng để hiệu chuẩn 2017 năm (Nguyen và c.s. 2020)
survey_year_val Năm điều tra tỷ lệ hiện mắc giữ lại để thẩm định (mô phỏng) 2007 năm (Nguyen và c.s. 2020)
survey_n Số người tham gia điều tra tỷ lệ hiện mắc lao quốc gia lần 2 61,763 người (Nguyen và c.s. 2020)
vn_prev2017 Tỷ lệ hiện mắc lao phổi có bằng chứng vi khuẩn ở người từ 15 tuổi, 2017-2018 322 260 399 /100,000 (Nguyen và c.s. 2020)
vn_prev2017_crude Tỷ lệ hiện mắc thô (chưa bù trừ dữ liệu thiếu, chưa gia quyền), 2017-2018 358 295 434 /100,000 (Nguyen và c.s. 2020)
deff_planning Hệ số thiết kế dự kiến khi tính cỡ mẫu của điều tra lần 2 1.92 hệ số (Nguyen và c.s. 2020)
vn_prev2007 Tỷ lệ hiện mắc lao phổi có bằng chứng vi khuẩn ở người lớn, điều tra quốc gia lần 1 (2006-2007) 307 /100,000 (Nguyen và c.s. 2020)
child_share_2017 Tỷ lệ dân số 0-14 tuổi, năm 2017 0.244 tỷ lệ (World Bank 2026a)
acf_start Năm bắt đầu phát hiện ca bệnh chủ động (ACF) mở rộng 2026 năm lựa chọn mô hình hóa / minh họa
acf_coverage Tỷ lệ dân số được sàng lọc 2X (X-quang ngực rồi Xpert) mỗi năm trong kịch bản ACF 0.25 0.1 0.5 tỷ lệ/năm lựa chọn mô hình hóa / minh họa
acf_coverage_tn Tỷ lệ dân số được khám sàng lọc 2X mỗi năm ở Thái Nguyên, 2020-2023 0.008 0.003 0.015 tỷ lệ/năm (Dương, Lê, và Phạm 2025)
tn_screened Số người được khám sàng lọc 2X ở Thái Nguyên, 2020-2023 43,139 người (Dương, Lê, và Phạm 2025)
tn_found Số người được chẩn đoán lao qua sàng lọc 2X ở Thái Nguyên, 2020-2023 246 người (Dương, Lê, và Phạm 2025)
sens_cxr Độ nhạy của X-quang ngực (có hoặc không có phần mềm đọc) với lao có bằng chứng vi khuẩn 0.85 0.77 0.9 tỷ lệ (Schwalb và c.s. 2025)
sens_xpert Độ nhạy của xét nghiệm Xpert trên đờm với lao phổi ở người được sàng lọc 0.775 0.676 0.856 tỷ lệ (Schwalb và c.s. 2025)
p_xpert Tỷ lệ người được chụp X-quang có phim bất thường và cần làm Xpert 0.041 0.016 0.134 tỷ lệ (Nguyen và c.s. 2020)
c_screen_programme_usd2023 Chi phí chương trình cho mỗi người được sàng lọc X-quang rồi Xpert (ACT3/ACT5) 1.7 USD/người (2023) (Schwalb và c.s. 2025)
c_tx_usd2023 Chi phí điều trị một ca lao nhạy cảm thuốc (Chương trình Chống lao Quốc gia) 81 USD/ca (2023) (Schwalb và c.s. 2025)
c_dx_usd2023 Chi phí chẩn đoán thụ động một ca lao nhạy cảm thuốc (gồm số người phải xét nghiệm để tìm ra một ca) 264 USD/ca (2023) (Schwalb và c.s. 2025)
dw_tb Trọng số bệnh tật khi mắc lao 0.333 0.224 0.454 trọng số (Tomeny và c.s. 2024)
alt_delta_growth Tốc độ tăng tỷ suất phát hiện mỗi năm trong mô hình sai cấu trúc (chỉ để minh họa thẩm định thất bại) 0.05 mỗi năm lựa chọn mô hình hóa / minh họa
Table 3: Giá trị tính từ dữ liệu dùng chung của khóa học (tb_params())
Tên Giá trị Đơn vị Cách tính
mu_bg 0.01346 mỗi năm 1 / tuổi thọ lúc sinh, bảng sống WHO 2023 (vn_lifetable)
age_tb 48.27 tuổi tuổi trung bình của người bệnh lao được báo cáo, WHO 2021 (data/vn_tb_notif_age_2021.csv)
yll_death 29.84 năm kỳ vọng sống còn lại ở tuổi age_tb (vn_lifetable)
wtp 125,500,000 VNĐ/DALY 1 × GDP bình quân đầu người (vn_context)
wtp_low 62,750,000 VNĐ/DALY 0.5 × GDP bình quân đầu người (vn_context)
disc_rate 0.03 mỗi năm vn_context
c_tx 2,063,000 VNĐ/ca (2025) c_tx_usd2023 quy đổi bằng tỷ giá 2023 và CPI đến 2025
c_dx 6,723,000 VNĐ/ca (2025) c_dx_usd2023 quy đổi như trên
c_screen 102,800 VNĐ/người (2025) giá X-quang ngực + p_xpert × giá Xpert (vn_prices, giá BHYT 2025)
c_screen_programme 43,290 VNĐ/người (2025) c_screen_programme_usd2023 quy đổi như trên
c_acf 25,710 VNĐ/người dân/năm (2025) acf_coverage × c_screen
sens_acf 0.6587 tỷ lệ sens_cxr × sens_xpert
acf_add 0.1647 mỗi năm acf_coverage × sens_acf

Gói R sử dụng

  • base R (stats): mô hình, hàm hợp lý (dnorm, dbinom), tối ưu hóa (optim, optimHess), lấy mẫu (sample, runif), cov.wt, mahalanobis.
  • MASS: mvrnorm() để rút từ phân phối chuẩn nhiều chiều trong imis_lite().
  • deSolve: chỉ để kiểm chứng bộ tích phân RK4 với một bộ tham số (Bài 1).
  • ggplot2: mọi hình vẽ, với theme_course() và pal_course dùng chung cho khóa học.
  • knitr và Quarto: dựng bài học từ các đoạn code được đánh dấu trong code/.
  • Đọc thêm, không bắt buộc: gói lhs cho các thiết kế LHS tối ưu hơn.

Tài liệu tham khảo