Đường cong ROC và AUC trong đánh giá độ chính xác xét nghiệm chẩn đoán

Author

🌙☕📚💻

Published

April 25, 2026

1 Bối cảnh lâm sàng

Giả sử chúng ta đang đánh giá kết quả chụp nhũ ảnh, mammography, để phát hiện ung thư vú.

Trong ví dụ này có 60 phụ nữ:

  • 30 người thật sự có ung thư.
  • 30 người không có ung thư.

Bác sĩ X-quang đọc phim và cho điểm từ 1 đến 5:

Điểm Ý nghĩa lâm sàng
1 Bình thường
2 Tổn thương lành tính
3 Có thể lành tính
4 Nghi ngờ ác tính
5 Ác tính

Điểm càng cao thì mức độ nghi ngờ ung thư càng lớn.

2 Dữ liệu quan sát được

Bảng kết quả mammography như sau:

Tình trạng thật Điểm 1 Điểm 2 Điểm 3 Điểm 4 Điểm 5 Tổng
Có ung thư 1 0 6 11 12 30
Không ung thư 9 2 11 8 0 30

Ta thấy ngay rằng nhóm có ung thư có xu hướng nhận điểm cao hơn. Cụ thể, trong nhóm có ung thư, nhiều người nằm ở điểm 4 và 5. Trong nhóm không ung thư, phần lớn nằm ở điểm 1 đến 3, nhưng vẫn có 8 người được điểm 4.

Điều này phản ánh một thực tế rất quan trọng trong chẩn đoán: xét nghiệm không hoàn hảo. Một số người có bệnh có thể bị điểm thấp, và một số người không bệnh có thể bị điểm cao.

3 Từ câu hỏi lâm sàng đến câu hỏi thống kê

Câu hỏi lâm sàng là:

Mammography có phân biệt tốt giữa người có ung thư và người không có ung thư hay không?

Câu hỏi thống kê tương ứng là:

Điểm mammography ở nhóm có ung thư có xu hướng cao hơn điểm mammography ở nhóm không ung thư đến mức nào?

ROC curve và AUC được dùng để trả lời câu hỏi này.

4 Nhắc lại sensitivity và specificity

Giả sử ta biến điểm mammography thành kết quả nhị phân:

  • Dương tính: nghi ngờ có ung thư.
  • Âm tính: không nghi ngờ ung thư.

Khi đó:

Sensitivity = P(\text{test dương tính} \mid \text{có bệnh})

Sensitivity cho biết trong số những người thật sự có bệnh, test phát hiện được bao nhiêu phần.

Còn specificity là:

Specificity = P(\text{test âm tính} \mid \text{không bệnh})

Specificity cho biết trong số những người thật sự không bệnh, test nhận diện đúng bao nhiêu phần.

ROC curve thường dùng thêm khái niệm false positive fraction:

FPF = 1 - Specificity

và true positive fraction:

TPF = Sensitivity

Nói đơn giản:

  • TPF cao là tốt, vì phát hiện được nhiều người bệnh.
  • FPF thấp là tốt, vì ít báo động sai ở người không bệnh.

5 Vấn đề của việc chọn một ngưỡng duy nhất

Vì điểm mammography có 5 mức, ta cần quyết định điểm nào trở lên được xem là dương tính.

Ví dụ, nếu chọn ngưỡng 4:

  • Điểm 1, 2, 3 được xem là âm tính.
  • Điểm 4, 5 được xem là dương tính.

Trong nhóm có ung thư:

  • Điểm 4 có 11 người.
  • Điểm 5 có 12 người.
  • Tổng số dương tính là 23 người.

Vì có 30 người thật sự có ung thư:

TPF = Sensitivity = \frac{23}{30} = 0.767

Trong nhóm không ung thư:

  • Điểm 4 có 8 người.
  • Điểm 5 có 0 người.
  • Tổng số dương tính giả là 8 người.

Vì có 30 người không ung thư:

FPF = \frac{8}{30} = 0.267

Do đó:

Specificity = 1 - FPF = 1 - 0.267 = 0.733

6 Ý nghĩa lâm sàng của ngưỡng 4

Nếu dùng ngưỡng 4, ta có thể nói:

Khi xem điểm 4 hoặc 5 là dương tính, mammography phát hiện được khoảng 76.7% người có ung thư, nhưng đồng thời báo động sai ở khoảng 26.7% người không ung thư.

Đây là một trade-off.

