Làm thế nào để xác định điểm cắt tốt nhất và khoảng tin cậy của nó bằng đường cong ROC trong R?


51

Tôi có dữ liệu của một xét nghiệm có thể được sử dụng để phân biệt các tế bào khối u và bình thường. Theo đường cong ROC, nó có vẻ tốt cho mục đích này (diện tích dưới đường cong là 0,9):

Đường cong ROC

Câu hỏi của tôi là:

  1. Làm thế nào để xác định điểm cắt cho bài kiểm tra này và khoảng tin cậy của nó trong đó bài đọc nên được đánh giá là mơ hồ?
  2. Cách tốt nhất để hình dung điều này (sử dụng ggplot2) là gì?

Đồ thị được hiển thị bằng cách sử dụng ROCRggplot2các gói:

#install.packages("ggplot2","ROCR","verification") #if not installed yet
library("ggplot2")
library("ROCR")
library("verification")
d <-read.csv2("data.csv", sep=";")
pred <- with(d,prediction(x,test))
perf <- performance(pred,"tpr", "fpr")
auc <-performance(pred, measure = "auc")@y.values[[1]]
rd <- data.frame(x=perf@x.values[[1]],y=perf@y.values[[1]])
p <- ggplot(rd,aes(x=x,y=y)) + geom_path(size=1)
p <- p + geom_segment(aes(x=0,y=0,xend=1,yend=1),colour="black",linetype= 2)
p <- p + geom_text(aes(x=1, y= 0, hjust=1, vjust=0, label=paste(sep = "", "AUC = ",round(auc,3) )),colour="black",size=4)
p <- p + scale_x_continuous(name= "False positive rate")
p <- p + scale_y_continuous(name= "True positive rate")
p <- p + opts(
            axis.text.x = theme_text(size = 10),
            axis.text.y = theme_text(size = 10),
            axis.title.x = theme_text(size = 12,face = "italic"),
            axis.title.y = theme_text(size = 12,face = "italic",angle=90),
            legend.position = "none",
            legend.title = theme_blank(),
            panel.background = theme_blank(),
            panel.grid.minor = theme_blank(), 
            panel.grid.major = theme_line(colour='grey'),
            plot.background = theme_blank()
            )
p

data.csv chứa dữ liệu sau:

x;group;order;test
56;Tumor;1;1
55;Tumor;1;1
52;Tumor;1;1
60;Tumor;1;1
54;Tumor;1;1
43;Tumor;1;1
52;Tumor;1;1
57;Tumor;1;1
50;Tumor;1;1
34;Tumor;1;1
24;Normal;2;0
34;Normal;2;0
22;Normal;2;0
32;Normal;2;0
25;Normal;2;0
23;Normal;2;0
23;Normal;2;0
19;Normal;2;0
56;Normal;2;0
44;Normal;2;0

Câu trả lời:


30

Cảm ơn tất cả những người đã hỏi câu hỏi này. Tôi đồng ý rằng không thể có ai trả lời đúng và tiêu chí phụ thuộc rất nhiều vào các mục tiêu đứng sau thử nghiệm chẩn đoán nhất định.

