← 回 INDEX · ISM 方法本體 02 · 能力對照 10

ISM 分群三統計分工:Cramér's V · Fisher · PERMANOVA

一張圖總結三個統計在 ISM 各自吃什麼資料、回答什麼問題;下方敘述逐項對回 C++ 原始碼 (file:line) 確認。 資料 branch:research/subclonal-reconstruction-202606。

Fisher、Cramér's V、PERMANOVA 與 PERMDISP 的分工 Fisher p 量觀察統計與指定 null 的不相容性;Cramér's V 量關聯幅度;PERMANOVA 檢驗 label-associated centroid separation,必須配合 PERMDISP 與設計限制解讀。 一個 region reads × CpG 甲基化矩陣 (每列一條 read,每欄一個 CpG) ① 無監督分群 → cluster labels 路線 A | 對照表 (contingency table) 列 = 甲基化分群 cluster · 欄 = 二元標籤 ALT vs REF(等位基因) 或 HP1 vs HP2(單倍型) GlobalTest.cpp:28-67 build_contingency_table 路線 B | 距離矩陣 (read×read) 值 = 兩條 read 的甲基化差異 (NHD) Normalized Hamming Distance,越小越像 RegionProcessor.cpp:421-422 · NaN 先剪枝 Fisher 精確檢定 (FFH, Monte-Carlo) → p 「分群與二元標籤的association 是否偏離 null?」 洗牌幾千次,比實際更極端的比例 = p;越小越不像運氣 Cramér's V (0~1) 「這個 association 的摘要量有多大?」(效應量) 由卡方算 raw V;Cochran 不可靠時僅 summary 投影為 0 PERMANOVA → pseudo-F + p 「指定 label 是否對應距離重心分離?」 洗標籤,看 組間距離 ≫ 組內距離 (StructureTest.cpp:141-201) PERMDISP 散度側檢 「centroid effect 是否混有組內離散度差異?」 significant PERMANOVA 的 confound 警示 (dispersion_warning) ② historical v1 provenance gate(非 current verdict) 雙門檻:Fisher p≤0.1 且 V≥0.1(GlobalTest.cpp:138-143) Significant = passed_gating & GlobalP≤0.05 & V≥0.1 & reads≥20 GlobalP = ALT/HP/HP-family 三個 Fisher p 取最小 ⚠ 只保留為 legacy evidence-path input;current 用 Verification schema-v2 PERMANOVA 只在 passed_gate 才跑 (SignificanceAnalyzer.cpp:99) 看圖重點 A:看「分群 vs 標籤」對齊 B:看指定 label 的距離重心分離 黃:historical v1 gate 虛線=有算但未進舊閘
圖:同一個 region 的甲基化矩陣分兩條路 — 路線 A(對照表)由 Fisher+Cramér's V 摘要分群與二元標籤的 association,路線 B(距離矩陣)由 PERMANOVA 檢驗指定 label 與 read-distance variation/centroid separation 的 association;兩者都不證明 truth、因果或無監督 clusters 已形成不同 read 雲。
路線 A:Fisher · Cramér's V 路線 B:PERMANOVA · PERMDISP historical v1(current v2 另行合併 A/B)
Current Verification schema-v2:舊 Fisher/Cramér's V 四類只保留在 verification_class_legacy 作 provenance input。current decision tree 另納入 label-PERMANOVA,並用 PERMDISP 分出 clean location shift 與 dispersion-confounded structure;Significant 是 verification_significant 的 boolean projection,已取代 obsolete Fisher-only gate(RegionProcessor.cpp:1817-1862,2026-2032)。這仍是 association evidence classification,不是 cellular truth。

敘述確認 — 每個圖元素對回原始碼