Nếu ta chọn ngưỡng thấp hơn, ví dụ điểm 3 trở lên là dương tính, sensitivity sẽ tăng vì ta bắt được nhiều người bệnh hơn. Nhưng false positive cũng tăng vì nhiều người không bệnh bị xem là dương tính.

Nếu ta chọn ngưỡng cao hơn, ví dụ chỉ điểm 5 mới là dương tính, false positive sẽ giảm, nhưng sensitivity cũng giảm vì nhiều người bệnh có điểm 4 bị bỏ sót.

7 Ý tưởng của ROC curve

ROC curve không chọn một ngưỡng duy nhất. Thay vào đó, nó xét tất cả các ngưỡng có thể.

Với mỗi ngưỡng, ta tính:

TPF = P(\text{test dương tính} \mid \text{có bệnh})

FPF = P(\text{test dương tính} \mid \text{không bệnh})

Sau đó ta vẽ các điểm:

(FPF, TPF)

trên đồ thị.

Trục ngang là FPF. Trục dọc là TPF.

8 Các ngưỡng trong ví dụ mammography

Trong ví dụ này, ta lần lượt xem điểm từ 1 đến 5 là ngưỡng dương tính.

Ngưỡng dương tính TPF FPF
Điểm \ge 1 30/30 = 1.000 30/30 = 1.000
Điểm \ge 2 30/30 = 1.000 21/30 = 0.700
Điểm \ge 3 29/30 = 0.967 19/30 = 0.633
Điểm \ge 4 23/30 = 0.767 8/30 = 0.267
Điểm \ge 5 12/30 = 0.400 0/30 = 0.000

Mỗi dòng trong bảng là một cách dùng mammography để đưa ra quyết định lâm sàng.

9 Diễn giải từng ngưỡng

Ngưỡng điểm \ge 1 nghĩa là ai cũng được xem là dương tính. Khi đó:

  • Không bỏ sót người bệnh nào, nên sensitivity bằng 1.
  • Nhưng tất cả người không bệnh cũng bị báo động dương tính, nên FPF bằng 1.

Ngưỡng điểm \ge 5 nghĩa là chỉ những người có kết quả ác tính rõ ràng mới được xem là dương tính. Khi đó:

  • Không có người không bệnh nào bị báo động sai, nên FPF bằng 0.
  • Nhưng chỉ phát hiện được 12 trên 30 người bệnh, nên sensitivity chỉ bằng 0.4.

Ngưỡng điểm \ge 4 là một điểm cân bằng hơn:

  • Phát hiện được 23 trên 30 người bệnh.
  • Báo động sai 8 trên 30 người không bệnh.

10 Đường cong ROC phản ánh điều gì?

ROC curve cho thấy toàn bộ trade-off giữa sensitivity và specificity.

Một xét nghiệm tốt sẽ có:

  • TPF cao.
  • FPF thấp.

Trên đồ thị ROC, điều này nghĩa là đường cong đi gần về góc trên bên trái.

Góc trên bên trái là điểm lý tưởng:

FPF = 0, \quad TPF = 1

Điều này nghĩa là:

  • Không báo động sai ở người không bệnh.
  • Phát hiện tất cả người có bệnh.

Trong thực tế, rất ít xét nghiệm đạt được điều này.

11 AUC là gì?

AUC là diện tích dưới đường cong ROC.

AUC viết đầy đủ là area under the curve.

AUC tóm tắt toàn bộ đường cong ROC thành một con số duy nhất.

Nếu:

AUC = 1

thì xét nghiệm phân biệt hoàn hảo giữa người bệnh và người không bệnh.

Nếu:

AUC = 0.5

thì xét nghiệm không tốt hơn đoán ngẫu nhiên.

Nếu:

AUC < 0.5

thì hướng chấm điểm có thể bị ngược, nghĩa là điểm cao lại xuất hiện nhiều hơn ở người không bệnh.

12 Diễn giải xác suất của AUC

Một cách hiểu rất quan trọng là:

AUC = P(Y > X) + \frac{1}{2}P(Y = X)

Trong đó:

  • Y là điểm mammography của một người được chọn ngẫu nhiên từ nhóm có ung thư.
  • X là điểm mammography của một người được chọn ngẫu nhiên từ nhóm không ung thư.

Do đó, AUC là xác suất rằng một người có ung thư sẽ có điểm xét nghiệm cao hơn một người không ung thư, cộng thêm một nửa xác suất hai người có cùng điểm.

13 Vì sao phải cộng một nửa khi hai điểm bằng nhau?

Nếu Y > X, test xếp đúng: người bệnh có điểm cao hơn người không bệnh.

