이 노트북은 RJafroc 패키지를 활용하여 MRMC(Multi-Reader Multi-Case) 연구 데이터를 시뮬레이션하고 분석하는 과정을 담고 있습니다.
분석에 필요한 라이브러리를 로드합니다.
# 패키지 로드
if(!require(RJafroc)) install.packages("RJafroc")
if(!require(tidyverse)) install.packages("tidyverse")
library(RJafroc)
library(tidyverse)
library(ggplot2)
# 재현성을 위한 시드 설정
set.seed(2024)
Nico Karssemeijer ROC dataset (CAD vs. radiologists)
이 책에서는 이를 “NICO” 데이터셋이라고 부릅니다. 이 데이터셋은 유방조영술 이미지 200개로 구성되어 있으며, 그중 80개에는 악성 종양이 하나씩 포함되어 있습니다. 이 이미지들은 CAD 시스템과 9명의 영상의학과 전문의가 LROC 패러다임을 사용하여 판독했습니다. 첫 번째 판독은 CAD 시스템이 수행했으며, 가장 높은 등급을 사용하여 이를 ROC 데이터셋으로 변환했습니다.
(https://dpc10ster.github.io/RJafroc/reference/dataset09.html)
dataset <- dataset09
# 데이터셋 구조 요약 확인
str(dataset)
## List of 3
## $ ratings :List of 3
## ..$ NL : num [1, 1:10, 1:200, 1] 28 0 14 0 16 0 31 0 0 0 ...
## ..$ LL : num [1, 1:10, 1:80, 1] 29 12 13 10 41 67 61 51 67 0 ...
## ..$ LL_IL: logi NA
## $ lesions :List of 3
## ..$ perCase: num [1:80] 1 1 1 1 1 1 1 1 1 1 ...
## ..$ IDs : num [1:80, 1] 1 1 1 1 1 1 1 1 1 1 ...
## ..$ weights: num [1:80, 1] 1 1 1 1 1 1 1 1 1 1 ...
## $ descriptions:List of 7
## ..$ fileName : chr "dataset09"
## ..$ type : chr "ROC"
## ..$ name : chr "NICO-CAD-ROC"
## ..$ truthTableStr: num [1, 1:10, 1:200, 1:2] 1 1 1 1 1 1 1 1 1 1 ...
## ..$ design : chr "FCTRL"
## ..$ modalityID : chr "1"
## ..$ readerID : chr [1:10] "1" "2" "3" "4" ...
독립형 CAD와 최소 두 명의 영상의학 전문의가 동일한 사례를 판독한 결과를 비교해야 합니다. 독립형 CAD란 CAD 알고리즘이 생성한 모든 설계자 수준의 마크-평가 쌍을 분석가가 이용할 수 있다는 것을 의미하며, 영상의학 전문의에게는 사례당 한두 개의 마크(평가 점수가 미리 설정된 임계값을 초과하는 마크)만 표시되는 것이 아닙니다. 최소한 LROC 패러다임과 같은 위치 수준 정보를 사용해야 하며, 이상적으로는 FROC 패러다임을 사용해야 합니다. ROC 패러다임을 사용할 경우 통계적 검정력이 크게 저하됩니다.
<(https://dpc10ster.github.io/RJafroc/reference/StCadVsRad.html)>
result_or <- StSignificanceTestingCadVsRad(dataset, "Wilcoxon",
plots = TRUE)
# 1. AUC 추정치 (AUC Estimates)
print("--- AUC Estimates per CAD ---")
## [1] "--- AUC Estimates per CAD ---"
print(result_or$fomCAD)
## [1] 0.8169271
print("--- AUC Estimates per RAD ---")
## [1] "--- AUC Estimates per RAD ---"
print(result_or$fomRAD)
## [1] 0.8415625 0.8411979 0.8997396 0.8381250 0.8563542 0.8786979 0.8583854
## [8] 0.7970312 0.8268750
# 2. 모달리티 간 차이 검정 (T-Statistics)
print("--- T-Statistics ---")
## [1] "--- T-Statistics ---"
print(result_or$Tstat)
## rdr2
## 0.9928689
해석: 위 결과의
T-Statistics값이 0.05 미만이면, 진단 성능 차이가 통계적으로 유의미하다고 볼 수 있으나 결과 값에 따르면 귀무가설을 기각할 수 없는 결과를 보여줍니다.
내장 함수를 사용하여 ROC 곡선을 그립니다.
result_or$Plots
모달리티 간의 성능 변화를 더 명확히 보기 위해 ggplot2를
사용하여 막대 그래프를 그립니다.
# 결과 객체에서 데이터 추출
fomCAD <- result_or$fomCAD
fomRAD <- result_or$fomRAD
# Create a data frame
df <- data.frame(
Modality = c("CAD", rep("RAD", length(fomRAD))),
Reader = c("CAD", paste0("RAD", 1:length(fomRAD))),
FOM = c(fomCAD, fomRAD)
)
# Plot
ggplot(df, aes(x = Reader, y = FOM, fill = Modality)) +
geom_bar(stat = "identity", width = 0.7) +
geom_text(aes(label = round(FOM, 3)),
vjust = -0.5, size = 3.5) +
labs(
title = "Comparison of CAD and RAD",
y = "ROC Value",
x = "Reader"
) +
scale_fill_manual(values = c("CAD" = "#999999", "RAD" = "#E69F00")) +
theme_bw() +
coord_cartesian(ylim = c(0.75, 0.95))