Cuối cùng tôi đã tìm thấy gói R OptimalCutpoint dành riêng cho việc tìm điểm cắt trong loại phân tích như vậy. Trên thực tế có một số phương pháp xác định điểm cắt.

  • "CB" (phương pháp lợi ích chi phí);
  • "MCT" (giảm thiểu Điều khoản Chi phí Phân loại sai);
  • "MinValueSp" (giá trị tối thiểu được đặt cho Độ đặc hiệu);
  • "MinValueSe" (giá trị tối thiểu được đặt cho Độ nhạy);
  • "RangeSp" (một phạm vi các giá trị được đặt cho Độ đặc hiệu);
  • "RangeSe" (một phạm vi các giá trị được đặt cho Độ nhạy);
  • "ValueSp" (một giá trị được đặt cho Tính đặc hiệu);
  • "ValueSe" (giá trị được đặt cho Độ nhạy);
  • "MinValueSpSe" (giá trị tối thiểu được đặt cho Độ đặc hiệu và Độ nhạy);
  • "MaxSp" (tối đa hóa Độ đặc hiệu);
  • "MaxSe" (tối đa hóa độ nhạy);
  • "MaxSpSe" (tối đa hóa độ nhạy và độ đặc hiệu đồng thời);
  • "Max-SumSpSe" (tối đa hóa độ nhạy và độ đặc hiệu);
  • "MaxProdSpSe" (tối đa hóa sản phẩm của Độ nhạy và Độ đặc hiệu);
  • "ROC01" (thu nhỏ khoảng cách giữa ô ROC và điểm (0,1));
  • "SpEqualSe" (Độ nhạy = Độ đặc hiệu);
  • "Youden" (Chỉ số Youden);
  • "Hiệu suất tối đa" (tối đa hóa hiệu quả hoặc độ chính xác);
  • "Minimax" (giảm thiểu lỗi thường xuyên nhất);
  • "AUC" (tối đa hóa sự phù hợp là chức năng của AUC);
  • "MaxDOR" (tối đa hóa tỷ lệ cược chẩn đoán);
  • "MaxKappa" (tối đa hóa chỉ số Kappa);
  • "MaxAccuracyArea" (tối đa hóa Khu vực chính xác);
  • "MinErrorRate" (giảm thiểu tỷ lệ lỗi);
  • "MinValueNPV" (giá trị tối thiểu được đặt cho Giá trị dự đoán âm);
  • "MinValuePPV" (giá trị tối thiểu được đặt cho Giá trị dự đoán tích cực);
  • "MinValueNPVPPV" (giá trị tối thiểu được đặt cho các Giá trị Dự đoán);
  • "PROC01" (giảm thiểu khoảng cách giữa âm mưu PROC và điểm (0,1));
  • "NPVEqualPPV" (Giá trị dự đoán tiêu cực = Giá trị dự đoán tích cực);
  • "ValueDLR.Negative" (một giá trị được đặt cho Tỷ lệ khả năng chẩn đoán âm tính);
  • "ValueDLR.Positive" (một giá trị được đặt cho Tỷ lệ khả năng chẩn đoán dương tính);
  • "MinPvalue" (tối thiểu hóa giá trị p liên quan đến phép thử Chi bình phương thống kê để đo mối liên quan giữa điểm đánh dấu và kết quả nhị phân thu được khi sử dụng điểm cắt);
  • "ObservedPrev" (Giá trị gần nhất với tỷ lệ lưu hành quan sát);
  • "MeanPrev" (Giá trị gần nhất với giá trị trung bình của các giá trị kiểm tra chẩn đoán);
  • "PrevalenceMatching" (Giá trị dự đoán tỷ lệ lưu hành thực tế bằng với tỷ lệ lưu hành quan sát được).

Vì vậy, bây giờ nhiệm vụ được thu hẹp để chọn phương thức phù hợp nhất cho từng tình huống.

Có nhiều tùy chọn cấu hình khác được mô tả trong tài liệu gói bao gồm một số phương pháp xác định khoảng tin cậy và mô tả chi tiết của từng phương pháp.


18
Số lượng phương pháp tuyệt đối là một dấu hiệu của sự tùy tiện của việc cắt. Và vì hoàn toàn không phù hợp để sử dụng các điểm cắt trên các biến đầu vào và chỉ thích hợp để tìm kiếm ở mức cắt (nếu bạn phải) trên một giá trị dự đoán tổng thể, không rõ tại sao phải bỏ ra rất nhiều nỗ lực cho việc này. Nếu bạn thiết lập quy tắc quyết định tối ưu Bayes với chức năng mất, mọi thứ sẽ được xử lý; không có đường cong ROC, không có xác suất ngược thời gian như độ nhạy và độ đặc hiệu, không bị cắt trên các biến đầu vào.
Frank Harrell

@FrankHarrell Bạn có thể giải thích về điều này? "Nếu bạn thiết lập quy tắc quyết định tối ưu Bayes với chức năng mất, mọi thứ sẽ được xử lý." Tôi có thể tìm thêm tài liệu về điều này ở đâu?
Sữa đen

1
Nhìn vào tài liệu về các quyết định tối ưu của Bayes và các quy tắc chấm điểm thích hợp.
Frank Harrell

26