Nếu Y < X, test xếp sai: người không bệnh lại có điểm cao hơn người bệnh.

Nếu Y = X, test không phân biệt được hai người. Vì hòa nhau, ta cho một nửa điểm đúng.

Vì vậy:

\frac{1}{2}P(Y = X)

là phần điều chỉnh cho các trường hợp bằng điểm.

14 Diễn giải AUC bằng ngôn ngữ lâm sàng

Nếu AUC bằng 0.78, ta có thể nói:

Nếu chọn ngẫu nhiên một người có ung thư và một người không ung thư, xác suất mammography cho điểm cao hơn ở người có ung thư là khoảng 78%, có tính đến trường hợp hai người bằng điểm.

Đây là một diễn giải rất trực quan.

AUC không phải là xác suất một bệnh nhân cụ thể bị ung thư. AUC cũng không phải là accuracy thông thường. AUC là khả năng phân biệt hoặc khả năng xếp hạng đúng giữa nhóm bệnh và nhóm không bệnh.

15 Bayesian analysis trong ví dụ này

Trong tài liệu, tác giả dùng mô hình Bayesian để ước lượng AUC.

Ta giả sử phân phối điểm trong nhóm có ung thư là:

P(Y = i) = \theta_i, \quad i = 1,2,3,4,5

Trong đó \theta_i là xác suất một người có ung thư nhận điểm i.

Tương tự, phân phối điểm trong nhóm không ung thư là:

P(X = j) = \phi_j, \quad j = 1,2,3,4,5

Trong đó \phi_j là xác suất một người không ung thư nhận điểm j.

16 Ý nghĩa của \theta\phi

Vector \theta mô tả cách điểm mammography phân bố trong nhóm có ung thư.

Nếu test tốt, \theta nên tập trung nhiều ở điểm cao, ví dụ điểm 4 và 5.

Vector \phi mô tả cách điểm mammography phân bố trong nhóm không ung thư.

Nếu test tốt, \phi nên tập trung nhiều ở điểm thấp, ví dụ điểm 1, 2 và 3.

Vì vậy, AUC phụ thuộc vào mức độ tách biệt giữa hai phân phối này.

17 Công thức AUC theo \theta\phi

Với điểm rời rạc từ 1 đến 5, AUC có thể được viết là:

AUC(\theta, \phi) = \sum_{i=2}^{5} \sum_{j=1}^{i-1} \theta_i \phi_j + \frac{1}{2} \sum_{i=1}^{5} \theta_i \phi_i

Phần thứ nhất:

\sum_{i=2}^{5} \sum_{j=1}^{i-1} \theta_i \phi_j

là xác suất người bệnh có điểm cao hơn người không bệnh.

Phần thứ hai:

\frac{1}{2} \sum_{i=1}^{5} \theta_i \phi_i

là một nửa xác suất hai người có cùng điểm.

18 Vì sao dùng Bayesian?

Trong phân tích cổ điển, ta có thể tính AUC trực tiếp từ dữ liệu.

Trong phân tích Bayesian, ta xem AUC là một đại lượng chưa biết và có phân phối posterior sau khi quan sát dữ liệu.

Điều này cho phép ta không chỉ báo cáo một con số AUC, mà còn báo cáo độ bất định xung quanh AUC.

Ví dụ, ta có thể nói:

  • AUC trung bình posterior là 0.78.
  • Độ lệch chuẩn posterior là 0.05.
  • Khoảng credible 95% là từ 0.68 đến 0.88.

19 Kết quả trong ví dụ mammography

Code
pacman::p_load(tidyverse, data.table, magrittr, HDInterval, cmdstanr, posterior, gt)

stan_code = "

data {
  int<lower=1> K;                 // number of ordinal categories, here K = 5
  array[K] int<lower=0> y_cancer; // counts among diseased patients
  array[K] int<lower=0> y_no_cancer; // counts among non-diseased patients

  vector<lower=0>[K] alpha_cancer;    // Dirichlet prior for diseased group
  vector<lower=0>[K] alpha_no_cancer; // Dirichlet prior for non-diseased group
}

parameters {
  simplex[K] theta; // response probabilities for diseased patients
  simplex[K] phi;   // response probabilities for non-diseased patients
}

model {
  theta ~ dirichlet(alpha_cancer);
  phi ~ dirichlet(alpha_no_cancer);

  y_cancer ~ multinomial(theta);
  y_no_cancer ~ multinomial(phi);
}

