Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions experiments/crosscancer/table1/BIOP02-148_FINDINGS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# BIOP02-148 — Table 1(코호트 특성표) 5암종

`claim_level: descriptive`(가설 검정 아님, 사전등록 대상 없음) · jamie, 2026-08-20

## 범위

티켓 본문 그대로 전체 범위(축소 옵션 미사용) — 5암종(유방·폐·대장·위·두경부) × 환자수/
슬라이드수/train·holdout/나이/성별/stage/grade/tissue source site 수 + 엔드포인트별
유병률·결측·assay source + participant flow. 신규 모델링·통계 검정 없음 — **전부 이미 커밋된
정본 파일에서 집계만** 했다(가설 검정이 아니므로 결과-보기-전 사전등록은 생략, 대신 "숫자는
전부 기존 파일 인용, 재계산 없음"을 아래 산출물 자체에 명시).

## 산출물

- `fetch_table1_clinical.py` → `table1_clinical.json` — age/sex/stage/grade/TSS site
(cBioPortal PATIENT+SAMPLE level, 5개 study). **정정 1건**: GRADE·TISSUE_SOURCE_SITE_CODE는
PATIENT-level이 아니라 SAMPLE-level 속성임을 최초 실행에서 0건으로 확인 후 발견(팀 기존
`sh_fetch_labels.py`가 이미 같은 패턴 사용 — 뒤늦게 확인). 재실행 후 정상 값 확보.
- `build_table1.py` → `table1_master.json`(정본) + `TABLE1.md` + `PARTICIPANT_FLOW.md` —
기존 `patient_labels.csv`/`split.csv`/`tcga_brca_manifest.csv`/`mil_cost_results.json`에서
집계, 신규 라벨 없음.
- `check_table1_numbers.py` — DoD "결과 파일과 1:1 대조" 자체 검증(아래 결과 참조).

## 핵심 발견 — 결과 파일과의 대조

`check_table1_numbers.py` 실행 결과 **불일치 0건**:
- Table 1b의 holdout n_pos·n_holdout 6개 암종×엔드포인트 전부 `mil_cost_results.json`(정본)과
정확히 일치.
- **`manuscript/sections/02_results.md`의 R2 표(축별 홀드아웃 양성 표본 6행)와 R1 prose가
인용한 헤드라인 n_pos(폐 LUSC 153·두경부 HPV 26·두경부 grade 41) 전부 Table 1과 1:1
일치** — 이게 DoD의 "본문·표 R1/R2와 분모 불일치 0건" 항목이다. 원고가 이미 실측 수치를
쓰고 있었고 이번 Table 1이 그걸 독립적으로 재확인한 셈이다(원고를 보고 베낀 게 아니라
`mil_cost_results.json`에서 각자 계산 → 우연 일치가 아니라 같은 정본을 공유).

## 결과 요약

Table 1 전문 = `TABLE1.md`, 참여자 흐름 = `PARTICIPANT_FLOW.md`. 주목할 점만:

1. **grade 커버리지가 암종마다 극단적으로 다르다.** 위(440/440, 100%)·두경부(519/523, 99%)는
완비, 유방·폐·대장은 **0%**(cBioPortal `GRADE` 속성 자체가 이 3개 study엔 없음 — 체리피킹
아니라 실측 확인, BIOP02-140에서 폐도 같은 걸 이미 확인했음). 이걸 Table 1에 그대로
드러내는 게 "결측을 숨기지 않는다"는 프로젝트 원칙에 맞다고 판단해 각주 없이 표 자체에
0.0%로 명시했다.
2. **PAM50은 이진 유병률 정의가 안 된다.** 초안에서 "positive=Normal-like 제외"로 억지로
이진화했더니 100%가 나와(정의상 당연) 무의미했다 — 5-class 분포(LumB 321·LumA 243·
Basal 198·HER2 120)로 바꿔 표기했다. 이 실수는 결과를 보기 전에 잡았다(집계 스크립트
개발 중 이상값으로 발견, 발표용 숫자로 나가기 전).
3. **holdout denominator가 같은 암종 안에서도 엔드포인트마다 다르다**(티켓이 걱정한
"endpoint denominator audit" 그대로) — 위는 lauren_diffuse n=58 vs msi_h n=107, 같은
GASTRIC holdout 132명 중 라벨 있는 하위집합만 쓰기 때문. Table 1b에 암종별이 아니라
엔드포인트별 행으로 분리해 이 차이가 보이게 했다.
4. **폐 KRAS-G12C 관련 교차확인**: `LUNG_NSCLC/full/SUBTYPE_BASELINE_NOTE.md`(2026-07-14,
기존 산출물)가 이미 histology-only baseline 0.793(n_pos 15/315)을 봉인해뒀다는 걸 이번에
확인했다 — R1 prose의 "조직형만으로 예측한 기준선 0.793"의 정확한 출처다. 방금 병합
대기 중인 BIOP02-140(jamie, PR #136)이 이 기준선에 purity/stage/site를 더한 확장판
(0.802)이라 서로 다른 카드지만 같은 결론(KRAS는 histology 편중)을 독립적으로 강화한다 —
참고로만 남긴다, BIOP02-148 자체 스코프는 아님.

## Table 1 배치 판단 (DoD 항목)

**본문(main text) 권장.** TRIPOD+AI 13b는 baseline 특성표를 본문에 두는 걸 표준으로 삼고,
`02_results.md` R1 앞에 두는 게 자연스럽다(R0가 "다섯 암종 약 열다섯 endpoint"를 서술하는데
Table 1이 그 숫자의 근거가 됨). 다만 **원고 prose(`02_results.md`/`03_methods.md`) 직접
수정은 이번 PR에서 안 했다** — 다른 분들이 이미 쓰고 있는 살아있는 원고라 Owner≠Reviewer
취지상 배치·문구는 리뷰에서 합의 후 반영하는 게 맞다고 판단. 지금은 `experiments/crosscancer/
table1/`에 독립 파일로 두고, 리뷰 통과 후 원고 편입을 별도 커밋으로 제안.

## DoD 체크

- [x] Table 1 초안 (배치 판단 포함 — 위)
- [x] 모든 수치가 커밋된 결과 파일과 1:1 대조 — `check_table1_numbers.py`, 불일치 0건
- [x] 본문·표 R1/R2와 분모 불일치 0건 — 위 스크립트로 확인(6/6 R2행 + 3개 R1 인용 전부 일치)
- [x] participant flow — `PARTICIPANT_FLOW.md`
- [ ] **독립 리뷰: 박세진(sezinie000) 또는 지용기** — 아직

## 스킵/후속

- 유방 er/pr/her2/pam50은 holdout(val+test) 분리 없이 코호트 전체로 표기(Table 1b에 명시) —
Paper A/B 코드가 CPTAC 외부검증을 별도로 쓰고 이 매니페스트 자체엔 holdout-전용 예측치가
없어서다. 필요하면 후속으로 holdout만 분리한 값을 추가.
- assay-source 텍스트는 각 fetch 스크립트 주석·문서에서 인용(신규 조사 아님) — 표기가 틀리면
리뷰에서 정정 부탁.
13 changes: 13 additions & 0 deletions experiments/crosscancer/table1/PARTICIPANT_FLOW.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Participant flow — 5암종 (TRIPOD+AI 13b 짝)

`n식별` = patient_labels.csv/manifest에 라벨이 조인된 환자 수(=GDC 매니페스트에서 H&E 슬라이드+임상데이터 결합 가능 subset, 이미 필터링된 상태 — raw GDC 전체 대비 제외 사유는 각 코호트 원 매니페스트 문서 참조). 여기서부터 아래로: 라벨 결측 없는 환자 → train/holdout 분리.

| 암종 | n(라벨 조인, 시작점) | n(슬라이드 보유) | n(train) | n(holdout=val+test) |
|---|---|---|---|---|
| 유방 | 1010 | 1010 | 707 | 303 |
| 폐 | 1050 | 1026 | 735 | 315 |
| 대장 | 534 | 523 | 374 | 160 |
| 위 | 440 | 439 | 308 | 132 |
| 두경부 | 523 | 468 | 366 | 157 |

엔드포인트별 최종 분석 대상(holdout denominator)은 Table 1b 참조 — 암종 안에서도 엔드포인트마다 라벨 결측 패턴이 달라 holdout n이 다르다(예: 위 lauren_diffuse n=58 vs msi_h n=107, 같은 GASTRIC holdout 132명 중 라벨 있는 하위집합만).
31 changes: 31 additions & 0 deletions experiments/crosscancer/table1/TABLE1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Table 1 — 코호트 baseline 특성 (5암종)

`claim_level: descriptive` — 사전등록 대상 없음(가설 검정 아님). 모든 수치는 `table1_master.json`(정본)에서 그대로 인용, 이 문서에서 재계산 없음.

| 암종 | N 환자 | N 슬라이드 | Train/Val/Test | 나이 중앙값(IQR) | 여성 % | Stage I | II | III | IV | missing | Grade 커버리지 | TSS site 수 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 유방 | 1010 | 1010 | 707/152/151 | 58.5 (49–68, n=996) | 99% | 167 (17%) | 569 (56%) | 227 (22%) | 16 (2%) | 31 (3%) | 0/1010 (0.0%) | 37 |
| 폐 | 1050 | 1026 | 735/158/157 | 67.0 (60–73, n=968) | 40% | 513 (49%) | 280 (27%) | 166 (16%) | 34 (3%) | 57 (5%) | 0/1050 (0.0%) | 69 |
| 대장 | 534 | 523 | 374/80/80 | 67.0 (57–75, n=532) | 48% | 95 (18%) | 201 (38%) | 151 (28%) | 73 (14%) | 14 (3%) | 0/534 (0.0%) | 37 |
| 위 | 440 | 439 | 308/66/66 | 67.0 (58–73, n=436) | 35% | 58 (13%) | 131 (30%) | 188 (43%) | 44 (10%) | 19 (4%) | 440/440 (100.0%) | 22 |
| 두경부 | 523 | 468 | 366/79/78 | 61.0 (53–68, n=522) | 27% | 27 (5%) | 77 (15%) | 80 (15%) | 269 (51%) | 70 (13%) | 519/523 (99.2%) | 28 |

## Table 1b — 엔드포인트별 유병률·결측 (사전등록 임계 n_pos≥25 대비)

| 암종 | 엔드포인트 | assay source | 전체 코호트 라벨 결측 | 유병률(코호트 전체) | holdout n(denominator) | holdout n_pos | n_pos≥25? |
|---|---|---|---|---|---|---|---|
| 유방 | er_status | IHC(임상 병리검사) | 0.0% | 782/1010 (77%) | 1010 | 782 | n/a(전체 코호트 표기, holdout 분리 미실시) |
| 유방 | pr_status | IHC(임상 병리검사) | 0.5% | 672/1005 (67%) | 1010 | 672 | n/a(전체 코호트 표기, holdout 분리 미실시) |
| 유방 | her2_status | IHC/FISH(임상 병리검사, BIOP02-49 QC 완료) | 30.9% | 159/698 (23%) | 1010 | 159 | n/a(전체 코호트 표기, holdout 분리 미실시) |
| 유방 | pam50 | 유전자발현 분류기(계산값, tcga_brca_pam50_computed.csv) | 12.7% | LumB=321; LumA=243; Basal=198; HER2=120 | 1010 | — | n/a(다중클래스, 이진 유병률 미정의) |
| 폐 | egfr_activating | 체세포변이 콜(MAF, WES-derived) | 0.0% | 61/1050 (6%) | 271 | 15 | ⚠️ exploratory(<25) |
| 폐 | kras_g12c | 체세포변이 콜(MAF, WES-derived) | 0.0% | 70/1050 (7%) | 271 | 14 | ⚠️ exploratory(<25) |
| 폐 | histology_lusc | 병리 진단(조직형, 임상) | 0.0% | 484/1050 (46%) | 271 | 153 | ✅ |
| 대장 | braf_v600e | 체세포변이 콜(MAF, WES-derived) | 0.0% | 48/534 (9%) | 151 | 15 | ⚠️ exploratory(<25) |
| 위 | msi_h | MSIsensor score≥3.5(NGS-derived, SUBTYPE STAD_MSI 교차확인) | 0.5% | 82/438 (19%) | 107 | 24 | ⚠️ exploratory(<25) |
| 위 | erbb2_amp | CNA(GISTIC) 증폭 콜 | 0.5% | 58/438 (13%) | 107 | 14 | ⚠️ exploratory(<25) |
| 위 | lauren_diffuse | 병리 조직분류(ICD_O_3_HISTOLOGY, 임상) | 61.4% | 83/170 (49%) | 58 | 31 | ✅ |
| 위 | ebv | TCGA 분자아형(SUBTYPE, 바이러스 검출 복합판정) | 13.0% | 30/383 (8%) | 89 | 7 | ⚠️ exploratory(<25) |
| 두경부 | hpv_pos | TCGA 분자아형(SUBTYPE HNSC_HPV+, p16+바이러스검출 복합판정) | 6.9% | 72/487 (15%) | 135 | 26 | ✅ |
| 두경부 | egfr_amp | CNA(GISTIC) 증폭 콜 | 1.1% | 54/517 (10%) | 152 | 17 | ⚠️ exploratory(<25) |
| 두경부 | grade_high | 병리 등급(SAMPLE-level GRADE, 임상) | 4.2% | 130/501 (26%) | 147 | 41 | ✅ |
Loading
Loading