제6장
분석물을 정밀하게 측정하는 검사는 첫 관문을 통과했을 뿐이다. 이 장은 그다음 관문을 다룬다. 측정값이 질환이 있는 사람과 없는 사람을 가려내는지, 환자의 경과를 예측하는지, 치료 반응을 따라가는지, 그리고 임상의가 이미 아는 정보에 무엇을 더하는지를 보이는 일이다.
제5장은 분석적 검증, 곧 검사가 분석물을 정확하고 재현성 있게, 안정적으로 측정하는지를 다루었다. 임상적 검증은 전혀 다른 질문을 던진다. 믿을 수 있는 측정값이 주어졌을 때, 그 값이 환자의 임상 상태에 관한 정보를 담고 있는가? 변동계수가 아무리 뛰어난 트로포닌 검사라도 선택한 절단값이 심근경색 대부분을 놓친다면 진단 검사로서는 쓸모가 없다. 한 병원에서 인상적인 위험비를 보인 예후 점수가 다음 병원에서 무너지는 일도 흔한데, 첫 연구가 바이오마커에 유리한 방식으로 환자를 골랐기 때문인 경우가 많다. WIA-BIO-004는 이 단계를 여러 곳에서 다룬다. §4와 §5의 통계 방법, §6의 임상 상관 분석 방법, §7.2의 검증 연구 레코드, 품질 지표 단계 문서의 "Clinical Validation Metrics"와 "Clinical Utility Metrics" 절, README의 일곱 가지 검증 요구사항, 그리고 SDK 타입 ClinicalCorrelation, PrognosticAnalysis, TreatmentResponse, ValidationStudy가 그것이다.
이 장은 실제 검증 프로그램이 진행되는 순서를 따른다. 연구를 설계하고, 규모를 정하고, 모델을 내부·외부에서 검증한 뒤, 병기·예후·치료와 바이오마커의 관계를 살피고, 마지막으로 그 바이오마커가 의사결정을 개선하는지를 묻는다. 제2장의 통계(혼동행렬, ROC-AUC, 우도비)는 이미 알고 있다고 전제한다. 여기서는 그 도구를 숫자 표가 아니라 연구 대상 집단에 적용한다.
민감도와 특이도를 가장 빨리 추정하는 방법은 환자-대조군(two-gate) 설계다. 진단이 이미 확정된 환자를 모으고, 별도로 대조군을 모은 뒤, 양쪽에서 바이오마커를 측정해 혼동행렬을 만든다. 효율이 높아 발굴 단계는 거의 언제나 여기서 시작한다. 약점은 두 집단이 양 극단에서 선택된다는 점이다. 환자군은 진행된 병기에 증상이 뚜렷하고 기록이 잘 갖춰진 사람들로, 대조군은 건강한 자원자로 채워지기 쉽다. 바이오마커는 거의 모든 면에서 다른 두 집단을 구분하라는 과제를 받게 되고, 대개 실제 진료에서보다 더 잘 해낸다.
전향적 코호트(single-gate) 설계는 임상 질문이 실제로 생기는 환자를 연속으로 등록한다. 흉통으로 내원한 모든 환자, 영상에서 의심 소견이 나와 의뢰된 모든 환자가 그 예다. 등록 시점에 바이오마커를 측정하고 참조 표준을 전원에게 적용한다. 이렇게 얻은 질환 중증도의 분포와 유사 질환의 구성이 실제 사용 환경과 일치하므로, 정확도 추정치를 진료 현장에 그대로 옮길 수 있다. 대가는 규모와 시간이다. 등록자의 5분의 1만 질환을 가진다면 환자 한 명마다 비환자 네 명을 모아야 한다.
스펙트럼 편향(spectrum bias)은 앞에서 설명한 왜곡, 즉 누구를 검사하느냐에 따라 정확도가 달라지는 현상이다. 전이암 환자와 젊은 건강 공여자를 비교해 평가한 바이오마커는, 같은 분석물을 올리는 양성 질환 환자와 조기 병기 환자를 비교해 평가할 때보다 AUC가 높게 나온다. WIA-BIO-004 검증 연구 레코드는 연령 범위, 성별 분포, 인종 구성을 담은 population 블록을 두어 스펙트럼을 드러내도록 한다. 구현자는 여기에 더해 병기와 대조군의 출처도 기록해야 하며, SDK에서는 PatientSample.diseaseStage와 medicalHistory가 그 자리를 제공한다.
확인 편향(verification bias)은 일부 참여자, 흔히 바이오마커 양성인 사람에게만 참조 표준을 적용할 때 생긴다. 바이오마커 음성인 사람 가운데 놓친 환자는 끝내 발견되지 않으므로 민감도가 과대 추정된다. 편입 편향(incorporation bias)은 바이오마커 자체가 참조 진단에 관여할 때, 판독 편향(review bias)은 참조 표준을 판독하는 사람이 바이오마커 결과를 알거나 그 반대일 때 생긴다.
README의 네 번째 요구사항은 이 가운데 마지막 문제를 직접 다룬다. 측정은 임상 상태를 모르는 상태에서 이루어져야 한다. 데이터 파이프라인에서는 이것이 구체적인 통제 장치가 된다. 바이오마커 레코드를 생성하는 검사실 시스템은 diseaseStatus 없이 코드화된 검체 식별자만 받아야 하고, 결과와의 연결은 측정값이 확정된 뒤에만 이루어져야 한다. §7.1 측정 레코드는 이를 지원한다. 측정 시점에는 clinicalContext.diseaseStatus를 null로 두었다가 나중에 채울 수 있기 때문이다.
모든 정확도 추정치는 참조 표준에 상대적이다. 많은 암에서는 조직병리, 심근 손상에서는 관상동맥 조영술이나 심근경색의 보편적 정의, 감염에서는 배양이나 시퀀싱이 참조 표준 역할을 한다. §7.2 레코드는 이를 referenceStandard에 방법 이름과 참조 표준 자체의 민감도·특이도로 저장하며, 관례상 100/100을 적는다. 두 값을 100으로 두는 것은 측정이 아니라 가정이다. 판정위원회처럼 참조 표준이 불완전하다고 알려진 경우에는 SDK 필드 referenceStandard.description에 그 사실을 밝혀야 한다. 불완전한 참조 표준은 바이오마커의 겉보기 정확도를 흔히 낮추는 쪽으로 왜곡하기 때문이다.
WIA-BIO-004 §4.3.2는 세 단계와 각 단계의 최소 권장 규모를 제시하고, SDK의 ValidationStudy.studyType은 같은 흐름에 다기관 변형을 더해 열거한다. 품질 지표 단계 문서는 뒤쪽 단계에 더 큰 범위를 제시한다. 아래 표는 두 출처를 나란히 놓은 것이다. 어느 쪽도 통계적 검정력 계산은 아니며, 그 계산은 6.2절에서 다룬다.
| 단계 | SDK studyType | §4.3.2 최소 규모 | 품질 지표 문서 | 핵심 질문 |
|---|---|---|---|---|
| 발굴 | discovery | 환자 50, 대조군 50 | 언급 없음 | 추적할 가치가 있는 신호가 있는가? |
| 임상적 검증 | validation, multi_center | 환자 100, 대조군 100 | n = 200–500+ | 고정된 검사가 실제 사용 집단에서 얼마나 정확한가? |
| 임상적 유용성 | clinical_utility | 환자 200+, 대조군 200+ | n = 500–1000+ | 검사를 쓰면 진료와 결과가 달라지는가? |
여기서 두 숫자를 구분해야 한다. README는 초기 검증에 "환자 100명, 대조군 100명 이상"을 요구하지만, SDK 상수 MIN_VALIDATION_SAMPLES = 100은 측정값의 총수를 검사한다. 따라서 환자 70명, 대조군 30명인 데이터셋은 SDK 검사를 통과하면서도 README 요구사항은 충족하지 못한다. 적합한 파이프라인은 둘 다 검사하고, population 블록에 집단별 인원을 보고해야 한다.
다음 점검표는 README의 요구사항과 확립된 보고 관행을 합친 것이다. 진단 정확도 연구에는 STARD 성명이 통상적인 보고 지침이고 QUADAS-2가 편향 위험을 평가하는 통상적인 도구다. 종양 예후 표지자에는 REMARK 지침이, 다변량 예측 모델에는 TRIPOD가 같은 역할을 한다. 표준이 이들 가운데 어느 것도 의무로 정하지는 않지만, 이런 지침을 따른 검증 보고서는 감사하기가 훨씬 쉽다.
| 항목 | 정해야 할 내용 | 기록 위치 |
|---|---|---|
| 사용 목적 | 진단·예후·예측·모니터링 가운데 어떤 역할인지, 대상 집단, 영향을 받는 임상 결정 | 바이오마커 정의(indication), 연구 계획서 |
| 설계 | 환자-대조군 또는 연속 등록 코호트, 단일기관 또는 다기관 | studyType |
| 스펙트럼 | 포함한 병기, 대조군의 출처와 유형(유사 질환 포함 여부) | population, PatientSample.diseaseStage |
| 참조 표준 | 방법, 검체 채취와의 시간 간격, 전원 적용 여부 | referenceStandard |
| 눈가림 | 검사실은 임상 상태를 모르고, 참조 판독자는 바이오마커 결과를 모름(README 요구사항 4) | 연구 계획서, 측정 확정 뒤에만 diseaseStatus 입력 |
| 절단값 | 사전에 정한 값 또는 선택 규칙(제2장), 검증 데이터에서 다시 조정하지 않음 | rocAnalysis.optimalThreshold |
| 표본 크기 | 목표 정밀도 또는 검정력, 집단별 인원(README 요구사항 1–2) | population.cases, controls |
| 독립 코호트 | 독립된 집단 2개 이상(README 요구사항 3) | validation.validationCohorts |
| 검체 전 단계 | 채취·보관 조건의 통제와 문서화(README 요구사항 7, 제5장) | qualityFlags, sampleType |
| 결측·판정 불가 결과 | 제외·플래그·대체한 검체를 어떻게 셀 것인가 | 보고서 본문, 검체별 플래그 |
민감도(또는 특이도)를 정해진 폭의 신뢰구간으로 추정하는 것이 목표라면, 품질 지표 단계 문서가 제시하는 정규근사 공식을 쓴다.
n = Z² × p × (1 − p) / d²
Z = 1.96 (양측 95 % 신뢰수준)
p = 기대 민감도(또는 특이도)
d = 신뢰구간의 목표 반폭
예: p = 0.90, d = 0.05
n = 3.8416 × 0.90 × 0.10 / 0.0025 = 138.3 → 질환자 139명
단계 문서는 결과를 138로 적지만 표본 크기는 올림하는 것이 원칙이므로 엄밀한 답은 139다. 차이 자체는 대수롭지 않다. 특이도에도 같은 계산을 비질환자 수에 대해 따로 적용한다. 흔히 놓치는 점이 두 가지 있다. 첫째, p는 p(1 − p) 형태로 들어가므로 기대값이 낮을수록 더 많은 인원이 필요하다. p = 0.84, d = 0.05이면 약 207명으로 늘어난다. 둘째, 계산 결과는 환자 수다. 등록자 가운데 질환자 비율이 π인 전향적 코호트라면 총 등록 인원은 n / π가 된다. π = 0.20(예시 값)이면 환자 139명을 얻기 위해 약 695명을 등록해야 한다.
연속형 바이오마커에서 관심 대상은 대개 AUC다. 제2장에서 소개하고 명세 §10.3에 실린 Hanley·McNeil 표준오차를 거꾸로 이용할 수 있다. 기대 AUC와 집단 크기를 정해 표준오차를 구하고, 1.96 × SE가 원하는 반폭에 이를 때까지 집단을 키운다. 두 집단의 크기가 같고 기대 AUC가 0.85일 때, 반폭은 집단당 44명에서 약 0.082, 100명에서 약 0.054이며, 집단당 약 117명에서 0.05 아래로 내려간다. Obuchowski의 방법은 이 발상을 두 AUC의 비교와 군집 설계로 확장한다. 이를 구현한 전용 소프트웨어는 널리 쓰인다.
§4.3.2와 부록 A.2의 공식에 대하여. 명세는 n = (Zα + Zβ)² · AUC(1 − AUC) / [(AUC − 0.5)² · 유병률 · (1 − 유병률)]을 제시하고, 부록 A.2에서 기대 AUC 0.85에 대해 "환자 44명, 대조군 44명"을 도출한다(실제 계산값은 약 43.7이다). 이 식은 ROC 연구의 표본 크기 산정법으로 확립된 방법이 아니며, 집단당 44명은 적절한 설계 목표가 아니다. 앞에서 본 것처럼 그 규모로는 AUC 신뢰구간이 대략 ±0.08이나 된다. 따라서 이 책은 정밀도 기반 산정(6.2.1)이나 Hanley–McNeil·Obuchowski 방식(6.2.2)으로 규모를 정하고, §4.3.2의 단계별 최소 규모는 계산 결과가 아니라 하한선으로 취급할 것을 권한다.
README의 두 번째 요구사항은 임상적으로 의미 있는 차이를 검출할 검정력을 80 % 이상 확보하라고 한다. 이 요구는 그 차이를 명시했을 때만 의미를 가진다. 예컨대 "새 바이오마커의 AUC가 기존 바이오마커보다 0.05 이상 높다"처럼 정해야 한다. 두 바이오마커를 같은 사람에게서 측정하므로 산정은 앞서 말한 상관된 AUC 비교 방법을 따른다. 어떤 방법을 쓰든 손실분만큼 계획 인원을 늘려야 한다. 분석 가능한 인원 n과 탈락·용혈 등으로 쓸 수 없는 검체의 기대 비율 r에 대해 n / (1 − r)명을 등록한다. n = 139, r = 0.10이면 155명이다. 품질 문제로 제외한 검체도 레코드와 플래그를 남겨 두어야 손실률 자체를 감사할 수 있다.
같은 데이터로 절단값을 고르거나 분석물을 선택하거나 가중치를 적합한 뒤 그 데이터로 정확도를 재면 결과는 위쪽으로 치우친다. 절단값을 미리 정한 단일 바이오마커에서는 편향이 작고, 다중 바이오마커 점수에서는 크다. 품질 지표 문서는 이런 복합 점수를 정규화된 값의 가중합 Score = Σ(wᵢ × xᵢ)로 정의한다. 후보 분석물이 20개이고 참여자가 100명이면, 어떤 가중치 조합은 순전히 우연으로 환자와 대조군을 거의 완벽하게 가를 것이고, 그 구분은 새 환자에게서 재현되지 않는다.
단계 문서는 k-겹 교차검증(보통 k = 5 또는 10), 소규모 데이터를 위한 LOOCV(leave-one-out), 그리고 기준 방법으로서의 독립 검증 코호트를 나열한다. k-겹 교차검증에서는 데이터를 k개로 나누어 k − 1개로 모델을 만들고 나머지 하나로 평가하며, k개 추정치를 평균한다. 핵심 규칙은 데이터에 의존하는 모든 단계, 곧 분석물 선택, 정규화 매개변수, 가중치 적합, 절단값 선택을 각 훈련 폴드 안에서 반복해야 한다는 것이다. 전체 데이터로 분석물을 고른 뒤 가중치만 교차검증하면, 교차검증으로 없애려던 낙관성이 그대로 되살아난다. 무작위 분할을 바꿔 k-겹을 반복하면 추정치의 분산이 줄어든다. SDK의 ValidationStudy.crossValidation 객체에는 이를 위한 필드 method, folds, iterations, averageAUC, aucStdDev가 있다.
LOOCV는 k가 표본 크기와 같은 특수한 경우다. 데이터를 효율적으로 쓰지만 추정치의 변동이 클 수 있고, 외부 코호트를 대신하지 못한다. §7.2 레코드는 선택한 방식을 "10-fold" 같은 문자열로 저장한다.
외부 검증은 분석물·가중치·절단값을 모두 고정한 모델을 다른 기관, 다른 시기, 다른 집단의 참여자에게 적용하는 것이다. README 요구사항 3은 독립된 집단을 두 개 이상 요구한다. 개발 코호트에서 외부 코호트로 넘어갈 때 AUC가 떨어지는 것은 예상된 일이고 그 자체로 정보가 된다. 크게 떨어진다면 과적합이나 스펙트럼 차이를 의심해야 한다. §7.2 레코드는 외부 코호트마다 크기와 AUC를 나열하고, SDK는 여기에 고정 절단값에서의 민감도와 특이도를 더한다. 임상 사용자가 실제로 겪는 것은 바로 이 숫자들이다.
하위집단 분석은 연령, 성별, 인종, 병기, 동반질환에 걸쳐 성능이 일관적인지를 묻는다. §7.2 예시는 60세를 기준으로 집단을 나눈다. 하위집단 AUC는 전체 AUC보다 정밀도가 낮으므로 신뢰구간과 함께 보고해야 하고, 하위집단 간 차이는 점추정치를 눈으로 비교할 것이 아니라 정식으로 검정해야 한다. 여러 하위집단을 뒤져 찾아낸 결과보다 미리 정한 짧은 목록이 더 신뢰를 얻는다.
다중 바이오마커 모델이 확률을 출력한다면(SDK의 predictOutcome이 로지스틱 모델로 하듯이, 제4장 참조) 판별력만으로는 부족하다. 예측 확률이 관찰된 사건 발생률과도 일치해야 한다. 보정(calibration)은 흔히 외부 코호트에서의 보정 그림, 보정 기울기(이상값 1), 전체 보정 절편(이상값 0)으로 요약한다. WIA-BIO-004 v1.0에는 보정 결과를 담을 필드가 없다. 필드가 생기기 전까지는 보정 결과를 보고서 본문에 적어야 하며, 제8장은 이를 미해결 과제로 꼽는다.
많은 바이오마커는 질환의 중증도에 따라 오르거나 내릴 것으로 기대된다. 명세 §6.1은 이 관계를 위한 세 가지 분석을 명시한다. 명세의 예시는 네 병기의 평균을 50, 75, 120, 180 단위로, Spearman 상관계수를 0.85로 제시하는데, 이는 보고 형태를 보여 주기 위한 예시 값이지 실제 연구 결과가 아니다.
| 방법 | 답하는 질문 | 가정과 유의점 |
|---|---|---|
| Spearman 순위상관(ρ) | 바이오마커가 병기와 단조적으로 연관되는가? | 순위 기반이라 서열형 병기와 치우친 측정값에 적합하다. 병기 순위에 동순위가 많으면 정보량이 줄어든다 |
| Kruskal–Wallis 검정 | 어느 병기 사이에서든 바이오마커 분포가 다른가? | 병기의 순서를 무시한다. 유의한 결과가 추세를 뜻하지는 않는다 |
| 추세 검정(예: Jonckheere–Terpstra, 병기 점수에 대한 선형회귀) | 병기에 따라 순서 있는 증가·감소가 있는가? | 순서를 이용하므로 단조 추세가 예상될 때 Kruskal–Wallis보다 검정력이 높다 |
바이오마커 농도는 오른쪽으로 치우친 경우가 많으므로, 병기별로 평균과 표준편차보다 중앙값과 사분위범위를 보고하는 편이 더 많은 정보를 준다. 모수 모형을 쓰고 싶다면 로그 변환을 하면 잔차가 정규분포에 가까워지는 경우가 많다. 통계적 유의성만으로는 알 수 있는 것이 적다. 참여자가 수백 명이면 약한 상관도 "유의"하게 나오므로, p값보다 상관계수와 그 신뢰구간이 더 중요하다. 인접 병기 사이의 겹침도 임상적으로 중요하다. 2기와 3기의 분포가 크게 겹치는 바이오마커는 집단 추세가 뚜렷하더라도 개인의 병기를 판정하는 데 쓸 수 없다.
SDK는 이런 분석을 ClinicalCorrelation으로 기록한다. 그 outcome은 ClinicalOutcome이며, type은 survival, progression, response, recurrence, severity, other 가운데 하나이고, measurement 척도는 continuous, binary, ordinal, time-to-event 가운데 하나다. 병기 상관은 다음과 같이 저장할 수 있다(값은 예시).
{
"id": "CORR-STAGE-01",
"biomarkerID": "BIO-67890",
"outcome": {
"type": "severity",
"name": "Tumour stage (I-IV)",
"measurement": "ordinal"
},
"correlationType": "spearman",
"correlationCoefficient": 0.62,
"pValue": 0.00001,
"sampleSize": 180,
"isSignificant": true
}
이 타입은 pearson, spearman, kendall을 허용한다. 상관계수의 신뢰구간이나 집단 비교 검정을 담을 필드는 없으므로 그런 내용은 함께 내는 보고서에 적는다. isSignificant 플래그는 손으로 정할 것이 아니라 사전에 정한 α(SDK 상수 ALPHA는 0.05)에서 도출해야 한다.
예후 바이오마커는 치료와 무관하게 사망, 재발, 진행 같은 질환의 경과를 예측한다. 추적 기간이 사람마다 다르고 연구가 끝날 때까지 사건이 일어나지 않은 참여자(중도절단)도 있으므로 생존 분석 방법이 적절하다. 명세 §6.2.1은 Cox 비례위험 모형을 쓴다.
h(t | x) = h₀(t) × exp(β × x)
h(t | x) 바이오마커 값이 x인 환자의 시점 t 위험
h₀(t) 기저 위험(형태를 지정하지 않음)
β x 한 단위당 로그 위험비
HR = exp(β)
HR > 1 바이오마커가 높을수록 위험 증가(나쁜 예후)
HR < 1 바이오마커가 높을수록 위험 감소
HR = 1 연관 없음
위험비는 전적으로 x의 단위에 달려 있다. β가 ng/mL당 0.0069(예시 값)라면 1 ng/mL당 HR은 1.007로 무시할 만해 보이지만, 100 ng/mL당 HR은 exp(0.69) ≈ 2.0이다. 따라서 보고서는 척도를 명시해야 한다. 단위당, 표준편차당, 두 배 증가당(농도의 log₂ 사용), 또는 사전에 정한 절단값을 기준으로 한 고값 대 저값 가운데 무엇인지 밝힌다. 중앙값에서 이분하거나 생존 분석 p값을 뒤져 "최적" 절단점을 고르면 정보가 버려지고 겉보기 효과가 부풀려진다. 임상 사용을 위해 절단값이 필요하다면 생존 분석 전에 고정해야 한다.
Cox 분석에는 두 가지 점검이 더 따라야 한다. 첫째, 위험비가 시간에 따라 일정하다는 비례위험 가정을 척도화된 Schoenfeld 잔차 등으로 점검한다. 진단 시점에 잰 바이오마커는 수년의 추적 기간 동안 예측력이 약해지는 경우가 많다. 둘째, 병기·연령·전신 수행 상태 같은 기존 예후 인자로 보정한 뒤에도 바이오마커의 효과가 남는지 보여야 한다. 병기를 그대로 반영할 뿐인 바이오마커는 더하는 것이 없다.
위험비는 판별력이 아니라 연관의 크기를 잰다. Harrell의 일치 지수(C-지수)는 생존 분석판 AUC다. 비교 가능한 모든 환자 쌍, 곧 추적 기간이 짧은 쪽이 실제로 사건을 겪은 쌍 가운데 예측 위험이 높은 환자가 먼저 사건을 겪은 쌍의 비율이다. 0.5는 우연 수준이고 1.0은 완벽한 순서 매김이다.
명세 §6.2.2는 시간 의존 AUC를 정의하고 1년, 3년, 5년 시점의 값을 요구한다. 흔히 쓰는 "누적/동적" 정의에서 시점 t의 환자는 t까지 사건을 겪은 사람이고, 대조군은 t에 아직 사건이 없는 사람이다. AUC(t)는 무작위로 뽑은 환자의 바이오마커 값이 무작위로 뽑은 대조군보다 높을 확률이다. 중도절단된 환자는 t 시점의 상태를 알 수 없으므로 이들을 그냥 빼고 계산하면 치우친다. 중도절단 확률의 역수로 가중하는 추정량이나 Heagerty 연구진의 최근접 이웃 방식이 이 문제를 제대로 처리한다. 여러 시점의 AUC(t)를 보고하면 바이오마커의 예후 정보가 시간에 따라 옅어지는지 드러난다.
SDK의 PrognosticAnalysis 타입은 위험비와 그 95 % 신뢰구간, p값, 선택 항목인 C-지수, 고값·저값 집단의 생존 곡선(지정한 시점별 생존 확률 배열), 그리고 시간 단위를 포함한 중앙 생존 기간을 담는다. 아래 값은 예시다.
{
"biomarkerID": "BIO-67890",
"hazardRatio": 2.0,
"hazardRatioCI95": [1.4, 2.9],
"pValue": 0.0002,
"cIndex": 0.68,
"survivalCurves": {
"timePoints": [12, 36, 60],
"high": [0.82, 0.61, 0.47],
"low": [0.93, 0.83, 0.74]
},
"medianSurvival": { "high": 54, "low": 96, "unit": "months" }
}
이 타입에는 위험비의 단위, 보정 공변량, AUC(t)를 담을 필드가 없다. 필드가 생길 때까지는 보고서 본문에 적고 공변량을 명시해야 한다. 또한 집단의 절반 미만만 사건을 겪었다면 중앙 생존 기간을 추정할 수 없으므로, 외삽하지 말고 해당 필드를 생략한다.
모니터링 바이오마커에 대해 명세 §6.3.1은 치료 전 기준값 대비 변화로 반응을 분류한다. 이 범주는 표준 자체의 정의다. 영상 기반의 RECIST 기준도, PSA에 관한 전립선암 작업그룹 기준 같은 질환별 합의도 아니므로, 보고서에서는 WIA-BIO-004 범주라고 밝혀야 한다.
| 범주 | SDK 값 | WIA-BIO-004 정의 |
|---|---|---|
| 완전 반응(CR) | complete | 바이오마커가 정상(참고) 범위 안에 있음 |
| 부분 반응(PR) | partial | 기준값 대비 50 % 이상 감소 |
| 안정(SD) | stable | 50 % 미만 감소이면서 25 % 미만 증가 |
| 진행(PD) | progressive | 기준값 대비 25 % 이상 증가 |
변화율은 (측정값 − 기준값) / 기준값 × 100이며 TreatmentResponse.percentChange에 저장한다. 예컨대 기준값 200 ng/mL가 80 ng/mL로 떨어지면 −60 %이고, 80 ng/mL가 참고구간 안에 들지 않는 한 부분 반응, 참고구간 안에 든다면 완전 반응이다. 구현하려면 v1.0이 암묵적으로 남겨 둔 우선순위 규칙이 필요하다. CR을 먼저 판정하고 PR, PD, SD 순으로 판정할 것, 기준값 구간(치료 시작 전 마지막 값)을 정의할 것, 한 번의 측정으로 충분한지 확인 검체가 필요한지 정할 것 등이다. 분석 부정밀도만으로도 값이 몇 퍼센트씩 움직이므로, 25 % 경계 근처의 변화는 제5장의 총 변동계수, 가능하다면 기준 변화값(reference change value)에 비추어 해석해야 한다. 기준값이 이미 참고구간 안에 있으면 CR 판정이 무의미해지므로 그런 환자는 분류하지 말고 플래그를 붙인다.
효과적인 치료 뒤 바이오마커가 떨어질 때, 감소 속도는 그 자체로 정보를 담는다. 감소가 대략 1차 반응을 따른다면 값은 C(t) = C₀ · e−kt를 따르며, 명세는 속도 상수를 반감기와 연결한다.
k = ln 2 / T½ (−ln 0.5 / T½와 같다)
예(예시 값): T½ = 3일
k = 0.693 / 3 = 하루 0.231
9일 뒤(반감기 세 번) 값은 기준값의 1/8
실제로 k는 치료 직후 초기 검체들에서 ln(측정값)을 시간에 대해 선형회귀해 추정하며, 정량한계보다 높은 적시 측정값이 세 개 이상 있어야 한다. 정량한계에 닿은 값은 정확한 숫자가 아니라 중도절단값으로 다뤄야 한다. 그러지 않으면 적합한 반감기가 지나치게 짧아진다. TreatmentResponse는 원시 시계열을 longitudinalData(시점, 값, 단위)에 저장하고, 선택 항목으로 timeToResponse와 durationOfResponse를 둔다. 적합한 반감기를 담을 전용 필드는 없다.
같은 환자에게서 반복 측정한 값들은 서로 상관되어 있으므로, 모든 검체를 독립으로 다루는 일반 회귀는 불확실성을 과소평가한다. 명세 §6.3.2는 선형 혼합효과 모형을 쓴다.
Biomarker_ij = β₀ + β₁ × Time_ij + β₂ × Treatment_i
+ β₃ × (Time × Treatment)_ij + u_i + ε_ij
i 대상자 j 측정 시점
u_i 대상자 무작위 효과, u_i ~ N(0, σ²_u)
ε_ij 잔차 오차, ε_ij ~ N(0, σ²)
β₃ 치료군 간 기울기 차이
β₁은 기준군의 시간에 따른 기울기, β₂는 군 간 기저 차이, 그리고 관심 계수인 β₃는 궤적에 대한 치료 효과다. 무작위 절편 ui는 환자마다 고유한 수준을 갖도록 허용한다. 바이오마커가 변하는 속도가 환자마다 다르다면 시간에 대한 무작위 기울기를 더하는 것이 자연스러운 확장이다. 혼합 모형은 일상적인 모니터링에서 흔한 불균등한 측정 횟수와 불규칙한 측정 시점을 수용하지만, 결측 검체가 관찰된 데이터를 조건으로 무작위 결측이라고 가정한다. 진행한 환자가 채혈을 중단한다면 이 가정은 깨지고, 바이오마커와 사건을 함께 다루는 결합 모형이 필요할 수 있다. 농도는 대개 로그 척도로 분석하는 편이 낫고, 이때 β₃는 변화 속도의 비로 해석한다.
정확하고 예후를 예측하며 치료에 반응하는 바이오마커라도, 임상의가 연령·증상·기존 검사로 이미 아는 것 이상을 알려 주지 못한다면 임상적으로는 쓸모가 없다. 그래서 검증의 마지막 단계는 두 가지를 묻는다. 바이오마커가 기존 모형을 개선하는가, 그리고 그것에 근거해 행동하면 더 나은 결정으로 이어지는가.
NRI는 기존 모형이 부여한 위험 범주와 바이오마커를 더한 새 모형이 부여한 위험 범주를 비교한다. 명세 §5.2.1은 이를 두 순비율의 합으로 정의한다.
NRI = [P(상향 | 사건) − P(하향 | 사건)] + [P(하향 | 비사건) − P(상향 | 비사건)]
예(예시 값), 위험 범주 저위험 / 중간 / 고위험
사건 100명: 상향 20, 하향 8 → (20 − 8) / 100 = 0.12
비사건 400명: 하향 60, 상향 28 → (60 − 28) / 400 = 0.08
NRI = 0.12 + 0.08 = 0.20
NRI는 항상 두 구성 요소로 나누어 보고해야 한다. 같은 합계가 정반대의 효과를 감출 수 있기 때문이다. 모든 사람을 위로 올리는 모형은 사건군에서 얻고 비사건군에서 잃는다. NRI는 범주의 선택과 개수에 좌우되므로, 범주는 임상적 근거로 정하고 사전에 고정해야 한다. 예측 위험의 모든 상하 이동을 세는 무범주 NRI는 정보가 없는 바이오마커에도 양의 값을 내는 것으로 알려져 있어 신중하게 해석해야 한다.
IDI는 범주를 쓰지 않는다. 모형의 판별 기울기는 사건군의 평균 예측 확률에서 비사건군의 평균 예측 확률을 뺀 값이고, IDI는 새 모형의 판별 기울기에서 기존 모형의 판별 기울기를 뺀 값이다. 명세 §5.2.2는 이 항을 "ΔSensitivity"로 표기하는데 오해를 부른다. 올바른 양은 평균 예측 확률이다.
IDI = [평균 p_new(사건) − 평균 p_new(비사건)]
− [평균 p_old(사건) − 평균 p_old(비사건)]
예(예시 값)
새 모형: 0.42 − 0.14 = 0.28
기존 모형: 0.35 − 0.16 = 0.19
IDI = 0.28 − 0.19 = 0.09
IDI는 예측 위험을 더 멀리 벌려 놓는 모형에 점수를 주는데, 새 모형의 보정이 나빠도 그런 일이 생길 수 있다. 따라서 IDI는 단독으로 가치를 증명하는 지표가 아니라, 보정 지표 및 AUC나 C-지수의 변화와 함께 보고한다.
판별 지표는 거짓양성과 거짓음성을 대칭으로 다루지만 임상 결정은 그렇지 않다. 품질 지표 문서가 제시하는 의사결정 곡선 분석은, 임상의가 조치를 취하는 역치 확률 pt의 오즈로 거짓양성에 가중치를 준다.
순편익 = TP / n − (FP / n) × p_t / (1 − p_t)
예(예시 값): n = 1000, 사건 200, p_t = 0.20 → 가중치 0.25
바이오마커 기반: TP = 160, FP = 120 → 0.160 − 0.120 × 0.25 = 0.130
전원 치료: TP = 200, FP = 800 → 0.200 − 0.800 × 0.25 = 0.000
전원 비치료: → 0
역치 확률에는 가치 판단이 담긴다. pt = 0.20이면 임상의는 제대로 치료한 환자 한 명마다 불필요한 개입 네 건을 감수한다는 뜻이다. 순편익은 "환자 1명당 참양성" 단위로 표시되므로, 예에서 바이오마커 전략은 거짓양성 없이 환자 1000명당 진짜 환자 130명을 찾아내는 것과 같다. 의사결정 곡선은 합리적인 역치 범위에 걸쳐 바이오마커 전략, 전원 치료, 전원 비치료의 순편익을 그린 것이며, 바이오마커 곡선이 두 기준선보다 위에 있는 구간에서 바이오마커가 유용하다. AUC와 달리 순편익은 현실적인 유병률을 필요로 하므로, 환자-대조군 표본이 아니라 실제 사용 집단을 반영하는 코호트에서 계산해야 한다.
품질 지표 문서는 NNT = 1 / |Outcomebiomarker − Outcomestandard|도 정의한다. 결과 하나를 바꾸기 위해 표준 전략 대신 바이오마커 전략으로 관리해야 하는 환자 수다. 나쁜 결과가 표준 진료에서 12 %, 바이오마커 기반 진료에서 8 %로 발생한다면(예시 수치) NNT = 1 / 0.04 = 25다. 이 결과 발생률은 관리가 실제로 바이오마커에 따라 달라진 비교 연구, 가급적 무작위 배정 연구에서 나와야 한다. 정확도 데이터만으로는 NNT를 구할 수 없으며, 6.1.4의 임상적 유용성 단계가 가장 큰 표본을 요구하는 이유가 여기에 있다.
§7.2 검증 연구 레코드는 이 장의 내용을 한데 모은다. 아래 예시는 명세의 구조를 따르되 숫자를 검산했다. 참여자 300명은 환자 150명과 대조군 150명, 남성 145명과 여성 155명, 네 인종 집단 180/60/40/20명으로 나뉜다. 보고된 절단값에서 민감도 84 %, 특이도 90 %는 TP 126, FN 24, TN 135, FP 15에 해당하며, 여기서 PPV 126/141 = 89.4 %, NPV 135/159 = 84.9 %, 정확도 261/300 = 87.0 %, LR+ = 0.84/0.10 = 8.4, LR− = 0.16/0.90 = 0.18, 유든 지수 J = 0.74가 나온다. 신뢰구간은 다시 계산했다. 집단당 150명에서 AUC 0.87의 Hanley–McNeil 구간은 약 0.83–0.91이고, Wilson 구간은 민감도 77.3–89.0 %, 특이도 84.2–93.8 %다. 제3장의 권고에 따라 studyType에는 명세의 diagnostic_validation 대신 SDK 값 validation을 쓴다. 바이오마커 이름과 모든 결과는 예시다.
{
"standard": "WIA-BIO-004",
"version": "1.0.0",
"studyID": "VALID-2025-001",
"studyType": "validation",
"biomarker": {
"id": "BIO-67890",
"name": "Novel Cancer Marker",
"type": "protein"
},
"population": {
"totalParticipants": 300,
"cases": 150,
"controls": 150,
"ageRange": [45, 75],
"sexDistribution": { "male": 145, "female": 155 },
"ethnicity": { "caucasian": 180, "african": 60, "asian": 40, "hispanic": 20 }
},
"referenceStandard": {
"method": "Histopathological confirmation",
"sensitivity": 100,
"specificity": 100
},
"results": {
"rocAnalysis": {
"auc": 0.87,
"aucCI95": [0.83, 0.91],
"optimalThreshold": {
"value": 125.5,
"unit": "ng/mL",
"sensitivity": 84.0,
"specificity": 90.0,
"youdenIndex": 0.74
}
},
"performanceMetrics": {
"sensitivity": 84.0,
"sensitivityCI95": [77.3, 89.0],
"specificity": 90.0,
"specificityCI95": [84.2, 93.8],
"ppv": 89.4,
"npv": 84.9,
"accuracy": 87.0,
"lrPositive": 8.4,
"lrNegative": 0.18
},
"subgroupAnalysis": [
{ "subgroup": "Age <60", "n": 140, "auc": 0.89 },
{ "subgroup": "Age >=60", "n": 160, "auc": 0.85 }
]
},
"validation": {
"crossValidation": "10-fold",
"externalValidation": true,
"validationCohorts": [
{ "cohort": "External Cohort 1", "n": 200, "auc": 0.84 }
]
}
}
이런 레코드를 읽을 때는 세 가지를 주의해야 한다. 위의 PPV와 NPV는 연구의 환자 비율 50 %에서만 성립한다. 다른 유병률에서는 제2장의 베이즈 형식으로 다시 계산해야 하며, SDK의 validateBiomarker가 prevalence 매개변수로 하는 일이 바로 그것이다. 여기서 민감도와 특이도는 명세와 SDK의 DiagnosticPerformance처럼 퍼센트 단위지만, SDK의 ROC 점은 0–1 사이의 비율을 쓴다(제4장). 그리고 이 레코드는 외부 코호트를 하나만 보고하는데 README 요구사항 3은 독립 집단 두 개 이상을 요구하므로, 이 연구만으로는 검증 단계가 끝나지 않는다.