generated quantities {
  real A1;
  real A2;
  real auc;

  // A1 = P(Y > X)
  A1 =
    theta[2] * phi[1] +
    theta[3] * (phi[1] + phi[2]) +
    theta[4] * (phi[1] + phi[2] + phi[3]) +
    theta[5] * (phi[1] + phi[2] + phi[3] + phi[4]);

  // A2 = P(Y = X)
  A2 =
    theta[1] * phi[1] +
    theta[2] * phi[2] +
    theta[3] * phi[3] +
    theta[4] * phi[4] +
    theta[5] * phi[5];

  // AUC = P(Y > X) + 0.5 P(Y = X)
  auc = A1 + 0.5 * A2;
  
}
"

stan_data <- list(
  K = 5,
  y_cancer = c(1, 0, 6, 11, 12),
  y_no_cancer = c(9, 2, 11, 8, 0),
  # uniform Dirichlet prior
  alpha_cancer = rep(1, 5),
  alpha_no_cancer = rep(1, 5)
)


mod2 <- cmdstan_model(write_stan_file(stan_code))

fit <- mod2$sample(
  data = stan_data,
  chains = 4,
  parallel_chains = 4,
  iter_warmup = 4000,
  iter_sampling = 1000,
  seed = 123,
  show_messages = F
)

Kết quả posterior của AUC là:

Code
fit$summary(c("auc", "A1", "A2"), mean,sd, hdi)|>
 mutate(variable = c("AUC", "$P(Y > X)$", "$P(Y = X)$"))|>
 mutate(across(mean:upper, ~ round(.,2)))|>
 gt()%>%
  fmt_markdown(columns = everything())|>
 tab_spanner(
    label = md("Khoảng mật độ cao nhất 95%"),
    columns = c(lower, upper)
  )
variable mean sd
Khoảng mật độ cao nhất 95%
lower upper
AUC 0.78 0.05 0.68 0.88
P(Y > X) 0.69 0.06 0.57 0.81
P(Y = X) 0.19 0.03 0.12 0.25

20 Diễn giải AUC = 0.78

AUC trung bình posterior bằng 0.78.

Điều này có nghĩa là mammography có khả năng phân biệt khá tốt giữa người có ung thư và người không có ung thư.

Diễn giải lâm sàng:

Nếu chọn ngẫu nhiên một người có ung thư và một người không ung thư, xác suất mammography cho điểm cao hơn ở người có ung thư là khoảng 78%, sau khi tính cả trường hợp hai người có cùng điểm.

Đây là bằng chứng rằng điểm mammography chứa thông tin chẩn đoán thật sự, không phải chỉ là nhiễu ngẫu nhiên.

21 Diễn giải khoảng credible interval

Khoảng credible 95% cho AUC là:

(0.68, 0.88)

Theo Bayesian, điều này có thể diễn giải là:

Sau khi quan sát dữ liệu và kết hợp với prior, xác suất posterior rằng AUC nằm trong khoảng từ 0.68 đến 0.88 là 95%.

Khoảng này nằm hoàn toàn trên 0.5, nên có bằng chứng mạnh rằng mammography tốt hơn đoán ngẫu nhiên.

22 Diễn giải P(Y > X)

Kết quả:

P(Y > X) = 0.69

Điều này có nghĩa là xác suất người có ung thư có điểm cao hơn người không ung thư là khoảng 69%.

Đây là phần xếp hạng đúng rõ ràng, không tính trường hợp hòa điểm.

23 Diễn giải P(Y = X)

Kết quả:

P(Y = X) = 0.19

Điều này có nghĩa là xác suất người có ung thư và người không ung thư nhận cùng điểm là khoảng 19%.

Vì hai người có cùng điểm thì test không phân biệt được ai nguy cơ cao hơn, nên AUC chỉ cộng một nửa phần này:

\frac{1}{2} \times 0.19 = 0.095

Do đó:

AUC \approx 0.68 + 0.095 = 0.78

Kết quả này khớp với AUC khoảng 0.78.

24 Kiểm định Bayesian về tính hữu ích của test

Tài liệu xét giả thuyết:

H_0: AUC < 0.5

so với:

H_1: AUC \ge 0.5

Ở đây, 0.5 là mốc của một test vô dụng, tương tự như đoán ngẫu nhiên.

Kết quả:

P(AUC \ge 0.5 \mid data) = 0.99999

Điều này có nghĩa là, sau khi quan sát dữ liệu, xác suất posterior rằng mammography tốt hơn đoán ngẫu nhiên gần như bằng 1.