Theo tôi, có nhiều lựa chọn giới hạn. Bạn có thể cân nhắc độ nhạy và độ đặc hiệu khác nhau (ví dụ, có thể đối với bạn, điều quan trọng hơn là phải có xét nghiệm có độ nhạy cao mặc dù điều này có nghĩa là có xét nghiệm cụ thể thấp. Hoặc ngược lại).

Nếu độ nhạy và độ đặc hiệu có cùng tầm quan trọng với bạn, một cách tính điểm cắt là chọn giá trị đó giảm thiểu khoảng cách Euclide giữa đường cong ROC của bạn và góc trên bên trái của biểu đồ.

Một cách khác là sử dụng giá trị tối đa hóa (độ nhạy + độ đặc hiệu - 1) làm điểm cắt.

Thật không may, tôi không có tài liệu tham khảo cho hai phương pháp này vì tôi đã học chúng từ các giáo sư hoặc các nhà thống kê khác. Tôi chỉ nghe nói đến phương pháp sau là 'Chỉ số của Youden' [1]).

[1] https://en.wikipedia.org/wiki/Youden%27s_J_statistic


15

Chống lại sự cám dỗ để tìm ra một điểm cắt. Trừ khi bạn có chức năng tiện ích / tổn thất / chi phí được chỉ định trước, một điểm cắt sẽ xuất hiện khi đối mặt với việc ra quyết định tối ưu. Và một đường cong ROC không liên quan đến vấn đề này.


7

Về mặt toán học, bạn cần một điều kiện khác để giải quyết vấn đề.

Bạn có thể dịch quan điểm của @ Andrea thành: "sử dụng kiến ​​thức bên ngoài về vấn đề tiềm ẩn".

Điều kiện ví dụ:

  • đối với ứng dụng này, chúng tôi cần độ nhạy> = x và / hoặc độ đặc hiệu> = y.

  • âm tính giả là 10 x xấu như dương tính giả. (Điều đó sẽ cung cấp cho bạn một sửa đổi về điểm gần nhất với góc lý tưởng.)


1
Chính xác là bạn cần có kiến ​​thức bên ngoài để có được quyết định tối ưu. Nhưng hàm mất mát không được nêu theo các đại lượng ở trên và quyết định tối ưu xuất phát từ xác suất dự đoán kết quả cho từng đối tượng, cùng với hàm mất.
Frank Harrell

6

Hình dung độ chính xác so với ngưỡng. Bạn có thể đọc thêm chi tiết tại tài liệu ROCR và trình bày rất hay từ cùng.

nhập mô tả hình ảnh ở đây


1
Nếu bạn nhìn kỹ hơn vào mã nguồn, tôi đã sử dụng gói này và đọc tài liệu về gói này. Nó không có công cụ để xác định các điểm cắt và "vùng xám" bên phải
Yuriy Petrovskiy

1
Tôi chắc chắn đã đọc mã của bạn nhưng không có thuật ngữ nào là "cắt đúng" nhưng cốt truyện Chính xác và cắt có thể cung cấp cho bạn cái nhìn sâu sắc chính xác. Và sử dụng cốt truyện này, bạn có thể tìm ra cách tìm ra điểm cắt để có độ chính xác tối đa.
Vladimir Chupakhin

2

Điều quan trọng hơn - có rất ít điểm dữ liệu đằng sau đường cong này. Khi bạn quyết định làm thế nào bạn sẽ tạo ra sự đánh đổi độ nhạy / độ đặc hiệu, tôi rất khuyến khích bạn khởi động lại đường cong và số lượng kết quả. Bạn có thể thấy rằng có rất nhiều sự không chắc chắn trong ngưỡng cắt tốt nhất ước tính của bạn.


1
Thí nghiệm vẫn đang được tiến hành, vì vậy tôi sẽ nhận được nhiều điểm dữ liệu hơn. Tôi quan tâm đến phương pháp luận (tôi nghĩ nó giống nhau cho bất kỳ số điểm dữ liệu nào). Và tôi đã không tìm thấy bất kỳ phương pháp thống kê nào để xác định "vùng xám" trong khi nó được sử dụng rộng rãi trong các thử nghiệm loại đó.
Yuriy Petrovskiy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.