圖中元素白話它吃什麼 / 它問什麼原始碼 (file:line)
路線 A 對照表 列=甲基化分群、欄=二元標籤 標籤 = ALT/REF(UNKNOWN 排除)或 HP1/HP2(HP_OTHER 排除)或 HP-family。甲基化只透過「分群」進來,不是 raw 逐 CpG 細胞 GlobalTest.cpp:28-67 · :155-167(allele) · :186-199(HP)
Fisher (FFH) 二元標籤 association 是否偏離 null? cluster×二元標籤的 R×2 Fisher-Freeman-Halton(兩群時為 2×2),Monte-Carlo 固定邊際洗牌(2000–10000 次,Wilson CI 提早停);p = 比實際更極端的比例,不判定 truth 或 causality FisherExact.cpp:259-320 · GlobalTest.cpp:73-132
Cramér's V 對齊有多強(0~1) 由 Pearson 卡方算 raw V=√(χ²/(n·(min_dim−1)));Cochran 可靠性:≥80% 細胞期望≥5 才採信,否則 reliability=false 且 summary V=0;legacy gate/JSON 仍讀 raw V MathUtils.cpp:154-207 · summary projection RegionProcessor.cpp
路線 B 距離矩陣 兩 read 甲基化差多少 NHD = 共同覆蓋 CpG 上甲基化不一致的比例;無重疊→NaN,貪婪剪枝到完整子矩陣 (≥5 reads) RegionProcessor.cpp:421-422 · StructureTest.cpp:30-91
PERMANOVA 指定 label 是否對應 read-distance centroid separation? pseudo-F = (組間SS/(k−1))÷(組內SS/(N−k));現行 release baseline 洗標籤 999 次得 p(p-floor 0.001)。分群、HP、ALT 三種 labeling 各跑一次;結果只檢驗指定 labeling 與距離 variation/centroid separation 的 association,不證明 unsupervised clusters 或 reads 真的分雲 StructureTest.cpp:141-201 · SignificanceAnalyzer.cpp:99-131,301-304
PERMDISP 某組是否只是比較散 各 read 到組心 RMS 距離做單因子 ANOVA;current core 以 F-distribution upper-tail 解析 p 判定 dispersion_warning。historical 3-bucket lookup 已被取代 StructureTest.cpp:378-472
historical v1 雙門檻 legacy provenance class(非 current final pass/fail) passed_gate=(Fisher p≤0.1 且 V≥0.1);舊 Significant 式與 GlobalP=min(Fisher axes) 只用來解釋 verification_class_legacy GlobalTest.cpp:138-143 · SignificanceAnalyzer.cpp
current Verification v2 current evidence class + Significant 合併 legacy evidence path、Δβ、HP-AUC、within-HP、label-PERMANOVA 與 PERMDISP clean/dispersion axes;Significant=verification_significant RegionProcessor.cpp:1817-1862,2026-2032

為何要三個、不是一個

三個你該知道的真相(revision-scoped 源碼核實)

① historical v1 舊閘 Significant 沒用 PERMANOVA;current v2 已替換。舊 SignificanceAnalyzer 只聽 Fisher 那張表,所以「PERMANOVA 顯著但 Fisher p>0.05」曾被打成 Weak/Noise;這也是 v2 納入 clean label-PERMANOVA/PERMDISP axes 的原因。圖中虛線只解釋 historical gate,不是 current decision。
② Cramér's V 的 raw、reliability 與 summary 是三個口徑。 Cochran:期望<5 的格子佔比>20% → cramers_v_reliable=false;MathUtils.cpp::cramers_v 仍回傳 raw V,RegionProcessor.cpp 的 summary projection 才寫 0,而 legacy GlobalTest::passed_gate 仍直接讀 raw V。這表示 summary 不足以判讀,不能把歸零當作真偽判定(762 MISSED / 487 僅是歷史分析口徑的候選計數)。
③ chi_square_p 是佔位符(直接 = Fisher p,GlobalTest.cpp:122-124),沒有獨立的卡方 p;卡方統計量只用來算 V。
補充(current source 的工作站欄位):目前 release-candidate source 會輸出 StrengthScore、StrengthGrade 與五個可重加權 component: StrengthStruct、StrengthTumor、StrengthSomatic、StrengthAssoc、StrengthGermline。 實作為五個 [0,1] sub-score 的等權平均: clamp((HP_AUC_All−0.5)/0.5)、通過 within-HP gate 時的 clamp(WithinHP_BestSil/0.5)、 clamp(|SomaticResidualDbeta|/0.3)、clamp(CramersV)、clamp(|GermlineAsmDbeta|/0.3); 等級門檻 A/B/C/D/E = ≥0.50/≥0.35/≥0.22/≥0.12/其餘(RegionProcessor.cpp:1756-1785, 1896-1964)。 舊的 0.30/0.25/0.25/0.20 加權式只屬 historical formula,不是 current implementation。StrengthScore 只供 association-strength 排序;不是機率、生物正確率、clone 或 lineage 驗證。
資料來源(§13 溯源):本頁所有 file:line 與行為由 4 個 fresh-context reader 親讀以下 C++ 原始碼核出,branch research/subclonal-reconstruction-202606:
src/core/GlobalTest.cpp · src/core/MathUtils.cpp · src/core/FisherExact.cpp · src/core/StructureTest.cpp · src/core/SignificanceAnalyzer.cpp · src/core/RegionProcessor.cpp · include/core/{GlobalTest,FisherExact,StructureTest,Stats}.hpp
產生日:2026-06-18 | 路徑:InterSubMod/docs/explain/09_three-stats-division-of-labor.standalone.html