25 Kết luận lâm sàng từ kiểm định Bayesian

Ta có thể viết:

Dữ liệu cung cấp bằng chứng rất mạnh rằng mammography có khả năng phân biệt giữa người có ung thư và người không có ung thư tốt hơn mức ngẫu nhiên. AUC posterior trung bình là 0.78, với khoảng credible 95% từ 0.68 đến 0.88, cho thấy độ chính xác chẩn đoán ở mức trung bình đến khá tốt.

26 Những điều ROC không nói cho chúng ta biết

ROC và AUC rất hữu ích, nhưng không trả lời mọi câu hỏi.

AUC không trực tiếp cho biết:

  • Xác suất một bệnh nhân có ung thư nếu test dương tính.
  • Positive predictive value.
  • Negative predictive value.
  • Ngưỡng nào là tốt nhất cho thực hành lâm sàng.
  • Hậu quả lâm sàng của false positive và false negative.

Để ra quyết định lâm sàng, ta vẫn cần cân nhắc:

  • Mức độ nghiêm trọng của bệnh.
  • Chi phí và nguy cơ của xét nghiệm tiếp theo.
  • Hậu quả của bỏ sót bệnh.
  • Hậu quả của báo động sai.
  • Tỷ lệ bệnh trong quần thể.

27 ROC không phụ thuộc trực tiếp vào prevalence

Sensitivity và specificity được tính có điều kiện theo tình trạng bệnh:

Sensitivity = P(\text{test dương tính} \mid \text{có bệnh})

Specificity = P(\text{test âm tính} \mid \text{không bệnh})

Do đó ROC curve không phụ thuộc trực tiếp vào tỷ lệ bệnh trong mẫu nghiên cứu.

Tuy nhiên, trong thực hành lâm sàng, prevalence vẫn quan trọng vì nó ảnh hưởng đến positive predictive value và negative predictive value.

28 So sánh AUC với accuracy thông thường

Accuracy thông thường là:

Accuracy = P(\text{phân loại đúng})

Accuracy phụ thuộc vào một ngưỡng cụ thể.

AUC thì khác. AUC đánh giá toàn bộ khả năng phân biệt của điểm xét nghiệm trên tất cả các ngưỡng.

Vì vậy, AUC đặc biệt hữu ích khi ta chưa muốn chọn một cut-off cố định.

29 Một cách giảng cho sinh viên y khoa

Có thể nghĩ đơn giản như sau.

Giả sử ta lấy một bệnh nhân có ung thư và một bệnh nhân không ung thư.

Nếu test tốt, bệnh nhân có ung thư nên có điểm cao hơn.

Ta lặp lại việc so sánh này rất nhiều lần với nhiều cặp bệnh nhân.

AUC chính là tỷ lệ các lần test xếp đúng thứ tự, cộng thêm một nửa các lần hòa điểm.

Vì vậy, AUC là chỉ số đo khả năng xếp hạng bệnh nhân theo mức độ nghi ngờ bệnh.

30 Cách báo cáo trong bài nghiên cứu

Một đoạn báo cáo có thể viết như sau:

Hiệu năng chẩn đoán của mammography được đánh giá bằng đường cong ROC và diện tích dưới đường cong ROC. AUC trung bình posterior là 0.78, với khoảng credible 95% từ 0.68 đến 0.88. Kết quả này cho thấy mammography có khả năng phân biệt từ trung bình đến khá tốt giữa phụ nữ có ung thư vú và phụ nữ không có ung thư vú. Xác suất hậu nghiệm rằng AUC lớn hơn 0.5 xấp xỉ 0.99999, cho thấy bằng chứng rất mạnh rằng xét nghiệm này tốt hơn phân loại ngẫu nhiên.

31 Tóm tắt cuối bài

ROC curve mô tả sự đánh đổi giữa sensitivity và false positive fraction khi thay đổi ngưỡng chẩn đoán.

AUC tóm tắt toàn bộ ROC curve thành một con số duy nhất.

AUC có diễn giải xác suất rất trực quan:

AUC = P(Y > X) + \frac{1}{2}P(Y = X)

Trong ví dụ mammography:

  • AUC khoảng 0.78.
  • Khoảng credible 95% nằm trên 0.5.
  • Xác suất hậu nghiệm rằng AUC lớn hơn 0.5 gần như bằng 1.

Do đó, mammography trong ví dụ này có khả năng phân biệt người có ung thư và người không có ung thư tốt hơn rõ rệt so với đoán ngẫu nhiên.