研究指引 · Subclone 系統發生重建 · Part 3 — the joint estimator and its feasibility

下篇:完整的估計式,以及它能不能建起來

把兩類觀測寫成兩個相乘的因子,說明 beta-binomial 為何只是它在單一變異時的邊界情形;再逐層寫出一個多變異單位的生成模型 —— 分子權重、覆蓋遮罩、兩種形狀不同的錯誤、三種不同的「沒有」—— 最後是現行實作要改的兩處與實作分期。

建議先修:5% 能補的三格

本模組學習目標

  • 寫出把兩類觀測合起來的完整估計式,並說明為何是兩個因子相乘而不是兩項相加
  • 把一個多變異連鎖視窗的生成過程逐層寫出來:全域 clone 如何投影成局部分子比例,再如何長成一條 read,以及同一個視窗的兩條家族為何要在同一個因子內合併
  • 區分抽樣零、結構零與錯誤地板,並說明為何 Dirichlet 參數不可為零這件事就是「零不代表不可能」的數學形式
  • 說明分岔與不可同群這類分類為何是輸出而不是證據,以及現行實作要改的兩處各是什麼
  • 依 Poisson 模型算出給定突變負荷下的可用連鎖區段產量,並說明該數量為何足夠

為什麼重要

中篇確立了三件事:僅以 VAF 頻率譜重建時, 群數 K 不可辨識峰寬 φ 與 K 不可區辨成分位置 c 依賴三個外部估計值; 而多變異連鎖視窗的觀測正好各補一格,且三者作用在同一組待估量上: 突變屬於哪一群的指派 z、額外離散度 φ,以及各群的 CCF c

把三者合起來的最直接寫法,是把頻率的對數似然與一串「關係約束」的對數證據 相加,再給每條關係一個權重。這個寫法有一個結構缺陷,而且它不是細節: 多變異連鎖視窗的 read 會被計兩次 —— 一次是它們各自的 VAF 進了頻率項, 一次是同一批分子被換算成關係又進了第二項。 兩項因此不是獨立的資料集,那個和也就不是一個 likelihood; 權重之所以必須存在,正是為了事後稀釋這個重複。

本頁採取另一條路,而它其實更簡單:不要把 read 換算成關係,直接對 read 建模。 把觀測依連鎖視窗切成互不重疊的兩類 —— 只有一個變異的連鎖視窗,與兩個以上變異的連鎖視窗 —— 兩類各寫一個因子,相乘即得完整的 likelihood。 單變異那個因子正是原本的 beta-binomial; 多變異那個因子是同一個模型在多個位點上的一般形式。 兩者不是兩個模型;當視窗只含一個變異時,這個 read 模型的邊界情形就是 beta-binomial。

估計流程的全貌:一組參數,兩類證據,一個分數 圖由上往下讀,是一個會回頭的迴圈。 最上方是要估的參數:群數 K、clone tree、突變指派、逐拷貝基因型與細胞比例 w, 純度是由細胞比例推導出來的,不是額外的參數。 這組參數乘上拷貝數之後投影成局部的分子比例,決定了資料應該長什麼樣。 中段是資料:依「這個連鎖視窗裡有幾個變異」做一次互斥分流。 只有一個變異的視窗,所有 read 都跨過同一個位點, 因此只需要保留 alt 與 ref 的計數,形成 beta-binomial 因子。 兩個以上變異的視窗,每條 read 覆蓋的位點各不相同, 所以要保留逐條 read 的聯合狀態與覆蓋遮罩,形成多位點因子, 而同一個視窗的兩條單倍型家族在這個因子內一起計算。 兩路沒有共用任何一條 read,因此兩個因子是相乘而不是相加,也就不需要權重。 相乘得到完整的 likelihood,再扣掉複雜度、加上群數先驗,才是目標函數 Score。 最後跨不同的 K 比較 Score,取最大者。 右側的回頭箭頭是整個流程的關鍵:這不是一次算完, 外層換一組 K 與離散結構,內層調細胞比例,重算分數再比一次。 估計流程的全貌:一組參數,兩類證據,一個分數 ① 要估的東西 ΘK K:群數 T:clone tree z:突變指派 G:逐拷貝基因型 w:細胞比例(含正常細胞 w₀) 純度 ρ = 1 − w₀ 是推導量,不是額外的參數 投影:乘上拷貝數 → 分子比例 q ② 資料依「這個視窗有幾個變異」分成兩類 單變異視窗 kv = 1 1 1 0 每條 read 都跨過同一個位點, 所以只要留下計數 (am, dm) beta-binomial 因子 單位點的邊界情形 多變異視窗 kv ≥ 2 1 1 – – 1 0 1 0 – 每條 read 覆蓋的位點不同, 所以要留下聯合狀態與遮罩 Dv 多位點 read 因子 兩條家族在這裡一起算 兩路沒有共用任何一條 read —— 所以是相乘,不是相加,也就不需要權重 ③ 相乘就是完整的 likelihood Ldata = Σ log PBB + Σ log Pv 每條 read 恰好計算一次 ④ 扣複雜度、加先驗,才是目標函數 Score = Ldata − 複雜度代價 + log p(K) ⑤ 跨不同的 K 比較,取分數最大的那一個 不是一次算完 外層:換一組 K 以及 T、z、G 內層:調 w 只有 K 個自由度 重算分數,再比一次
這是整頁的地圖,先看它再讀後面的式子。 ①一組參數往下投影成「資料應該長什麼樣」;②真實資料依視窗裡有幾個變異分成兩類 —— 左路每條 read 都跨過同一個位點,留計數就夠;右路每條 read 覆蓋的位點各不相同, 所以必須留下聯合狀態與遮罩。兩路沒有共用任何一條 read, 所以③是相乘而不是相加,權重也就不需要存在。 ④相乘之後還要扣複雜度、加群數先驗才是目標函數,⑤最後跨 K 比較。 右側那個回頭箭頭是重點:這不是一次算完的公式,是一個迴圈 —— 外層換結構、內層調比例,重算再比一次(第七節)。

這個改動的代價與收益都很集中。收益是:權重、關係的可信度、以及為了保護硬約束而設的門檻 全部不需要了,因為證據強弱本來就是似然自己會算的東西。 代價是:觀測通道必須寫完整 —— 逐位點的定序錯誤與整條分子的家族誤標形狀不同, 少寫一種,錯誤造出來的少數幾條 read 就會被讀成一個新的 clone。

十二節分成四段,每一段回答一個不同層次的問題:

回答什麼
式子長什麼樣一~三完整的估計式、多變異連鎖視窗的生成過程,以及它預設的抽樣分布
怎麼不被錯誤騙四~六三種不同的「沒有」、分類為何是輸出而不是輸入、數百個形狀不同的連鎖區段如何合併
怎麼算出來七~八外層定結構、內層估比例;現行實作要改的兩處
工程現實九~十二與相位有關的兩類誤讀、連鎖區段產量、視窗寬度取捨、實作分期

閱讀方式:主線全部寫在沒有摺疊的段落、式子與圖裡。 內文中的虛線摺疊區一律是補充 —— 符號的逐項查表、數字怎麼推出來的、 換一種實作寫法會怎樣、與前兩篇的接點。 第一遍可以整批略過,需要時再展開,主線不會因此斷掉。

概念與互動

一、從一個變異走到完整的目標函數

先不要從最後一條長公式讀起。這個 estimator 只是在反覆回答一個問題: 若假設有 K 個突變群,哪一組群比例、clone tree 與突變指派,最能產生實際看到的 read,同時又沒有為了追逐雜訊而多開群?

在拆解之前先講一件會影響整節讀法的事:這一節要建立的是兩個估計問題,不是一個。

問題在本節的哪裡
內層固定群數 K,找出最好的那一組參數 Θ^K第一到第四層之一:那條大式子是內層的 likelihood
外層比較不同的 K,選出整體最好的 K^第四層之二:Score 才是目標函數

所以讀到第一條長公式時不必期待它就是最終目標 —— 它算的是「給定一組參數,資料出現的機率」, 要等到扣掉複雜度代價、加上群數先驗之後才成為可以拿來比較 K 的分數。 兩層各自怎麼跑,第七節會講。以下先把內層拆成四層:

層次輸入或問題這一層的輸出
1. 一個變異的資料總共 dm 條 read,其中 am 條支持 alt觀測 VAF:VAF^m=am/dm
2. 生物狀態假設變異 m 屬於群 k該狀態預期的 VAF:θmk
3. 觀測機率預期 VAF 與校準過的離散度看到 am 的 beta-binomial 機率
4. 全資料比較把互不重疊的 read 證據各算一次資料配適度 − 複雜度代價 + 群數先驗

第一層:先分清楚觀測值、未知狀態與校準量

這一層只做一件事:把接下來會反覆出現的符號分成三類 —— 可觀測的amdm)、要推論的Kzmck), 以及由上游餵進來或先校準好的CNmμmφm)。 ρ 兩邊都不是 —— 它是推導量,理由在本節後半。

符號表:九個符號逐項的意思與角色(隨時可回來查)
符號意思在 estimator 中的角色
mm 個 somatic variant資料索引
am在變異 m 支持 alt 的 read 數可觀測
dm在變異 m 通過品質篩選的總 read depth可觀測,且 0amdm
K候選突變群的總數;k{1,,K} 是其中一群要比較的模型大小
zm變異 m 被指派到哪一群未知的離散變數;zm=k 表示指派到群 k
ckk 群的 :帶有該群突變的腫瘤細胞比例由 clone 比例、tree 與指派共同決定
ρ:樣本中腫瘤細胞的比例推導量ρ=1w0,其中 w0 是正常細胞的比例(見第二節)
CNm變異 m 所在腫瘤區段的 total copy number通常由 copy-number 分析提供;不是 read depth
μm帶原腫瘤細胞中,幾份拷貝帶有此變異(由候選的 copy genotype 決定或推論
φm相較 binomial 多出的 overdispersion由可比較的校準資料按 depth 與 CN 分層估計

第二層:生物狀態先決定預期 VAF

θmk=E[VAFmzm=k]=ρ·ck·μmρ·CNm+2(1ρ)

分子問的是「樣本中預期有多少份帶突變的 DNA」;分母問的是 「這個位置總共有多少份 DNA」。因此 θmk 不是新的觀測值,而是 在候選指派 zm=k 成立時,模型預測的 VAF 中心

要記住的一句話是:同一群的變異不必落在同一個原始 VAF —— 拷貝數與 multiplicity 會把中心推到別的地方。

數值例:同一群、同一個 CCF,CN 從 2 變成 4 時預期 VAF 掉到哪

例如變異 mam=20dm=100,所以觀測 VAF 是 0.20。 若候選群的 ck=0.50、純度 ρ=0.80CNm=2μm=1, 模型預測 θmk=(0.8×0.5×1)/(0.8×2+0.2×2)=0.20,與資料吻合。 只把 CNm 改成 4,預期 VAF 就降為約 0.11。

只有二倍體且 μm=1 時,才可化簡成 θmk=ρck/2; 有 copy-number alteration 或 LOH 時不可使用這個捷徑。

第三層:beta-binomial 把「相差多少」換成機率

這一層要的只有一句話:觀測到的 alt count 不會剛好落在 θmk 上, 所以要用一個容許波動的分布去問「差這麼多有多不意外」

am(dm,zm=k)BetaBinomial(dm;αmk,βmk),αmk=θmkκm,βmk=(1θmk)κm

隨機結果是 alt count amdm 是已知的試驗次數,θmk 控制中心。

推導補充:beta-binomial 是兩段抽樣積出來的,以及 κφ 的換算
πmzm=kBeta(αmk,βmk),am(dm,πm)Binomial(dm,πm)

白話是先允許這一批分子的真實 alt 比例 πmθmk 周圍小幅變動,再由 dm 條 read 抽出 alt count am; 把看不見的 πm 積分掉,就得到上面那條 beta-binomial。

κm 是 Beta 分布的 concentration:越大表示 πm 越集中在中心。 為了讓「越大越寬」較直觀,本頁改用 φ

φm=1κm+1,Var(amdm,zm=k)=dmθmk(1θmk)[1+(dm1)φm]

因此 φm=0 是普通 binomial 的極限;φm 越大,同一中心周圍可接受的 read-count 波動越大。它不是可任意調寬的「峰寬旋鈕」 —— 進模型的是一個先用獨立資料校準好的 φ^(dm,CNm),不是搜尋時可以順手調大的參數。

實作補充:φ 怎麼分層校準,沒資料的格子怎麼辦

在「read depth 分層 × 腫瘤 CN 分層」內用獨立校準資料估計, 再以平滑或 shrinkage 幫助稀疏 strata。沒有足夠資料的 (d,CN) 格要標為未知並做敏感度分析, 不可悄悄套用一個寬峰 —— 那等於偷偷把峰調寬,而峰寬與 K 在中篇已證明不可區辨。

不要把這裡的 φm 與第三節的 τu 混在一起。 φm 描述跨獨立變異時單位點 alt count 的額外變異;τu 則是多變異連鎖區段內 整個狀態比例向量的 concentration,而且本頁稍後主張 PCR-free 長讀資料預設不需要額外的 τu

第四層之一:全資料的 likelihood,讓每批 read 只出現一次

相加為什麼不是 likelihood:看兩項的取用範圍就知道 圖用一條按比例畫的長條代表全部一萬五千五百個變異。 左邊較長的一段是自己獨佔一個連鎖視窗的變異,約一萬四千個; 右邊那一小段是落在多變異視窗裡的變異,約一千五百個,約佔一成。 每一項的取用範圍畫成長條上方或下方的一條細帶。 上半是相加的寫法:第一項的細帶蓋住整條長條,第二項的細帶只蓋住右邊那一小段, 兩條細帶在右段上下對齊、範圍重疊,該欄因此被標成紅色 —— 那一成變異的 read 被兩項各用了一次。 這就是為什麼那個和不是 likelihood,也是權重存在的唯一理由:稀釋這段重疊。 下半是相乘的寫法:同一條長條先被切開成沒有交集的兩段,中間留出可見的空隙, 兩條細帶因此不再上下重疊。 圖最下方用讀圖示表示兩段各留下什麼資料:左段只留一個位點的 alt 與 ref 計數, 右段留下逐條 read 跨越多個位點的聯合狀態與覆蓋遮罩。 因此兩個因子可以直接相乘得到完整的 likelihood,權重也就不需要存在。 相加為什麼不是 likelihood:看取用範圍就知道 ✗ 相加:兩項的取用範圍重疊 ① 每個位點的 alt/ref 計數 獨佔一個視窗的變異 14,025 1,475 ② 同一條 read 上的共現 這一欄被兩項各用了一次 同一批 read 算了兩次 → 那個和不是 likelihood;權重存在的唯一理由,就是事後稀釋這段重疊。 ✓ 相乘:先把資料切開,兩個因子各管一段 兩個因子的取用範圍 S₁ 14,025 個變異 S₂ 1,475 個變異 只留一個位點的 alt/ref 計數 留逐條 read 的聯合狀態與遮罩 兩段沒有交集 → 相乘就是完整的 likelihood → 權重不必存在
長條是按比例畫的全部變異。上半兩條範圍帶在右段重疊 —— 那一成的變異,其 read 被兩項各用了一次,所以那個和不是 likelihood; 權重存在的唯一理由就是事後稀釋這段重疊。 下半先把長條切成沒有交集的兩段,範圍帶之間出現空隙,重複計數消失,權重也就不必存在。
P(DΘK)=mS1PBB(amdm,ΘK)·vS2Pv(DvΘK)

這是 likelihood,不是目標函數 —— 目標函數還要再扣複雜度、再加群數先驗,見下一小節。 第二個乘積跑在連鎖視窗上,不是跑在單倍型連鎖區段上;理由見後面兩小節。

符號表:S1S2DvuPv 在這條式子裡的精確意思
符號這裡的精確意思
D送入 estimator 的全部 read 觀測
S1只含一個變異、而且其 read 未進入任何多變異連鎖視窗的變異集合
S2含兩個以上變異的連鎖視窗集合;v 是其中一個視窗,kv 是該視窗的變異數
Dv連鎖視窗 v 的逐條 read 觀測:覆蓋遮罩、ref/alt 狀態,以及觀測到的家族標籤
u一條單倍型連鎖區段=視窗 v × 一條家族;一個視窗至多切出兩條,兩條都在同一個 Pv 因子內
PBBS1 中一個單變異觀測的 beta-binomial 機率;中心與離散度已包含在參數中
Pv第二節才會展開的多變異聯合 read 模型,兩條家族一起;它也包含各位點的邊際 VAF
ΘK固定群數 K 時所有待估狀態的縮寫

先講清楚「家族」是什麼

這個詞接下來會一直出現,所以先定義。 一條 就是HP tag 分出來的兩組 read 之一

家族包含哪些 HP tag對應什麼
家族一1(germline 單倍型 1)+ 1-1(由它衍生、帶 somatic 改變的分子)在同一個 phase block 內,兩族就是該處的兩條同源染色體
家族二22-1
都不是3:somatic 改變歸不到任何一條 germline 單倍型不進任何一族
命名補充:為什麼叫「家族」而不是直接叫「單倍型」

因為分組看的是germline 那一層11-1 屬於同一族, 差別只在後者多帶了 somatic 改變。換句話說,一族=一條 germline 單倍型 連同從它長出來的 somatic 分支

為什麼因子跑在視窗上,而不是跑在家族上

這是很容易寫錯的一步,而且寫錯不會有任何錯誤訊息。 直覺上,既然家族一與家族二的 read 各自形成一張 0/1 狀態表, 把兩張表各算一次機率再相乘似乎最自然。但那樣寫是錯的,有兩個各自獨立的理由:

兩條家族被兩件東西綁在一起,所以拆不開 左右並排比較同一個連鎖視窗的兩種寫法。 每一邊都畫成兩條泳道,上面一條是家族一,下面一條是家族二,泳道裡是該家族的 read。 兩件把兩族綁在一起的東西都畫了出來。 第一件是家族誤標:家族一的泳道裡混進一條顏色屬於家族二的 read, 並有一支箭頭從家族二的泳道指過來,表示這條分子實際來自隔壁,只是標籤標錯了。 第二件是方向開關:左邊只有一個開關,兩條接線分別接到兩條泳道, 所以撥動它會同時翻轉兩族。 左邊因此只輸出一個因子,方向也只被邊際化一次。 右邊是錯誤的寫法:兩條泳道之間築了一道牆當成互相獨立, 那條被誤標的分子於是在兩條泳道各留下一份,用紅圈標出「同一條算了兩次」; 方向開關也變成各自獨立的兩個。 右邊因此輸出兩個相乘的因子,證據量被高估,方向的不確定性也被算掉一半。 兩族被兩件東西綁在一起,所以拆不開 ✓ 綁在一起 → 一個因子 家族 u₁ 家族 u₂ ① 誤標 ξv:這條來自 u₂ σv 一個開關 兩族共用 Pv(Dv ∣ ΘK) 兩族一起算,方向只邊際化一次 ✗ 當成獨立 → 兩個因子 家族 u₁ 家族 u₂ 同一條算了兩次 兩個獨立開關 Pu₁ × Pu₂ 兩個因子各自獨立
兩條家族各有自己的狀態表 —— 資料結構上確實是分開的 —— 但它們被兩件東西綁在一起:家族誤標閘門會把分子從一條通道搬到另一條, 而方向變數 σv 是整個視窗共用一個。 所以分開的是,不是機率:一個連鎖視窗只出一個因子。
綁住兩條家族的東西逐家族相乘會發生什麼
家族誤標:一條分子可能被標到另一條家族(第二節的 ξ兩條家族的觀測不是條件獨立,乘積高估了證據量 —— 同一條被誤標的分子在兩邊各留下一次痕跡
方向變數 σv:兩條家族互為補集,共用同一個方向同一個 σv 會被邊際化兩次,等於當成兩個獨立的擲硬幣,把方向的不確定性算少了一半

因此本頁的規格是:資料表依家族分開建立,機率在視窗這一層合併。 兩條家族的狀態表都由同一組 ΘK 投影出來, 再一起通過第二節那個成對的觀測通道,最後合成一個 Pv

實作補充:若為了計算成本還是逐家族相乘,該怎麼稱呼它

那是一個 composite likelihood 近似(把相關的觀測當成獨立來相乘的簡化寫法), 可以用,但必須如此稱呼並記錄它的偏誤方向 —— 上表兩列已經寫出方向: 高估證據量、低估方向的不確定性。標準與本頁稍後對 「每個遮罩各自一個分布」所立的完全相同。

更完整地說,ΘK 包含細胞比例 w T、 突變指派 z、逐拷貝基因型 G,以及觀測錯誤參數 eckwTz 決定,μmG 決定。 e 不是一個錯誤率,而是一組觀測通道參數的縮寫,包括稍後的逐位點錯誤 ε 與 家族誤標率 ξ。 外部提供的 copy number 與校準後的 φ^ 是條件輸入,為了避免式子過長沒有逐項寫在條件線右側。

ρ 不在這張清單上。本頁的 w 把正常細胞當成第 0 項 一起放進同一個 simplex(g=0Kwg=1,見第二節), 所以純度是推導量 ρ=1w0,不是另一個自由參數。 連續自由度因此是 K 個 —— K=5 時是 5 個。

符號對照:別的論文把 ρ 寫成獨立參數,那樣算會不會多一個?

不會,兩種寫法自由度相同。文獻上常見的寫法是把 ρ 單獨拉出來, 再讓腫瘤內部的比例自成一個 simplex(k=1Kwk=1), 於是自由度是 1+(K1)=K —— 跟本頁的 K 一樣, 因為ρw0 本來就是同一個自由度的兩種寫法。 兩個數錯的方向相反:把 ρw0 各算一次會多一個, 只數腫瘤內部的 K1 則漏掉純度那一格。

推論選項:把突變指派 z 邊際化掉會改變什麼

本式把 z 當作與其他參數共同最佳化的離散狀態,也就是輸出一組明確的突變指派。 若實作選擇把 z 邊際化,likelihood 必須改為對所有指派加總,模型選擇的校準也要跟著重做; 兩種推論方式不可在同一個 Score 裡混用。第七節那張「什麼時候才需要 EM」的表 講的就是這個選擇的下游後果。

成立的關鍵不是「S1S2 兩個名字不同」,而是給定 ΘK 後,兩者背後的 read 觀測可視為條件獨立且沒有交集。 若一批 read 已進入 Dv,它就不能再透過該位點的 am/dm 進入第一個乘積。

要點在於 S2 的因子已經包含那些變異的邊際 VAF: 若視窗 vkv 個變異,一張 2kv 格的聯合表沿任一個位點加總, 得到的就是該位點的 alt/ref 計數。 所以把多變異連鎖視窗的變異再放回第一個乘積,就是把同一批 read 算第二次。

第四層之二:目標函數 = 配適資料 − 複雜度代價 + 先驗偏好

Ldata(K,ΘK)=mS1logPBB(amdm,ΘK)+vS2logPv(DvΘK)
Score(K,ΘK)=Ldata(K,ΘK)12pKlogMeff+logp(K),Θ^K=argmaxΘKLdata(K,ΘK),K^=argmaxK{1,,Kmax}Score(K,Θ^K)

這才是目標函數。第二條是內層問題(固定 K,找最好的 ΘK), 第三條是外層問題(跨 K 比較)。兩層怎麼實際跑,見第八節。

目標函數中的項白話問題數值變大時代表什麼
Ldata(K,ΘK)這個候選模型產生目前 read 資料的能力有多好?資料越支持這組群、tree 與指派
-12pKlogMeff為這個模型用了多少自由度?此項永遠是代價;K 或自由參數越多,扣分通常越大
logp(K)分析前對群數 K 有何先驗偏好?先驗上較可信的群數得到較少懲罰

複雜度項不可省略,因為多開一群幾乎總能改善資料配適,卻可能只是在吸收錯誤。 而它扣多少,取決於 Meff —— 那是考慮同一突變叢與同一連鎖區段內相關性後的 有效獨立資訊量,不是把 read 或變異數直接代入。這個量估錯,模型選擇就整個歪掉

符號與校準:KmaxpKMeffp(K) 各是什麼

Kmax 是分析前指定的最大候選群數;pK 是群數固定為 K 時真正被估計的自由參數數目; p(K) 是群數先驗。先對每個候選 K 找到最佳的 Θ^K,再比較其分數。

Meff 的定義必須在實作前固定並以模擬或 bootstrap 校準;若做不到,應改用預先指定的 held-out predictive score,而不是把未校準的 BIC 當成精確答案。

還有一件尺度上的事要先講清楚:局部的比值只能定出 c 的相對尺度, 不能憑空補出純度的絕對尺度 —— 絕對尺度只能來自 S1 那一批全基因體的單變異觀測, 或外部的純度估計。

實作選項:有可靠的外部純度估計時該怎麼接進來

作法不是「多固定一個參數」,而是w0 釘住w0=1ρ^),自由度因而由 K 降為 K1。 沒有外部估計時 w0 與其餘比例一起估。

此處寫的是可實作的統計規格,不是已完成或已驗證的 estimator 程式。 以下各項定義的目的,是讓後續實作能逐項測試;在合成資料與真實重複資料通過末節所列驗證之前, 不得把 Score 的最大值當成已證實的生物學結論。

符號多,不代表待估參數多

到這裡已經出現了二十幾個符號,很容易產生「要估的東西多到不可能估得準」的印象。 但大部分符號不是自由參數:有些是從別的量算出來的,有些是上游分析餵進來的, 有些要先用獨立資料校準好才進模型。把它們分清楚, 是判斷「這個結果可不可信」的第一步 —— 因為風險幾乎都不在自由參數上, 而在那些被當成已知、其實估錯了的量上

二十幾個符號,真正在搜尋的只有中間那五個 圖由左至右是一條決定關係的鏈。 左欄是進模型前就要備妥的量:拷貝數、過度離散度、逐位點錯誤率、家族誤標率、 有效資訊量與覆蓋遮罩,共六個。它們被一個紅色虛線框圈起來, 因為這一側估偏時不會有任何錯誤訊息,模型照樣收斂,只是收斂到錯的群數與錯的樹。 中欄是主模型真正在搜尋的東西,只有五個:群數、clone tree、突變指派、 逐拷貝基因型,以及一組細胞比例。 右欄是沿箭頭算出來的推導量:純度、CCF、multiplicity、預期 VAF 與分子比例、 錯誤地板總量,它們不是額外的自由參數。 兩支粗箭頭標出方向:左欄餵進來,右欄算出去。 所以符號雖多,待估的只有中間那一欄。 二十幾個符號,真正在搜尋的只有五個 ① 進模型前備妥 CNm 拷貝數 φ 過度離散度 ε 逐位點錯誤 ξv 家族誤標 Meff 有效資訊量 遮罩 覆蓋幾何 估偏時不會報錯,只是安靜收斂到錯的 K 餵進來 ② 主模型自由估 只有這五個在搜尋 K 群數 T clone tree z 突變指派 G 逐拷貝基因型 w 細胞比例 自由度 K 個,定義域是一個 simplex 算出來 ③ 沿箭頭算出來 不是額外的參數 ρ 純度 = 1 − w₀ ck CCF μm multiplicity θ、q 預期 VAF 與分子比例 δv 錯誤地板總量
由左至右就是「誰決定誰」:左欄餵進來、中欄是唯一在搜尋的、右欄沿箭頭算出去。 下表逐項列出同一批量;圖要看的是方向與比重 —— 中間那一欄只有五個, 而紅框圈起來的左欄估偏時不會報錯,只會讓中欄安靜地收斂到錯的答案。

兩個讀法上的要點。其一,真正在搜尋的只有五樣東西: 群數 K、clone tree T、突變指派 z、逐拷貝基因型 G, 以及一組 K 個自由度的細胞比例 w。其餘不是算出來的,就是進模型前該備妥的。 其二,「不自由估」的那幾個才是這個方法的真正風險所在 —— CNφεξvMeff 估偏時模型不會報錯,它會照樣收斂,只是收斂到錯的 K 與錯的樹。 第四節的錯誤地板與本頁末的問答,講的都是這件事。

逐項清單:十五個量各自的類型、來源、是否自由估、不確定度怎麼處理
類型來源主模型中自由估?需先校準?不確定度怎麼處理
K模型大小推論(外層)Score 的模型選擇
T(clone tree)離散結構推論(外層)保留多個候選,不只報一棵
z(突變指派)離散結構推論(外層)共同最佳化,或邊際化(兩者不可混用)
G(逐拷貝基因型)離散結構推論+CN 候選(外層)候選整組帶入
w(細胞比例,含 w0連續參數推論(內層,K 個自由度)似然;需多起點
ρ(純度)推導量ρ=1w0有外部估計時改為釘住 w0
ck(CCF)推導量w,T,z 算出w 傳遞
μm(multiplicity)推導量G 決定隨候選 genotype 列舉
CNm(total CN)上游輸入copy-number 分析/QC敏感度分析;或多個 CN 候選邊際化
φm(單位點 overdispersion)校準量獨立校準資料,依 depth × CN 分層分層校準;稀疏格標為未知
ε(逐位點錯誤)校準輸入平台/basecaller,加序列脈絡分層依脈絡分層,不用單一常數
ξv(家族誤標率)觀測 nuisance就地、成對估計視實作成對估計;kv2 時主導錯誤地板
δv(錯誤地板總量)推導量εξv 算出隨兩個錯誤通道傳遞;不要與 ε 混用
τu(區段內離散度)觀測 nuisance預設不啟用(第三節)預設否殘差顯示過度離散時才加
σv(家族方向)潛在變數邊際化掉每視窗一個,加總掉
Meff(有效資訊量)校準量模擬或 bootstrap做不到就改用 held-out predictive score

因此這個 estimator 不是從原始 BAM 無條件地推出 clone tree。 它吃的是一套已經跑過 variant calling、copy-number calling、定相、單倍型標記 與錯誤校準的上游資料,而上述每一項都是它的輸入契約的一部分。 逐項該釘住哪些工具版本與門檻,是另一個層次的問題,本頁不展開。

二、一個多變異連鎖視窗的生成模型

上式的 Pv(DvΘK) 是整份規格的核心。它必須從全域參數一路長到一條 read 上看到的字母,中間不能有任何自由參數 —— 一旦局部比例可以自己亂動, 這個視窗就不再對全域參數施加任何限制,整條路線也就白做了。

先講清楚一件事:兩類觀測是同一條生成鏈的兩個出口

在展開細節之前要先擋掉一個很自然、但會把整件事讀歪的誤解: 單位點 VAF 不是多位點狀態表的先驗。 兩者都是觀測,都由同一組 ΘK 沿同一條鏈生出來:

細胞組成(w,T,z)拷貝加權的分子比例(η,q)read 上的觀測(am/dm,Dv)

中間那一步就是「細胞這一層」換算到「分子這一層」的地方,換算因子是拷貝數。 θmk(第一節)與 qu,h(本節)是同一個換算的兩個出口: 前者只問一個位點,後者問一整組位點的聯合。

單位點 VAF 與多位點狀態表是同一條生成鏈的兩個出口 圖由左至右分成三段。左段是細胞這一層:正常細胞與各個 clone 依細胞比例 w 混在一起。 中段是換算:每個 clone 貢獻的分子數不只看它的細胞比例,還要乘上它在這個位置的拷貝數, 所以細胞比例與分子比例之間差一個拷貝數因子,這就是 eta 與 q 所做的事。 右段是兩個出口:同一組分子比例,只問一個位點時得到預期 VAF theta, 問一整組位點的聯合時得到狀態表 q,兩者最後都變成 read 上的觀測。 圖下方的橫帶是重點:VAF 不是狀態表的先驗, 兩者是同一組參數生出來的兩批觀測,所以能相乘的是機率, 前提是同一條 read 不會同時進入兩個出口。 同一條鏈,兩個出口 ① 細胞組成 參數 w、T、z 正常細胞 w₀ clone 1 w₁ clone 2 w₂ 這一層講的是「有多少細胞」 總和為 1,所以純度 ρ = 1 − w₀ ② 乘上拷貝數 得到 η 與 q 一個 clone 貢獻多少分子 不只看它有多少細胞 CN = 4 的 clone 貢獻加倍 LOH 時兩條同源染色體 不再各佔一半 —— 這裡自動處理 這一層是「細胞 → 分子」的接縫 出口一:只問一個位點 預期 VAF θ_mk 觀測是 a_m / d_m → beta-binomial 因子 出口二:問一整組位點 狀態表 q_u,h 觀測是 D_v → 多位點 read 因子 所以 VAF 不是狀態表的先驗 兩個出口都是觀測,由同一組 Θ_K 生出來 —— 不是先用 VAF 當先驗,再去生 HP1/HP2。 層級之所以接得起來,是因為兩邊最後都被換算到 read 這一層: 「在這組參數下,看到眼前這些 read 的機率是多少?」 能相乘的前提只有一個:同一條 read 不可以同時進入兩個出口。
中段那個「乘上拷貝數」就是細胞層與分子層的接縫 —— θmkqu,h 是同一個換算的兩個出口, 一個只問一個位點,一個問一整組位點的聯合。

這解釋了 CCF 與 clone 比例講的是細胞、 而 HP1/HP2 的狀態表講的是分子,層級不同卻仍能相乘的原因: 它們最後都被換算到同一層 —— 兩個因子都在問「在這組 ΘK 下,看到眼前這些 read 的機率是多少」。 所以能相乘靠的是兩件事,兩件都必須成立: 其一,細胞 → 分子的投影要正確(這是本節的工作); 其二,沒有一條 read 同時進入兩個因子(這是第一節的工作)。

這條鏈預設了什麼

投影正確與否,取決於幾條沒有寫在式子裡、但整份規格都靠它們成立的假設。 把它們列出來,是因為違反時的後果各不相同,不列出來就沒辦法判斷某個結果可不可信:

假設用在哪裡違反時會怎樣
每個突變只發生一次(無限位點)第八節的候選列舉:一條邊只加一個突變recurrent/convergent 突變會被讀成「兩群共享祖先」,最小成本解補進的不是記帳節點而是錯的拓撲
突變不會消失同上,以及 H 沿樹單調累積deletion/LOH 把突變刪掉時,子代看起來「沒有」祖先的突變,同樣偽造出分岔
同一 CN 區段內各 clone 的拷貝數一致η 的分母 CNugsubclonal CNA 下分母逐 clone 不同,q 整體偏移;第十二節第 6 階段才放寬
一條 read 就是一條分子第三節主張預設 multinomial有 PCR 重複時同一條分子被讀到多次,計數的離散度被低估
無限位點假設違反時,錯的不是節點而是拓撲 圖分成三欄。左欄是假設成立的情形:每個突變在整棵樹上只發生一次, 所以兩個細胞群共同帶有某個突變,就真的代表它們共享一個祖先,重建出來的樹是對的。 中欄是重複突變:同一個位點在兩支各自獨立發生一次, 資料上看起來和共享祖先完全一樣,於是兩支被錯誤地併到同一個祖先之下。 右欄是突變遺失:某支的突變被刪除或因雜合性缺失而消失, 子代看起來沒有祖先的突變,於是本來巢狀的關係被讀成分岔。 三欄的觀測都不會產生任何錯誤訊息,差別只在重建出來的樹是對是錯。 重點是這兩種違反改動的是樹的形狀本身,不是多補一個潛在節點就能修掉的問題。 違反時,錯的是樹的形狀 假設成立 每個突變只發生一次 兩支各帶自己的突變 共同帶有某突變 = 真的共享祖先 → 重建出來的樹是對的 違反一:重複突變 同一位點在兩支各發生一次 兩邊看到同一個突變 資料上與「共享祖先」 完全一樣,分不出來 → 兩支被併到同一祖先下 違反二:突變遺失 deletion 或 LOH 把它刪掉 子代看起來沒有它 本來是巢狀關係, 卻讀成兩群互不包含 → 偽造出一個分岔 這不是多補一個潛在節點就能修掉的問題 潛在節點修的是「這個狀態沒被抽到」;這裡壞掉的是拓撲本身 而且三欄的觀測都不會產生任何錯誤訊息。
三欄的觀測都不會產生錯誤訊息,差別只在重建出來的樹是對是錯。 重複突變讓兩支被併到同一祖先下,突變遺失則把巢狀關係讀成分岔 —— 兩者壞掉的都是拓撲本身,不是補一個潛在節點能修的。

前兩條在多數體細胞 SNV 上成立得相當好,這也是簡約類方法長期沿用它們的理由; 但它們是假設而不是結論,尤其在高突變負荷或 CN 劇烈變動的樣本上要另行檢查。 第四節那個「潛在節點的三種身分」正是這條假設在輸出端的表現形式。

生成模型:從全域的 clone 一路長到一條 read 上看到的字母 五層,上排三格下排兩格,每一層只做一件事,中間沒有自由參數。 第一層是全域物件:一棵 clone tree、每個 clone 的細胞比例,以及每個突變掛在哪個 clone 上。 全基因體只有這一份,所有連鎖區段共用。 第二層把全域物件投影到一個連鎖區段上。一個連鎖區段是一個連鎖視窗乘一個單倍型家族, 所以只看得到一條染色體拷貝,另一條拷貝屬於另一個連鎖區段。 投影的結果是每個 clone 在這個連鎖區段上的局部基因型, 例如全參考、只帶第二個突變、三個都帶。 第三層把細胞比例換成分子比例:一個細胞貢獻幾條分子,取決於它在這裡有幾份拷貝, 所以權重是細胞比例乘上該家族的拷貝數,再除以全部分子數。正常細胞只落在全參考那一格。 第四層是觀測通道,有兩個入口:逐個位點的定序錯誤,一次只改一個字母; 以及整條分子的家族誤標,一次把所有位點一起換成另一個家族的樣子。 兩者的形狀不同,所以不能用同一個參數描述。 第五層是一條 read:它只覆蓋到部分位點,沒覆蓋到的位點被邊際化掉, 不是被當成參考型。所以一條只看到第一與第三個位點的 read, 會同時支持所有第一與第三位點相符的完整狀態。 右下角說明 k 等於一時這整條路徑退化成什麼:只有兩格, 第三層的比例就是期望 VAF,第五層沒有部分覆蓋的問題,得到的正是 beta-binomial。 最下方標注:所有連鎖區段共用第一層,這就是合併發生的地方,不需要任何對齊步驟; 而局部表格不是第二批資料,同一批 read 不可以在兩邊各算一次。 讀法是:局部看到的每一個數字,都是同一組全域參數投影下來的。 生成模型:全域 clone → 連鎖區段 → 分子 → 通道 → 一條 read ① 全域參數 只有一份,所有連鎖區段共用 clone tree 細胞比例 w 突變指派 z ② 投影到一個連鎖區段 連鎖區段 = 連鎖視窗 × 單倍型家族 000 正常 010 clone A 111 clone B 只看得到一條拷貝 另一條在另一個連鎖區段裡 ③ 細胞 → 分子 η = w·A / Σ w·CN 000 010 111 拷貝數在這裡進來 不是事後乘上去的 ④ 觀測通道(兩個入口) 逐位點錯誤:一次只改一個字母 000 → 010  機率 ε 家族誤標:整條分子一起搬過來 另一家族的 111  機率 η 形狀不同,不能共用一個參數 ⑤ 一條 read 1 1 只覆蓋第 1、3 個位點 沒覆蓋的位點要邊際化 不是填成參考型 P = q(101) + q(111) 一條中立的 read,不是反對票 k = 1 時退化成什麼 只有兩格(參考/變異), ③ 的比例就是期望 VAF, ⑤ 沒有部分覆蓋的問題。 = beta-binomial 合併在哪裡發生 每個連鎖區段各自跑完 ②③④⑤, 但都由同一組 ① 算出來, 相乘即完成,不需要對齊步驟。 局部表格不是第二批資料:它與 95% 連鎖視窗的 VAF 由同一組參數產生。 所以同一批 read 不可以在兩邊各算一次 —— 多變異連鎖區段的邊際 VAF 已含在它的聯合表裡。
五層各做一件事,中間沒有自由參數。 注意第二層:一條家族只看得到一條染色體拷貝,另一條是同一個視窗裡的另一條家族 —— 這決定了第三層的分母該怎麼寫。第五層的部分覆蓋是邊際化,不是填成參考型。

連鎖區段、局部基因型與分子權重

一個連鎖區段 u 是一個單倍型連鎖區段:一個連鎖視窗 × 一條 。 這個切法很重要:它表示一個連鎖區段裡的 read 全部來自同一條染色體拷貝, 另一條拷貝屬於同一個視窗的另一條連鎖區段。因此 不可以在連鎖區段內部再把兩條拷貝混起來寫成各佔一半 —— 那是尚未依家族分組時的寫法,用在已分組的資料上會把細胞比例整體算錯將近一倍。

要同時記住兩件看似相反、其實各管一段的事,第一節那張表已經寫過一次: 狀態表逐家族分開建立(u 這一層),機率在視窗合併(v 這一層)。 以下先在單一家族內把 qu 建起來,本節末尾再把兩條家族接回同一個 Pv

設 clone g 在拷貝 b 上的全域基因型為 Gg,b,m{0,1}, 投影到連鎖區段 u 的那幾個位點,即得局部基因型 Hugb{0,1}kv。基因型寫在拷貝這一層而不是 clone 這一層, 是為了讓 cis/trans 與 LOH 有地方表達。分子權重則為:

ηugb=wg·Augbg'wg'·CNug',qu,h=g,bηugb·1(Hugb=h)

Augb 是該拷貝在此處的份數,CNug 是 clone g 在此處的總拷貝數。 分母是全部分子數,所以 g,bηugb=1拷貝數在這裡進入,不是事後乘上去的;LOH 時兩條同源染色體不再各佔一半, 這條式子自動處理。正常細胞是 w0 那一項,CN=2, 其局部基因型恆為全參考。

回頭對照:這條式子就是第一節說「ρ 不是自由參數」的來源

g 跑遍 0K,且 g=0Kwg=1, 所以純度是 ρ=1w0 —— 純度已經包含在細胞組成裡,不是事後再乘一次的換算因子。 第一節 θmk 那條式子裡的 ρck 也都是從這同一個 w 算出來的,只是在單變異那一層寫成比較眼熟的形式。

要注意 qu,h分子比例而非細胞比例,兩者差一個拷貝數因子。

與中篇的接點:用途三不是額外的約束,是這個模型的推論

中篇第五節那條「兩個非參考型的組相除、共同分母消去」的式子, 就是這裡任取兩格相除的結果。 所以它不是一條要另外加進去的等式約束 —— 寫下 qu,h 之後,那條式子自動成立。

覆蓋遮罩:沒覆蓋到的位點要邊際化

一條 read 只覆蓋連鎖區段裡的一部分位點。設其覆蓋遮罩MJu、觀測到的字母為 y{0,1}|M|,則

qu,M(y)=h:hM=yqu,h

也就是把所有「在 M 上與 y 相符」的完整狀態加起來。 一條只看到第一與第三個位點、讀到 11 的 read,同時支持 101111沒覆蓋到的位點不可以填成參考型 —— 那會把一條中立的 read 變成一條反對 111 的證據。

一個連鎖區段一個 p,不是一個遮罩一個

同一個連鎖區段裡不同遮罩的 read 取樣的是同一池分子, 所以它們的比例是相關的。正確的寫法是讓整個連鎖區段共用一個潛在比例向量, 每條 read 各自從它自己的遮罩投影出來:

puDirichlet(τu·qu),yiMi,puCategorical(ProjMi(pu))
實作補充:改成「每個遮罩各自一個分布」會怎樣

那等於宣稱不同遮罩的 read 來自互相獨立的分子池。那是一個 composite likelihood 近似,可以用,但必須如此稱呼, 而且它會低估同一連鎖區段內部的相關性 —— 與前一節「逐家族相乘」是同一類的簡化。

觀測通道:兩種形狀不同的錯誤

qu 是「還沒經過任何錯誤」的比例。實際觀測到的比例要再過一層:

逐位點錯誤與整條分子誤標的形狀不同,而且位點越多,誤標越是主角 左邊是逐位點的定序錯誤。它一次只改一個字母, 每個位點各自獨立,所以要一次改對三個位點才會生出一個完全不同的狀態, 機率是單點錯誤率的三次方,小到可以忽略。 右邊是整條分子的家族誤標。一條本來屬於另一個單倍型家族的分子被標錯, 整條就這樣跳到這個連鎖區段裡,它的三個位點是一起過來的, 所以機率只有一個誤標率,跟位點數完全無關。 中間下方是兩者的比較表。以單點錯誤率千分之五為例, 差一個位點時兩者相當;差兩個位點時誤標大約高一百倍; 差三個位點時高兩萬倍以上。 所以位點越多,能造出假狀態的幾乎只剩誤標這一條路。 最下方是後果:如果模型只寫了逐位點錯誤, 那麼在全參考的背景上冒出來的三位點全變異狀態, 在模型眼中會是「錯誤不可能造出來的」,於是只剩一個解釋 —— 一個新的 clone。 而它真正的來源是隔壁那個家族。 讀法是:一個參數描述不了兩種形狀不同的錯誤,寫漏的那一種會直接變成假的 subclone。 兩種錯誤的形狀不同:一種改一個字母,一種搬走一整條分子 逐位點定序錯誤 每個位點獨立,一次改一個字母 0 0 0 只有中間這個位點被讀錯 0 1 0 要生出一個差三個位點的狀態, 同時錯三次:ε³ 整條分子的家族誤標 三個位點一起過來 另一個單倍型家族 1 1 1 整條被標到這個連鎖區段 1 1 1 機率只有一個誤標率 η, 與位點數無關 差幾個位點,誰才是主角(以 ε = 0.005、η = 0.01、來源比例 0.3 為例) 差 1 個位點 逐位點 5×10⁻³ 誤標 3×10⁻³ 兩者相當 差 2 個位點 逐位點 2.5×10⁻⁵ 誤標 3×10⁻³ 誤標高約 100 倍 差 3 個位點 逐位點 1.3×10⁻⁷ 誤標 3×10⁻³ 誤標高約 20,000 倍 只寫逐位點錯誤會發生什麼 在全 0 的背景上冒出 111:模型認為錯誤造不出來(10⁻⁷), 於是只剩一個解釋 —— 一個新的 clone。而它真正的來源是隔壁那個家族。 讀法:一個參數描述不了兩種形狀不同的錯誤;寫漏的那一種會直接變成假的 subclone。
左右兩種錯誤的形狀不同:一種一次改一個字母,一種一次搬走整條分子。 位點差得越多,逐位點錯誤的機率掉得越快,而誤標完全不受位點數影響 —— 所以差三個位點時,能造出假狀態的幾乎只剩誤標這一條路。

兩種錯誤不是同一類參數:一個能先校準,一個不能

既然定序平台固定,錯誤率是不是就可以當成已知常數餵進來? 對一半,而這一半正好是比較不重要的那一半。兩個通道要分開處理:

通道定位理由
逐位點錯誤 ε 平台校準輸入+序列脈絡修正 基準值確實由平台與 basecaller 決定,可以事先校準一次。但它逐脈絡變動 —— 區、低複雜度序列與 mapping/參考偏誤都會把它抬高數倍, 所以進模型的是一張依脈絡分層的表,不是一個全域常數
家族誤標 ξv 必須就地、成對估計 它衡量的不是定序品質,是定相品質:取決於該區域的雜合位點密度、 phase block 長度與 read 跨距。同一台機器、同一個 basecaller, 在雜合位點稀疏的區域 ξ 可以差一個數量級。平台固定完全不決定它
平台固定住的是逐位點錯誤,不是家族誤標 圖比較同一台機器、同一個 basecaller 在兩個不同區域的行為。 上排是雜合位點密集的區域:定相有很多錨點,phase block 長, 分子被標到正確家族的把握高,所以家族誤標率低。 下排是雜合位點稀疏的區域:錨點少,phase block 短, 同一台機器下的家族誤標率可以高一個數量級。 兩排的逐位點錯誤率則幾乎一樣,因為它由平台與 basecaller 決定。 結論寫在下方:把逐位點錯誤當成校準過的已知量大致無害, 因為它隨差異位點數以指數下降; 但家族誤標與位點數無關,在多位點時它幾乎單獨決定錯誤地板, 而它衡量的是定相品質而不是定序品質,所以平台固定完全不決定它。 同一台機器,兩個區域,兩種行為 雜合位點密集的區域 錨點多 → phase block 長 → 家族標得準 ε 逐位點 基準值 由平台決定 ξ 家族誤標 錨點充足 雜合位點稀疏的區域 錨點少 → phase block 短 → 家族容易標錯 ε 逐位點 幾乎不變 機器沒換 ξ 家族誤標 高一個級距 錨點不足 ξ 衡量的是定相品質,不是定序品質 所以「平台固定所以錯誤率已知」對 ε 大致成立,對 ξ 完全不成立 —— 而多位點時錯誤地板幾乎由 ξ 單獨決定,因為 ε 隨差異位點數以指數掉下去。
同一台機器、同一個 basecaller, ε 幾乎不變而 ξ 可以差一個數量級 —— 因為 ξ 衡量的是定相品質(錨點夠不夠),不是定序品質。

這個區別有實際後果,而且方向明確:kv2 時錯誤地板幾乎完全由 ξv 決定,因為 εr 隨位點數急速掉下去而 ξv 不會。 所以「把錯誤率當成已知」若指的是 ε,大致無害; 若指的是 ξv,那正是第四節錯誤地板訂錯的主要途徑 —— 也就是把幾條誤標的分子讀成一個新 clone 的那條路。 ξv 尤其要成對估計,因為它同時連結一個視窗的兩條家族。

觀測要經過幾道閘門:每個位點一道,最後兩個家族之間再交換一次 兩條並排的通道分別是同一個連鎖視窗的兩個單倍型家族。 每條通道由左到右經過相同的幾個階段。 起點是真實的分子組成。 接著是每個位點各一道錯誤閘門,閘門會把參考型讀成變異型,也會把變異型讀成參考型, 兩個方向的機率不一樣,所以閘門不是對稱的。 k 個位點就串 k 道閘門,把它們串起來就是公式裡那個張量積。 最後一道是家族交換閘門:大部分的分子留在自己的通道, 但有一小部分會被標到另一條通道去,圖上用兩條交叉的虛線表示。 終點是實際觀測到的計數。 圖的下方指出這件事的後果:因為交換閘門把兩條通道接在一起, 兩個家族必須一起估。分開估會讓譜系內比例每個連鎖區段都往零點五偏一點, 而且幾萬個連鎖區段偏的方向相同,那不是把譜變寬,是把整條譜平移。 讀法是:公式裡的三個符號各對應圖上一道閘門。 觀測要經過幾道閘門 家族 H1 家族 H2 真實組成 真實組成 位點 1 閘門 ε₁ , η₁ 位點 1 閘門 ε₁ , η₁ 位點 2 閘門 ε₂ , η₂ 位點 2 閘門 ε₂ , η₂ 這兩道串起來就是公式裡的 T = E₁ ⊗ E₂ (k 個位點就串 k 道) 家族交換閘門 δ 1 − δ δ 觀測計數 觀測計數 ε 是「把 REF 讀成 ALT」,η 是「把 ALT 讀成 REF」—— 兩個方向機率不同,所以閘門不對稱。 兩者都可以用同一個連鎖視窗裡的 germline 雜合位點就地估出來,不必外部參數。 交換閘門把兩條通道接在一起,所以兩個家族必須一起估。分開估會讓 ϱ 每個連鎖區段 都往 0.5 偏一點,而且幾萬個連鎖區段偏的方向相同 —— 那不是把譜變寬,是把整條譜平移。
每個位點一道錯誤閘門;最末一道為家族交換閘門, 少部分分子被標至另一條通道。交換閘門連結兩條通道,故兩個家族必須一併估計 —— 這道閘門就是「一個視窗只出一個因子」的具體原因。

把兩條家族接回同一個因子

交換閘門的存在,表示一條被標成家族 u 的 read 不一定真的來自家族 u。所以真正用來算機率的觀測分布, 必須是「正確標記」與「由隔壁誤標進來」兩個來源的混合。 令 u1u2 為視窗 v 的兩條家族, αu'u 為「一條最後被標成 u 的 read,實際來自家族 u'」的權重:

qu,Mobs(y)=u'{u1,u2}αu'u·qu',M(y),u'αu'u=1

αuu 是正確標記的比例,另一項由 ξv 與兩條家族的分子數導出, 不是每條家族各自自由擬合的比例α 同時出現在兩條家族的式子裡 —— 這就是逐家族相乘不成立的地方。

HP1/HP2 的方向是 nuisance,而它屬於視窗

家族標號在每個 phase set 內獨立決定, 所以「這個視窗的家族一」對應到全域基因型的哪一條拷貝 b 並不確定。 處理方式是引入一個方向變數 σv{,調} 並把它邊際化。 σv 是每個連鎖視窗一個,不是每條家族一個 —— 同一個視窗的兩條家族互為補集,對調就是同時對調,共用同一個方向:

P(DvΘK)=σvP(DvΘK,σv)·P(σv)

σv 在這裡只被邊際化一次。若寫成逐家族各自邊際化, 等於把一個方向當成兩次獨立的擲硬幣,會把方向的不確定性算掉一半。

作用域補充:σ 如何跨 phase set 定義

若兩個 phase set 之間沒有共享的變異,也沒有其他錨點,而且相關 clone 的比例又相同, 則它們的對應關係真的不可辨識。此時正確的輸出是保留數個等價的對應, 而不是挑一個印出來。

三、預設是 multinomial:一條 read 是一個分子

上式寫了一個 τu,但它的預設值應該是無窮大,也就是退化成 multinomial。理由是 guardrail 第 7 條的直接後果:

beta-binomial 的 overdispersion 來自「分子池的真實比例偏離期望值」—— 那是一個兩段抽樣的結構:先從細胞抽出分子,再從分子抽出 read。 而 PCR-free 的長讀定序沒有第二段一條 read 就是一條分子, 不存在同一條分子被讀到兩次的情形。細胞數又以百萬計, 第一段抽樣的變異小到可以忽略。所以在一個連鎖區段內部, read 的計數本來就是 multinomial,額外的離散度沒有來源。

這給出一條明確的實作規則:先用 multinomial,只有在殘差真的顯示額外離散時才加 τu,而且要說得出它來自哪裡(連鎖視窗內部的 mapping 或覆蓋不均, 而非分子抽樣)。τu 若要估,也必須跨可比較的連鎖區段分層借力 —— 一張稀疏的計數表沒有能力同時定出 qu 與它自己的離散度。

與中篇的接點:同一個理由讓用途二的 φ 量測方式需要重做

用途二以「同一連鎖區段、同一條單倍型上數個變異之間的離散度」量測 φ。 但若這些變異位於同一批分子上,分子池的偏離是它們共有的, 在兩者相減時會消去 —— 剩下的只有各自的 read 抽樣與 base error。 這樣估出來的 φ^偏低,而偏低的 φ^ 正好把 K 往上推,方向與這條路線想要的結論相同 —— 這是一個要主動避開的偏誤。 φ 應改由相距夠遠、分子池獨立的同群變異估計。本頁末的未解問題有列這一項。

四、三種不同的「沒有」

這一節是整份規格裡最容易出事的一節:狀態表上一格是 0, 可能代表三件完全不同的事,而三者的觀測一模一樣。 分不開它們,錯誤造出來的少數幾條 read 就會被讀成一個新的 clone。

一格是空的,有三種完全不同的原因 三欄並列,三欄的觀測完全一樣:那一格的計數是零。但成因不同,處理方式也不同。 第一欄是抽樣零。那個狀態真的存在,只是跨越這幾個位點的分子太少,沒抽到。 判準是機率:沒抽到的機率等於一減去它的比例,再取跨越深度次方。 跨越深度三、比例三成時,這個機率大約是三分之一, 所以「沒看到」幾乎沒有排除任何東西。跨越深度五十九時才降到百分之五。 處理方式是讓似然自己算,不需要任何門檻。 第二欄是結構零。沒有任何 clone 帶有那個基因型,所以它的真實比例就是零。 這是我們真正想推論的結論,不是輸入。 第三欄是錯誤地板。那個基因型確實不存在,但定序錯誤與家族誤標仍然會產生看起來像它的 read。 所以觀測到的比例永遠不會真的是零,而是壓在一個地板上。 中間橫跨一條警告:Dirichlet 的參數不允許是零, 所以結構零必須經過錯誤通道抬到地板之上,模型才寫得下去。 最下方是三者的處理方式對照。 讀法是:把這三種零混為一談,就會把錯誤產生的少數幾條 read 讀成一個新的 clone。 同樣是「這一格沒有 read」,成因有三種 ① 抽樣零 狀態存在,只是沒抽到 P(看不到) = (1 − q)ⁿ n = 3、q = 0.30 → 0.34 三分之一的機率誤判成「不存在」 n = 59 才降到 0.05 處理:讓似然自己算 ② 結構零 沒有任何 clone 帶這個基因型 q = 0 這是要推論出來的結論 不是輸入,也不是門檻判出來的 硬性排除等於把結論當成前提 處理:讓資料把 q 壓下去 ③ 錯誤地板 基因型不存在,但錯誤會造出它 q觀測 = (1−ε)·q + ε·r 觀測比例有一個下界 逐位點錯誤 + 家族誤標都在這裡 地板高度決定得出來的解析度下限 處理:寫進觀測通道 為什麼 ② 與 ③ 一定要分開寫:Dirichlet 的參數不可以是零 結構零給出 q = 0,但 Dirichlet 分量必須為正。所以結構零一定要 先經過 ③ 的通道抬到地板之上,式子才寫得下去 —— 這不是技術細節, 它就是「零不代表不可能」的數學形式。 三者的觀測一模一樣,都是「這一格計數為 0」 分得開它們的不是那個 0,是跨越深度、其他連鎖區段的證據,以及就地估到的錯誤率。 混為一談的後果:錯誤造出來的少數幾條 read,會被讀成一個新的 clone。 讀法:門檻只能把三種零一起丟掉;似然可以分別給它們不同的重量。
三欄的觀測一模一樣,都是「這一格計數為 0」。 分得開它們的不是那個 0,而是跨越深度、其他連鎖區段的證據,與就地估到的錯誤率。 中間那條警告是這一節的關鍵:Dirichlet 的參數不可以是零。

第二種與第三種必須分開寫,還有一個純技術但無法迴避的理由: Dirichlet 的參數不可以是零。結構零給出 qh=0, 而 τqh=0 不是一個合法的 Dirichlet 分量。 所以結構零一定要先經過錯誤通道抬到地板之上:

qu,hobs=(1δv)·qu,h+δv·ru,h

δv地板的總量:一條 read 有多少機率來自任何一種錯誤來源。 它εξv 算出來,不是第三個自由參數kv2 時幾乎完全由家族誤標 ξv 撐起來,這也是它掛在視窗層的原因。 ru,h 是地板的形狀(錯誤會把機率灑到哪幾格),逐家族不同, 因為它取決於隔壁那條家族長什麼樣。

這不是為了數值穩定而加的小常數。 它就是「零不代表不可能」這句話的數學形式 —— δvru,h 的大小正是這個連鎖區段能分辨的最小比例, 也就是第十一節那個偵測下界的來源。若 ru,h 由第二節的兩個錯誤通道算出來, 這個地板是可以就地估計的量,不需要另設參數。

這一節的取捨在整份規格裡最容易被低估,所以本頁末的「預測與結果檢視」 用一整個問答把它再走一次:門檻確實不需要了,但錯誤地板變得比以前更重要

潛在節點的三種身分

樹成本等於潛在節點數,所以最小成本就是「補最少的看不到狀態」 左上是成本的算式。樹的成本等於邊數,邊數等於節點數減一, 而節點數等於固定節點數加上潛在節點數, 固定節點是參考型的根加上實際觀測到的狀態,潛在節點是為了把樹接起來而補進去的狀態。 所以最小成本等價於最少潛在節點。 右邊是一個例子:觀測到的只有全參考的根與兩個變異都帶的狀態,中間什麼都沒看到。 因為一步只能加一個突變,中間必須補一個狀態,補哪一個資料沒有意見, 於是得到兩個並列的最小成本候選,兩者成本都是二。 正確的做法是兩個都留著,而不是挑一個。 最下方指出潛在節點數本身就是一個值得統計的量: 它數的是「這棵樹需要、但沒有任何觀測支持」的狀態, 把全基因體的分布畫出來,就是這份重建有多少比例來自推論的直接量度。 讀法是:潛在節點不是一群還沒被觀察到的細胞,它是模型為了連通而記的帳。 最小成本 = 補最少的「看不到的狀態」 cost(T) = |E| = |V| − 1 = C + |H| − 1 C = 根 + 觀測到的狀態  H = 補進去的潛在節點 C 固定時,最小成本就等價於最少潛在節點。 例:只觀測到 00 與 11 00 11 中間一定要經過一個狀態,但補哪一個資料沒有意見 補 10 |H| = 1 cost 2 補 01 |H| = 1 cost 2 兩個都留著 潛在節點數本身就是一個值得統計的量 它數的是「這棵樹需要、但沒有任何觀測支持」的狀態。 把全基因體的分布畫出來,就是這份重建有多少比例來自推論的直接量度 —— 而且求解器本來就算出來了,它就是成本。 但要記住它的意思:潛在節點不是一群還沒被觀察到的細胞。 它可能對應真的中間世代,也可能只是模型為了連通而記的帳。
樹的成本等於固定節點數加潛在節點數減一, 故最小成本等價於潛在節點數最少。潛在節點為該樹所需、但無任何觀測支持的狀態。

觀測到 000010111011110 皆空時, 最小成本解會補進一個中間狀態。這個節點的身分必須標清楚,因為它有三種可能, 而三者的意義完全不同:

身分意義可以拿來做什麼
現存的 clonew>0,只是沒抽到可以,但要標明是抽樣零
歷史狀態w=0,曾經存在但已被後代取代可以進樹,不可計入細胞比例
記帳節點只因「一條邊只能加一個突變」這個表示法而存在不可當成任何生物學實體
解讀邊界:記帳節點不等於 subclone

局部超立方體用的是「一步一個突變」的簡約假設, 但全域的 z多個突變指派到同一個 clone —— 在全域這一層, 010111 完全可以是一條邊,中間不需要任何節點。 所以那個補進來的節點是局部表示法的產物,不是「還沒找到的 subclone」。 這正是 那條警告的具體形式:潛在節點數 |H| 仍然是個有用的統計量 (它量的是這份重建有多少比例來自推論),但它是記帳,不是證據。

五、分類是輸出,不是輸入

現行流程會把每個連鎖區段標成分岔、串接或不相容。 這些標籤在新寫法下照樣產生,但不再是餵進模型的證據 —— 它們只是狀態表本身的形狀。這一節說明為什麼,以及因此有三個問題直接消失。

k=2 的連鎖區段只會落入三類:串接、分岔、不相容 一個只有兩個位點的連鎖區段,它的分子只可能有四種狀態: 兩個都不帶、只帶第一個、只帶第二個、兩個都帶。 三欄各是一種情形,每一欄把這四種狀態各自的分子數列出來。 三欄的邊際刻意做成完全相同:總數都是八十條,位點 A 的變異分子都是三十九條, 位點 B 的都是十七條 —— 這是整張圖的重點,因為它表示光看每個位點各自的頻率 分不出這三種情形,要看四種狀態怎麼分配。 左欄是串接:沒有任何分子只帶 B,所以帶 B 的分子全部也帶 A, B 只可能長在 A 的後代裡。 中欄是分岔:沒有任何分子兩個都帶,所以 A 與 B 落在互不包含的兩支上。 右欄是不相容:四種狀態都有分子。在「每個變異只發生一次」的前提下這不可能, 所以它不是發現了一支新的 lineage,而是四配子檢定失敗 —— 代表這個連鎖區段的錯誤地板偏高或家族誤標偏多,是一個品質訊號。 讀法是:分類要用似然比檢定,不要對原始計數設門檻, 因為在偵測極限附近,兩種假設只差幾條分子。 同一組邊際,三種分子狀態分配 每一列是一種分子狀態:實心=帶變異、空心=參考型。三欄的邊際完全相同(見最下一列)。 串接 chain A → B 00 41 10 22 01 0 11 17 沒有分子「只帶 B」 → B 長在 A 的後代裡 分岔 fork A / B 00 24 10 39 01 17 11 0 沒有分子「兩個都帶」 → A、B 互不包含 不相容 incompatible 四種都有 00 33 10 30 01 8 11 9 四配子檢定失敗,非新 lineage N 80 · A 的變異 39 · B 的 17 N 80 · A 的變異 39 · B 的 17 N 80 · A 的變異 39 · B 的 17 右欄的出現率可以反過來估計單倍型分型的錯誤率 —— 模型因此自帶一個校正用的觀測量。 分類要用似然比檢定,不是對原始計數設門檻:在偵測極限附近,兩種假設只差幾條分子。
一個 kv=2 的連鎖區段,其分子只有四種狀態。 三欄的總數與兩個位點各自的變異分子數完全相同(最下一列), 所以僅憑邊際無法區分三者。左欄沒有「只帶 B」的分子為串接, 中欄沒有「兩個都帶」的分子為分岔,右欄四種都有為不相容。 在本頁的模型下,這三種形狀不再是餵進去的約束,而是狀態表本身的形狀。

現行流程對每個連鎖區段所做的分類(分岔/串接/不相容)在新的寫法下照樣產生, 但它們的地位變了:它們是 qu 的形狀,不是額外的證據

現行輸出在生成模型裡對應什麼地位
分岔(無分子同時帶有兩者)沒有任何 clone 的局部基因型同時帶兩個突變,故該格只剩錯誤地板輸出
串接,比值 1兩個 clone 的 η 相近輸出
串接,比值 <1η 有序,且巢狀輸出
不相容(四格皆非空)錯誤通道的 εξv 偏高品質訊號

由此得到一條必須寫進實作的規則: 凡其原始狀態表已經進入似然的連鎖區段,不得再為它加一條約束項。 分岔摘要仍可以印出來給人看、畫成圖、當作 QC,但那是衍生輸出, 不是另一份獨立證據。這條規則就是第一節那個「兩個因子相乘」在實作層的說法。

三個原本需要特別處理的問題,也在這裡一併消失:

原本的問題在新寫法下
約束的信心值 ωr 要怎麼校準不需要 —— 證據強弱就是似然本身
「必定同群」會降低可辨識性,權重該給多低不需要 —— 它只是 η 相近,沒有被當成等式
假的硬約束會逼出不存在的群不會 —— 沒有任何一格的機率是 0,錯誤地板保證了這件事

六、數百個連鎖區段的局部形狀不同 —— 這是預期,不是矛盾

通過品質檢查的連鎖區段有數百個,而它們的局部拓撲形狀各不相同: 有的是一條線,有的是分岔,有的只有一個節點。此現象本身不構成衝突。

三份證據如何把相容的候選樹砍到只剩一棵:頻率譜給一棵部分決定的樹,兩個連鎖區段各給一個局部拓撲 本圖延續前一個數值例,純度零點六、二倍體,A、B、C 的細胞比例是一點零零、 零點四零、零點四零,另加第四群 D,細胞比例零點二零,是 B 的後代。 上排是三份證據各自說了什麼。 第一份是 VAF 頻率譜。換算後只得到三群:一點零零、零點四零、零點二零, 其中零點四零那一群可能是兩群被併起來的。 依 pigeonhole 檢查,這三群能排出的樹有兩棵,圖上並排畫出: 一棵是 A 到 X 再到 D 的線性樹,一棵是 A 同時接到 X 與 D 的分支樹,兩棵都合法。 取兩棵的共同部分,就是頻率譜真正確定的東西:A 是根,X 在 A 之下。 未定的有兩件:D 掛在 A 之下還是掛在 X 之下,以及 X 是一群還是兩群。 所以頻率譜給的是一棵部分決定的樹,不是一棵完整的樹。 第二份是連鎖區段甲。它含有兩個變異 i 與 j,觀測到沒有分子同時帶有兩者, 所以兩者分屬兩群 P 與 Q,而且兩群互不包含。 這同時做了兩件事:把群數由三修正為四,並指出 P 與 Q 誰都不是誰的祖先。 第三份是連鎖區段乙。它含有兩個變異 p 與 q,觀測到帶 q 的分子全部也帶 p, 所以 q 所在的群巢狀於 p 所在的群之內,另附零點五零的比值。 中排說明目標函數的兩項各自負責什麼、又各自不負責什麼。 左邊是 beta 二項混合這一項,圖上畫的是三根峰各自的成分曲線: 中心由細胞比例決定,寬度是用途二量出來的常數,高度是該群所佔的變異比例。 這一項回答的是某個變異的讀數比較像哪一根峰, 它對峰與峰之間誰在誰之下完全沒有意見。 右邊是約束這一項,它把甲寫成兩個變異不可同群,把乙寫成樹上的一條有向邊。 這一項回答的是哪些變異不能同群、以及誰在誰之下, 它對峰落在哪裡完全沒有意見。 兩項回答的問題不重疊,這正是合起來能補齊、而任一邊單獨補不齊的原因。 下排是候選樹的數量如何被砍下來。只用頻率譜時群數估成三,候選兩棵, 而且群數本身是錯的。加入甲之後群數修正為四;在四群的狀態空間裡 若沒有任何關係約束,候選會有七棵,甲的互不包含把它砍成三棵。 再加入乙的巢狀關係,候選只剩一棵,也就是最右邊那棵樹。 最後標注:樹的形狀是唯一的,但那兩群頻率相同, 所以它們的標號可以整組對調,編號本來就是任意的。 三份證據,各補上樹的一部分 延續前例:ρ = 0.60、二倍體、μ = 1;A = 1.00、B = C = 0.40,另加 D = 0.20(B 的後代)。 ① 頻率譜給的:部分的樹 換算後得到三群: c = 1.00 / 0.40 / 0.20 (0.40 那一群可能是兩群併起來的) pigeonhole 檢查後,兩棵都合法 A X D 線性 A X D 分支 ✓ 已定:A 是根、X 在 A 之下 ✗ 未定:D 掛在 A 還是 X 之下 ✗ 未定:X 是一群,還是兩群 ② 連鎖區段甲給的:分岔 兩個變異 i、j 落在同一個連鎖區段 帶 i 不帶 j 帶 j 不帶 i 沒有任何分子同時帶有兩者 局部拓撲: 互不包含 P Q 它同時做了兩件事: ① 把 0.40 那一群拆開 → 群數 3 修正為 4 ② 指出 P 與 Q 誰都不是誰的祖先 ③ 連鎖區段乙給的:一條線 兩個變異 p、q 落在同一個連鎖區段 只帶 p p、q 都帶 帶 q 的分子全部也帶 p 局部拓撲: P D D 巢狀在 0.40 的其中一群之內 另附比值 ϱ = 0.50(不需純度) 目標函數的兩項,各自只回答一半的問題 第一項|beta-binomial 混合 0.06 0.12 0.30 某個變異 a/d = 6/50 中心 = ρ·c/2 寬度 = 用途二量到的 高度 = 該群的變異占比 回答:這個變異的讀數比較像哪一根峰。 峰之間誰在誰之下,它沒有意見 第二項|約束 甲 → 不可同群 i j 乙 → 一條有向邊 P D 回答:哪些不能同群、誰在誰之下。 峰落在哪裡,它沒有意見 兩項回答的問題不重疊 —— 這正是合起來補得齊、任一邊單獨補不齊的原因。 合起來:相容的候選樹被砍到只剩一棵 只用頻率譜 2 棵 而且 K = 3 是錯的 +甲 K 修正為 4,P ⊥ Q 3 棵 (不加約束會是 7 棵) +乙 再加巢狀關係 1 棵 唯一解 A P Q D 形狀唯一; P、Q 標號 可整組對調
延續中篇第三節那個例子(ρ、A、B、C 都不變),只加上第四群 D 與兩個連鎖區段。 上排是三份證據各自說了什麼 —— 注意頻率譜給的是一棵部分決定的樹,不是一棵完整的樹。 中排說明目標函數的兩項各自回答什麼、又各自不回答什麼。 下排是三者合起來時,相容的候選樹如何被砍到只剩一棵。

成因是每個連鎖區段只裝得下落在該連鎖視窗內的那幾個變異。 上圖的連鎖區段甲裝到的是 B 群與 C 群的變異,兩群互不包含,故其局部形狀是分岔; 連鎖區段乙裝到的是 B 群與 D 群的變異,後者巢狀於前者,故其局部形狀是一條線。 兩者皆為同一棵全域 clone tree 在不同變異子集上的投影 —— 形狀相異是因為子集相異,而非證據衝突。

合起來為什麼更準、解析度更高

關鍵在於認清頻率譜的輸出並不是一棵樹,而是一棵部分決定的樹。 本例中它換算出三群(1.00/0.40/0.20),而這三群在 之下 有兩棵樹同時通過:線性的 A → X → D,與分支的 A → {X,D}。 取兩棵的交集,才是頻率譜真正確定下來的東西:

頻率譜確定的頻率譜未定的
A 是根D 掛在 A 之下,還是掛在 X 之下
X 在 A 之下X 是一群,還是兩群被併起來的

兩個連鎖區段補的正是右欄那兩格,而且各補一格: 甲的狀態表在「兩個突變同時出現」那一格只有錯誤地板的量,乙則相反。 候選數因此逐步收斂 —— 這就是「合起來更好」的具體內容:

手上的證據相容的候選樹備註
只有頻率譜2而且 K=3 本身是錯的(少計一群)
+ 甲3K 先被修正為 4;在 4 群下若無局部觀測會有 7 棵,甲砍到 3 棵
+ 甲 + 乙1唯一解,即真實的樹

三項改變的性質並不相同,值得分開看:

改變來源性質
K 由 3 增為 4 甲那一格的空缺把 0.12 那根峰拆開 解析度提升:多還原一個 subclone,而這是頻率單獨永遠達不到的 —— 兩群的 θ 本就相等
樹由兩棵並列變為唯一解 乙的巢狀狀態表把 D 釘在 B 之下 準確度提升:原本那一棵由簡約性挑選,現在由資料決定
群間距不需純度即可定出 乙的兩格相除,共同分母消去 ρ 退化為整體縮放(中篇第五節)

第二項尤其值得看清楚:「D 掛在 B 之下還是 C 之下」在頻率上永遠沒有答案。 B 與 C 的期望 VAF 完全相同,所以兩種掛法產生一模一樣的直方圖 —— 這不是精度問題,是中篇第三節那個不可辨識性換一個位置再出現一次。 連鎖區段乙的共現觀測是唯一回答得了的證據。

而三項改變都不需要先把兩個連鎖區段對齊: 兩個連鎖區段各自算出自己那張表的機率,而兩張表都由同一組 (w,T,z) 產生,相乘即完成合併。 形狀不同從頭到尾都不是需要處理的問題,而合併也不需要任何對齊步驟。

精確度的保留:「唯一解」是指樹的形狀唯一

拆出來的兩群頻率相同,所以它們的標號可以整組對調而不影響任何機率 —— 編號本就是任意的,這與手動 phasing 練習裡 HP1/HP2 對調也算正確是同一回事。

由此導出一條實作規則,與第九節那條互為表裡: 可以合併的是機率,不是標籤。 局部標籤(HP1-1)僅在該連鎖視窗內有定義,跨連鎖視窗的同名標籤並非同一條, 故不得將局部拓撲拼接成一棵大樹。所要合併者是它們對 (w,T,z) 的支持度 —— 而這組參數本就只有一份。

真正的矛盾長什麼樣

真正的矛盾並非形狀相異,而是整組連鎖區段找不到任何一組 (w,T,z) 能同時給出夠高的機率。 在似然寫法下它不再讓求解器卡住 —— 因為沒有任何一格的機率是 0, 求解器會取總機率最大的那組參數,少數異常的連鎖區段被多數蓋過。 但它仍然是必須報告的診斷量:擬合後各連鎖區段的狀態表與模型預測的差距, 估計的是整條產線的錯誤率。

惟此處有一個陷阱:殘差小不代表模型正確。 系統性偏誤(例如第八節的排序偏誤)會使錯誤彼此一致 —— 它們朝同一方向偏,因而完全不互相矛盾,卻一併使結論偏移。 殘差只偵測得到隨機錯誤。

診斷細節:舊的硬約束寫法下,矛盾會表現成哪三種無解形式
形式成因
直接對立一個連鎖區段的表說兩者不共存,另一個說共存其中一個是抽樣零或錯誤地板被讀成結構零
違反傳遞性三個連鎖區段兩兩相容,合起來卻無解同上,惟須三個連鎖區段方能顯現
祖先關係成環zazbzcza任何樹皆不可能,通常是第八節的排序偏誤將分岔判為串接

三種形式在似然寫法下都不再讓求解器停住, 此即第四節堅持要有錯誤地板的理由 —— 那個地板同時是「零不代表不可能」與 「矛盾不會炸掉求解器」這兩件事的來源。

殘差這個診斷量的邏輯,與以「不相容連鎖區段」估計單倍型標記錯誤率相同, 僅是提升至全域這一層。報告應予載明。

七、推論怎麼跑:外層定結構,內層估比例

到這裡為止,寫下來的都是「什麼是好的解」。這一節講「怎麼找到它」。 先講結論,因為它跟多數人的預期不同:真正難的是離散的那一半, 而連續的那一半小到不需要什麼特別的工具。

外層列舉離散結構,內層只是一個小的 simplex 最佳化 圖由左至右分成三段。最外層是群數 K 的迴圈,從 1 跑到 K_max, 這一層是真的迴圈,而且必須跑完再比較 Score, 因為資料配適度對 K 幾乎單調遞增,中途看到上升就停會停不下來。 中間一層是離散結構的搜尋:固定 K 之後,clone tree、突變指派與逐拷貝基因型 仍有大量組合,數量隨 K 迅速上升,不可能全部列舉, 所以要靠候選剪枝、啟發式搜尋或取樣,而局部連鎖視窗算出來的候選集合 正是在這裡先把不相容的全域結構排除掉。 最內層是連續參數的最佳化:結構固定之後只剩細胞比例 w, 自由度只有 K 個,定義域是一個 simplex, 直接用受限最佳化即可,不需要 EM 或 MCMC。 下方標出成本的分布:幾乎全部落在中間那層,內層是幾毫秒的事。 右側標出兩個必須誠實記住的保留:內層不保證凹,需要多起點; 以及 EM 與 MCMC 各自真正該出場的時機。 難的是離散那一半,連續那一半小到可以直接解 外層迴圈 K = 1 … K_max 真的是一個 for 迴圈;必須跑完再比 Score,不可中途停 結構搜尋(離散) 固定 K 之後,仍要決定: T clone tree 的形狀 z 每個突變掛到哪一群 G 每個位點的逐拷貝基因型 組合數隨 K 迅速上升 —— 不可能窮舉,要靠剪枝與啟發式搜尋 內層:連續最佳化 只剩細胞比例 w,K 個自由度,w_g ≥ 0 且總和為 1 受限最佳化直接解 —— 幾毫秒,不需要 EM 或 MCMC 成本落在哪裡 中層 幾乎全部 內層 幾毫秒 所以要少列舉,不是把內層解得更快 內層不保證凹 q 對 w 是比值函數, 狀態機率又是加權和。 必須多起點,並記錄是否收斂到同一點 EM/MCMC 何時才需要 EM  把突變指派 z 邊際化時 MCMC 要的是後驗區間而非點估計 兩者都不是為了那 K 個比例 外層定結構,內層估比例 看到 likelihood 就想用 EM 或 MCMC,在這個內層問題上是殺雞用牛刀
外層列舉離散結構(K、樹、指派、基因型), 內層在結構固定後只剩一個 simplex 上的最佳化。 成本幾乎全在外層 —— 內層那個小圈圈是可以直接解的, 所以優化的重點是少列舉幾個候選,不是把內層解得更快。

兩層的分工

要定的東西性質用什麼方法
外層群數 K、clone tree T、突變指派 z、逐拷貝基因型 G離散、組合爆炸候選列舉+剪枝、啟發式搜尋;不可能窮舉
內層細胞比例 w連續,K 個自由度,定義域是一個 simplexconstrained optimization,直接解

內層:K 個自由度,直接解就好

結構一旦固定,ck(w,T,z) 決定、μmG 決定、 θq 都是 w 的函數,錯誤參數已經校準或就地估好。 剩下的自由參數只有 w 本身 —— 依第一節的清點,那是 K 個自由度 (K=5 時是 5 個)。問題因此化簡成:

maxwlogP(DΘK)s.t.wg0,g=0Kwg=1

這就是一個 constrained maximum-likelihood 問題: 在「每項非負、總和為一」這個定義域(一個 simplex)上找最大值。 「直接解」不是說有閉式解 —— 一般沒有 —— 而是說把目標函數與這兩條限制交給數值最佳化器即可

這裡不需要 EM,也不需要 MCMC。這一點值得說清楚, 因為看到 likelihood 就想到 EM/MCMC 是很自然的反射,但在這個內層問題上兩者都是殺雞用牛刀: 五個參數的凸定義域最佳化,數值最佳化器幾毫秒就收斂。

方法補充:用哪一種最佳化器,以及什麼時候真的需要 EM 或 MCMC

常見做法是投影梯度法、序列二次規劃,或用 wgexg 這類重參數化把限制吸收掉之後改用一般的無限制最佳化器。

方法什麼時候需要
EM選擇把突變指派 z 邊際化而不是當成待估狀態時(第一節提過的第二種推論方式)。此時 z 是潛在變數,E 步算每個突變屬於各群的責任度,M 步更新 w
MCMC要的不只是點估計,而是 wTK後驗區間;或外層的結構搜尋本身就以取樣進行
兩者皆非結構已固定、只要 w^ 的點估計 —— 直接做 constrained optimization

但有一個必須誠實標註的保留:這個內層問題不保證是凹的。 定義域確實是凸的,可是 qu,hw比值函數 (第二節那條 η 的分母也含 w),而且狀態表的機率是多個狀態的加權和 —— 兩者都會破壞對數似然的凹性。實務上必須多起點並記錄各起點是否收斂到同一點; 只跑一個起點就宣稱找到最大值,是這一步最容易犯的錯。

外層:不可能窮舉,所以重點是怎麼不列舉

外層才是成本所在。固定 K 之後,樹的形狀、 每個突變掛到哪一群、每個位點的拷貝基因型,全都是離散選擇,數量隨 K 迅速上升 —— 光是有根有標號的樹就已經多到不可能一棵一棵試。所以概念上的骨架雖然是:

for K = 1 ... Kmax:
    列舉/搜尋這個 K 下的離散結構候選
    for each 候選:
        固定結構 → 在 simplex 上最大化 log-likelihood   ← 內層,直接解
        記下這個候選的最佳 log-likelihood
    取這個 K 的最佳值
比較各 K 的 Score(K, Θ̂_K),取最大者為 K̂

但中間那個「列舉/搜尋」不是一個真的 for 迴圈。 可用的做法包括啟發式搜尋、分支定界、以取樣取代列舉,以及最重要的一項: 用局部證據先把候選砍掉。第八節那個候選集合正是為此而存在 —— 每個連鎖視窗算出來的局部候選整組帶進外層, 不相容的全域結構因而在列舉之前就被排除, 這比列舉完再逐一評分便宜得多。

兩件事要連著記住:其一,K 的那層迴圈是真的迴圈, 而且必須跑完再比 Score,不能中途看 Ldata 上升就停 —— LdataK 幾乎單調遞增,會停不下來。 其二,這一整節是本規格中唯一沒有閉式成本估計的部分, 也是第十二節把它排在最後幾階段的理由。

八、現行實作要改的兩處

前面七節寫的是規格。落到現有的程式碼上, 真正要動的只有兩個地方,而且兩處都是「把資訊留下來」而不是「加一道閘門」: 其一,覆蓋遮罩不要併掉其二,候選排序的分數換成似然。 超立方體列舉、分類輸出、前處理全部沿用。

其一:覆蓋遮罩要留下來,而不是併掉

一個真實連鎖視窗的 read 覆蓋:八成的分子只看得到一個位點 上半是一個真實分析單位裡 read 覆蓋情況的統計。 這個連鎖區段有三個 somatic 位點、一百九十四條 read,連鎖視窗寬三十九點四 kb。 三條長條由上而下分別是:同時蓋到三個位點的 read 只有三條,佔百分之一點五; 蓋到兩個位點的三十一條,佔百分之十六;只蓋到一個位點的一百六十條,佔百分之八十二點五。 下半把同一批 read 按位點對拆開,看每一對到底有幾條 read 同時蓋到。 第一對與第二對各有十七條與二十條,分別判出分岔與串接; 第三對只有三條,而且三條都是參考型,什麼也判不出來。 最下方是這張圖的結論:這個連鎖區段的演化樹靠的是十七與二十這兩個數字,不是一百九十四; 而第三對實質上缺乏資料,仍被演算法判定了關係。 讀法是:有效樣本數是「每一個位點對各自的跨越深度」,不是這個連鎖區段的總 read 數。 真實資料的覆蓋結構 HCC1395_HKU · chr12:981,725–1,021,146 · HP1 · k=3 · 194 reads · 連鎖視窗 39.4 kb 一條 read 蓋得到幾個位點 蓋到 3 個 3 條 1.5% 蓋到 2 個 31 條 16.0% 只蓋到 1 個 160 條 82.5% 八成的分子只看得到一個位點 —— 它對「兩個位點的共現」完全沒有意見。 把同一批 read 按位點對拆開 A × C n = 3 三條都是參考型 什麼也判不出來 A × B n = 17 RA 12 · AR 5 · 沒有 AA 判為分岔 B × C n = 20 AA 6 · AR 9 · RR 5 判為串接 這個連鎖區段的樹靠的是 17 與 20,不是 194。而 A × C 那一對沒有資料 卻一樣被演算法決定了關係 —— 「沒看到」被當成了「不存在」。
約八成的 read 僅覆蓋三個位點中的一個。 將同一批 read 依位點對拆分後可見:此連鎖區段的判定依據為 17 與 20 兩個數字,而非 194; 其中一對僅有 3 條 read,仍產出了一條關係判定。

一個連鎖區段的有效樣本數並非其總 read 數, 而是各位點組合分別有幾條 read 同時覆蓋。 上圖連鎖區段的三個位點對,跨越深度分別為 20、17 與 3

舊的做法是設一道門檻把跨越深度不足的丟掉 —— 因為在硬約束的寫法下,一條由 n=3 產生的假「不可同群」代價極高。 在似然的寫法下這道門檻不需要了n=3 的觀測自然只貢獻很小的證據量, (1q)30.34 這個數字就是似然自己會算的東西。

兩種「沒看到」:真的沒有那種細胞,與沒有 read 跨得到 左邊是跨越深度隨距離衰減的曲線。 兩個位點靠得愈近,同時蓋到它們的 read 就愈多;距離接近讀長時,跨越深度掉到接近零。 圖上標出真實例子的三個位點對,跨越深度分別是二十、十七與三。 右邊說明問題所在:演算法看到某個狀態沒有出現,有兩種完全不同的原因。 第一種是真的沒有細胞帶著那個組合,那是生物學結論。 第二種是無 read 同時覆蓋該二位點,屬於未觀測。 目前的做法把兩者當成同一件事,於是把看不到當成不存在。 最下方是修正方式:每一個位點對先用自己的跨越深度算檢定力, 檢定力不足的對標成未定,不允許它去約束樹的形狀,並且在報告裡列出來。 讀法是:缺席要有足夠的觀測撐著,才能當成證據。 兩種「沒看到」 跨越深度隨距離掉得很快 兩個位點的距離 → 跨越深度 n=20 n=17 n=3 檢定力門檻 同樣是「這個狀態沒出現」 ① 真的沒有細胞帶著那個組合 這是生物學結論,可以拿來決定樹的形狀。 ② 無 read 同時覆蓋該二位點 這只是看不到,不能拿來決定任何事。 目前的做法把兩者當成同一件事 修正:每一對先過檢定力這一關 用該位點對自己的跨越深度算檢定力;不足的標成「未定」, 不允許它的「缺席」去約束樹,並且在報告裡逐條列出來。 預期效果:目前被歸進「單層無分支」的連鎖區段,會有一部分正確地移到「未解析」。
「此狀態未出現」有兩種成因:該類細胞確實不存在, 或無 read 跨越該對位點。舊做法將兩者等同處理;似然寫法讓第二種成因 自動只貢獻很少的證據,不需要門檻就分得開。

所以這一步的改動不是加一道閘門,而是把遮罩存下來: 狀態表要記成 (,phaseset,,,,) 的稀疏列, 而不是先把部分覆蓋的 read 併進某個完整狀態。 門檻退居為報告量:收得幾條、各遮罩各有幾條、哪些連鎖區段的證據其實很薄。

實作草稿:稀疏列怎麼產生,以及該報告哪三個數字
for each unit u:
    for each read r spanning ≥1 site in u:
        emit (u, phase_set, sites(u), mask(r), pattern(r), 1)
    aggregate → sparse rows
report: 每個遮罩的 read 數、連鎖區段的最大跨越深度、
        以及「若某狀態真佔 5%,這個連鎖區段看得到它的機率」

可跨越範圍受限的成因,來自以下三層結構:

三層資訊:全基因體只有邊際、phase block 知道 cis/trans、read 跨距內才數得到共現 三層由下而上代表資訊愈來愈完整,但涵蓋範圍愈來愈小。 最下層是全基因體,任何兩個位點之間都只有各自的邊際頻率,沒有共現關係。 中間層是 phase block,典型長度一到五個 Mb,在這個範圍內兩個位點是在同一條染色體 還是分開在兩條,是已知的,即使沒有任何一條 read 同時蓋到它們。 最上層是 read 跨距,典型二十個 kb,只有在這個範圍內才數得出「同時帶有兩個變異的分子有幾條」。 右側標出每一層在一個典型樣本裡各有多少筆可用觀測: read 跨距內的聯合計數約數百到數萬筆,phase block 內的 cis/trans 判定約多一百倍, 全基因體邊際則涵蓋全部變異。 讀法是:read 長度限制的是「數得到共現」,phase block 限制的是「知道在不在同一條染色體上」, 這兩件事的範圍差了兩個數量級,常被混為一談。 三層資訊:範圍愈小,資訊愈完整 ③ 全基因體 只有邊際頻率(VAF、β)—— 傳統路線整個住在這一層 全部變異 數百萬筆 ② phase block(1–5 Mb) cis/trans 已知,但數不到共現分子數 cis/trans 判定 約 7 萬筆 ① read 跨距(20 kb) 聯合計數看得到 聯合計數 數百到數萬筆 資訊最完整 涵蓋最廣 最常見的誤解:把 ① 與 ② 當成同一件事。read 長度限制的是「數得到共現」, phase block 限制的是「知不知道在同一條染色體上」—— 兩者範圍差約一百倍。
read 跨距限制的是能否計數共現, 限制的是能否確定兩個位點是否位於同一條染色體。 局部狀態表僅能自最上層產生,而該層亦為三者中範圍最小者。

其二:候選排序的分數要換成似然

最小成本候選常不只一個,現行流程以 的差值總和排序; 問題在於相加的項數由拓撲形狀決定

read-AF 差值總和有形狀偏誤:星狀永遠得零分,串接永遠贏 目前排序候選樹的分數,是把樹上每一組「祖先與後代」的 read-AF 相減再全部加起來。 問題在於相加的項數本身由樹的形狀決定。 圖上三個形狀由左到右:三個突變串成一條線、一條線加一個分支、三個都從根長出來的星狀。 它們的祖先後代配對數分別是三、一、零。 因此串接的分數是第一個減第三個的兩倍,中間的形狀只有一項, 而星狀因為沒有任何祖先後代配對,分數恆等於零。 結論寫在下方:只要 read-AF 不完全相等,串接的分數就是正的, 而星狀永遠是零,所以當最小成本候選裡同時有這兩種形狀時,分支永遠贏不了。 觀測到的最多的類別正好是多層無分支,佔三成八到五成三, 這個偏誤剛好往那個方向推。 最下方是替代方案:改用機率模型比較各個形狀解釋同一組 read-AF 的能力, 而不是加總差值。 讀法是:分數要能跨形狀比較,才不會讓形狀自己決定勝負。 分數的形狀偏誤 分數=把樹上每一組「祖先→後代」的 read-AF 相減,全部加起來。項數由形狀決定。 串接 祖先後代配對:3 組 2(a₁ − a₃) 一線加一分支 祖先後代配對:1 組 a₁ − a₂ 星狀(全分支) 祖先後代配對:0 組 恆等於 0 只要 read-AF 不完全相等,串接就是正分,星狀恆為 0 —— 所以最小成本候選裡同時有這兩種形狀時,分支永遠贏不了 觀測到最多的類別正好是「多層無分支」(38–53%),而這個偏誤剛好往那個方向推。 替代方案:用機率模型比較各形狀解釋同一組 read-AF 的能力,而不是加總差值。
三種形狀的祖先後代配對數分別為 3、1、0。 串接得到正分,星狀恆為 0 —— 故最小成本候選中同時存在此二形狀時,分支形狀恆不獲選。

其後果為:本應呈現分岔的連鎖區段,將改為呈現串接。 而分岔是拆峰能力唯一的來源,因此該偏誤系統性地移除拆峰的能力, 使中篇第三節所述的 K = 2 得以維持。

修正方式正是第二節那個 Pv:在該候選所施加的結構下算出 qu, 再算整張狀態表的似然。如此不同形狀所比較的是對同一組計數的解釋能力, 形狀本身不再決定勝負。而且不必只留一個候選 —— 局部候選集合應整組帶進全域推論,由全域參數決定哪一個站得住。 這是把「先挑一個再往下走」換成「全部留著,讓似然決定」。

現行實作的超立方體列舉照樣沿用,它負責產生候選與必要的潛在節點; 被換掉的只有那個分數。這是整份規格中最小、也最值得先做的一個改動。

九、兩類與相位有關的誤讀

兩者皆與相位有關,方向相反: 其一為相位資訊僅在 block 內有效,跨 block 即無定義; 其二為即使在 block 內相位解得正確,仍可能被解讀為錯誤的生物學。

H1/H2 的標號只在同一個 phase block 內有意義,跨 block 是任意的 上排是實體事實:兩條染色體拷貝各自是連續的一整條,橫跨圖上的兩個 phase block。 中排是相位軟體實際輸出的東西:每個 phase block 各自把兩堆 read 標成 H1 與 H2, 但標號在每個 block 內獨立決定。圖上刻意讓 block A 的 H1 對應上排第一條拷貝, 而 block B 的 H1 對應上排第二條拷貝 —— 兩個 block 的 H1 不是同一條染色體。 這個任意性寫成每個 block 一個正負號,圖上標為 σ。 下排分成兩欄說明後果。左欄是不受影響的:clone tree 談的是細胞的祖先關係, 不是哪一條親源染色體帶著變異,所以每個連鎖區段內部算出來的量都與 σ 無關。 右欄是會出錯的:任何把不同 block 的 H1 加總在一起的統計都沒有意義, 跨 block 的單倍型特異拷貝數、跨 block 比較甲基化偏向也都需要先定出 σ。 讀法是:所有全基因體統計都必須只由「連鎖區段內部的量」組成,這樣才自動與 σ 無關。 H1/H2 只在同一個 phase block 內有意義 實體上 兩條染色體拷貝各自是連續的一整條 拷貝 ① 拷貝 ② 軟體輸出 每個 block 各自標號,標號獨立決定 phase block A σ = +1 H1 H2 H1 = 拷貝 ① phase block B σ = −1 H1 H2 H1 = 拷貝 ② 標號於此處反轉 不受影響 clone tree 談的是細胞的祖先關係, 不是哪一條親源染色體帶著變異。 連鎖區段內部算出的量與 σ 無關,可直接邊際化。 會靜靜出錯 把不同 block 的 H1 加總在一起的統計; 跨 block 的單倍型特異拷貝數; 跨 block 比較甲基化偏向。這些都要先定出 σ。 設計規則:所有全基因體統計只能由「連鎖區段內部的量」組成 —— 這樣才自動與 σ 無關。
上排為物理事實:兩條染色體拷貝各自連續。 中排為軟體輸出:block A 的 H1 對應拷貝 ①,block B 的 H1 對應拷貝 ② —— 兩個 H1 並非同一條。

十、連鎖區段預算

結論先講:在最不利的低突變負荷樣本(5/Mb)上, 全基因體約產出 369 個同家族的多變異連鎖區段; 若腫瘤有三群、質量 0.60/0.25/0.15,最稀疏的那一對群仍分到 28 個。 這個數量看起來很小,但它要回答的是一個是非題(這兩個成分是不是同一個), 不是要指派一萬五千個點 —— 所以夠用。

推導:Poisson 模型下的三個閉式比例,以及「兩個 5%」的分母差異

先釐清兩個 5%。本頁所稱的「5%」為固定寬度視窗的比例:含變異的視窗中, 僅 5% 含有兩個以上的變異。以下推導所用者則為變異的比例,其分母不同 —— 由於每個多變異視窗至少含兩個變異,「5% 的視窗」對應 9.5% 的變異。 兩個數字皆正確,但計數的對象不同;可用連鎖區段的產量由後者決定

設變異在基因體上依 Poisson 分布。令 λ 為每個固定寬度視窗的期望變異數:每 Mb 5 個、視窗寬 20 kb 時λ = 0.1;基因體 3.1 Gb 切分為 155,000 個固定寬度視窗。 三個關鍵比例皆為 λ 的閉式函數:

閉式數值
含變異的固定寬度視窗155,000×(1eλ)14,750
其中僅含單一變異的比例λeλ/(1eλ)95.1%(上篇所述的 95%)
落於多變異固定寬度視窗的變異比例1eλ9.5%(本節所用者)
 即多變異固定寬度視窗的變異數15,500×0.0951,475 個變異
相鄰位點對(每個含 k 個變異的固定寬度視窗貢獻 k1 對)155,000×(λ(1eλ))750
 再乘上「兩個變異落於同一單倍型家族」×1/2375,約當表列的 369

依上述模型,若腫瘤含三群、質量分別為 0.60/0.25/0.15, 則跨第 i 群與第 j 群的連鎖區段數為總數乘以 2wiwj

突變負荷同家族多變異連鎖區段群 1×2群 1×3群 2×3
5/Mb約 3691116628
20/Mb約 5,1001,533920383
50/Mb約 24,5007,3484,4091,837

充足性的依據已見於中篇第三節:這些連鎖區段的作用在於確立成分存在且相異, 而非指派 15,500 個點。最稀疏的一對有 28 個獨立連鎖區段, 對「兩個成分是否相同」此一是非判定為充足。

惟這個預算對第十二節的分期很敏感。 若初期只納入 copy-number-neutral 的雜合區域(那是分期的建議做法), 在 CN 變異廣泛的實體腫瘤中可能只剩一半甚至更少, 最稀疏的那一對會從 28 掉到十幾個 —— 那時充足性的論證就不成立了。 因此分期的第一階段應優先選高突變負荷的樣本; 低負荷樣本要等到允許非中性區域之後才有足夠的連鎖區段。 報告須載明各階段實際納入與排除的連鎖區段數。

計數口徑:上表算的是相鄰位點對,不是視窗內全配對

若改為視窗內全配對(每個固定寬度視窗C(k,2) 對),在低負荷下兩者相近 (5/Mb:388 與 375),但在高負荷下顯著分離 —— 50/Mb 時全配對約為 38,750, 相鄰配對約為 28,500。表列的 24,500 屬相鄰配對。 引用這些數字時要一併說明是哪一種配對。

十一、連鎖視窗寬度:連鎖區段產量與品質的取捨

視窗開得寬,收得到的位點多,但多數 read 只覆蓋其中一部分,狀態表變得很稀疏; 視窗開得窄則相反。結論是兩種都做,因為在似然的寫法下同時用兩種寬度不需要付任何代價 —— 兩批都進同一個乘積,各自的證據量由各自的計數與遮罩決定。

項目寬連鎖視窗(現行約 39 kb)窄連鎖視窗(read 跨距
可納入的位點數 k
完整覆蓋的 read 比例低(多數 read 只覆蓋部分位點)高(多數 read 覆蓋全部位點)
狀態表的稀疏程度高(遮罩很多,每個遮罩很少 read)
適用廣泛收集產出高證據量的一批
可分析的頻率連鎖視窗:傳統 VAF 擬合區間與譜系內比例區間的比較 兩條橫軸畫的是同一件事在兩條路線上的可用範圍,範圍都以「佔細胞的比例」為單位。 上排是傳統做法:原始研究刻意只在 VAF 零點一二到零點二四之間擬合, 更低的一端混著假陽性,更高的一端已經進入 clonal 峰。 把它換算成細胞比例,在純度零點六的樣本上大約是零點四到零點八,是一段相當窄的區間。 下排是本頁的做法:下界由每一個連鎖區段自己的深度與地板總量決定,不是一個固定常數, 在每個家族六十條分子、地板總量千分之五時大約是零點零五; 上界則由譜系內的 clonal 堆積決定,暫定零點五。 右側的表列出下界怎麼隨分子數與地板總量變化。 底下標出一個重要提醒:上界零點五是全文最弱的一個數字,必須由模擬重新推定。 讀法是:把比例改成在譜系內部量,動態範圍不但沒有變窄,反而變寬了。 可分析的比例連鎖視窗 傳統 VAF 擬合區間 0 0.5 1.0 換算成細胞比例約 0.4–0.8 HFS 譜系內比例區間 0 0.5 1.0 約 0.05–0.5,且下界逐連鎖區段計算 下界隨深度變化 分子數 δ=0.005 δ=0.01 20 0.10 0.12 30 0.08 0.10 60 0.05 0.07 100 0.04 0.05 下界不是常數,要逐連鎖區段算 把比例改成在譜系內部量,動態範圍不但沒有變窄,反而變寬。 但上界 0.5 是本頁最弱的一個數字:它是從傳統區間的比例類推來的, 必須由模擬重新推定,不要當成已知常數引用。
窄連鎖視窗下每個家族 60 條分子、地板總量 δ 為千分之五時, 可偵測的比例下界約為 0.05。該下界應逐連鎖區段計算,不宜採用固定常數 —— 它正是第四節那個錯誤地板 δvru,h 的數值 —— 注意 δ 是地板總量, 與逐位點錯誤率 ε 是兩個不同的量。

這是與舊寫法最直接的對照 —— 舊寫法必須替兩批各設一個 ωr, 新寫法什麼都不必設。

十二、實作分期

整份規格不應一次到位。以下順序讓每一階段都能單獨驗證, 而且前一階段的結果可以當作後一階段的初始值:

階段做什麼驗收標準
1存下稀疏狀態表(含覆蓋遮罩);不改任何推論能重現現行分類的計數
2把 read-AF 分數換成 multinomial 似然;仍只在局部候選排序的變化可解釋;分岔比例回升
3加入觀測通道(逐位點 + 家族誤標),就地估計不相容連鎖區段的比例被錯誤率解釋掉
4接上全域 (w,T,z);限 CN-neutral 雜合區域、純度與 CN 取外部值合成資料上能還原已知的 K 與樹
5邊際化 σv;輸出未解對應而非強行統一標號斷開的 phase set 被正確報成未解
6視殘差決定是否加 τu;放寬到 LOH/WGD/subclonal CN加了 τ 之後結論是否改變
實作流程:從 read 到全基因體的群與樹,以及每一步是沿用還是改寫 八個步驟由上而下,右欄註明每一步的狀態是沿用、改寫還是新增。 第一步前處理,用現有的變異判定與單倍型標記,沿用。 第二步切分析單位,一個連鎖區段是一個連鎖視窗乘一個單倍型家族,鍵值要含 phase set,沿用。 第三步抽狀態表,除了完整的狀態之外還要留下每一條 read 的覆蓋遮罩與計數, 這一步要改寫:現行流程把部分覆蓋的 read 併進判定, 新的做法是把遮罩本身存下來,因為似然要用它。 第四步是現行的最小成本候選列舉,沿用,它負責產生候選的局部拓撲與必要的潛在節點。 第五步是改寫的重點:把原本用 read-AF 差值總和排序的分數, 換成這個連鎖區段那張狀態表的似然,並且不再只留一個候選。 第六步是新增的觀測通道,包含逐位點錯誤與整條分子的家族誤標,兩者形狀不同要分開估。 第七步把九成五單變異連鎖視窗的頻率因子與百分之五多變異連鎖區段的狀態表因子相乘, 接到同一組全域參數上,這是整條路線的核心。 第八步輸出全基因體的群與樹,並且逐條標明支持度、 沒看到的狀態各自的比例上界,以及跨 phase set 沒解決的對應關係。 右下角標注一個由此消失的東西:原本的約束信心值不再需要, 因為權重本來就是為了修補重複計數才存在的。 最下方標注:分岔與不可同群這些分類仍然照樣產生,但它們是這條流程的輸出, 不是再餵回去的證據。 讀法是:八步裡有三步沿用,兩步改寫,兩步新增, 而改寫的那兩步都是把「先挑一個」換成「全部留著,讓似然決定」。 實作流程:把局部的狀態表接到全基因體那一層 ① 前處理:變異判定 + 單倍型標記 沿用 ② 切連鎖區段:染色體+phase set+連鎖視窗+家族 沿用 ③ 抽狀態表,並保留每條 read 的覆蓋遮罩 改寫 遮罩不再被併掉,似然要用 ④ 列舉最小成本候選與潛在節點 沿用 現行的超立方體解法照用 ⑤ 候選分數:read-AF 差值 → 狀態表似然 改寫 而且不再只留一個候選 ⑥ 觀測通道:逐位點錯誤 + 家族誤標 新增 兩者形狀不同,要分開估 ⑦ 兩類因子相乘,接到同一組全域參數 新增 這是整條路線的核心 ⑧ 輸出:群 + 樹 + 支持度 + 未解對應 新增 含「沒看到的狀態」比例上界 由此消失的一步:約束的信心值。權重本來就是為了修補重複計數才存在的。 分岔/不可同群這些分類照樣產生 —— 但它們是這條流程的輸出,不是再餵回去的證據。
八步裡有三步沿用、兩步改寫、兩步新增。 兩處改寫都是把「先挑一個」換成「全部留著,讓似然決定」。 右下角標出由此消失的一步:約束的信心值不再需要。
規模補充:一個視窗最多放幾個變異(k 的上限該由什麼決定)

狀態空間本身不是瓶頸 —— kv=6 也只有 64 格,而實際觀測到的樣式遠少於此。 真正的成本在於局部候選集合與 σv 的加總被包在全域取樣的內層。 所以上限應由候選列舉的成本決定,不是由 2kv 決定。

依第十節的 Poisson 模型,5/Mb 時 k4 已涵蓋多變異固定寬度視窗的 99.99%, 50/Mb 時仍有 98.6%(固定寬度 20 kb 視窗)—— 先做 k4 幾乎不損失任何資料。 而 k 特別大的連鎖視窗多半是 kataegis,本來就該降權為一個有效觀測。

真實資料與證據

現行實作的量測結果:可用連鎖區段的庫存

以下數值皆來自本實驗室既有實作在七個資料集、六個生物樣本、chr1–22 上的輸出, 在本頁的脈絡下構成可寫成 Pv 的原料清單。

已經量到的全基因體譜:七個資料集的連鎖視窗拓撲類別組成 七條堆疊長條,每一條是一個資料集,橫軸是佔全部可分析單位的百分比。 每條分成三段:單層無分支、多層無分支,以及其餘(分支類與未解析加起來)。 單層無分支的範圍是一成九點五到四成六點八, 多層無分支的範圍是三成八點一到五成三點三,在七個資料集裡有六個是最大的一類。 右側標出每個資料集的可分析單位數,從四千二百多到兩萬三千多不等。 下方列出重現性:同一個細胞株在不同機構、不同 basecaller 下的組成相似度是零點九零九, 同為乳癌的樣本之間是零點八四到零點九零, 兩個肺癌樣本之間是零點八六,跨癌別則掉到零點五九到零點七八。 一個換了 basecaller 還能維持零點九零九、卻分得開癌別的統計量,帶著真的訊號。 最下方提醒:這張圖尚未針對覆蓋幾何做校正,所以類別比例還不能直接當成演化結論。 讀法是:這已經是一個可重現的全基因體單倍型頻譜,重新設計要建在它上面。 已經量到的全基因體譜 七個資料集、六個生物樣本、chr1–22,每個連鎖區段是「連鎖視窗 × 單倍型家族」。 HCC1395_HKU 34.5% 52.2% 9,130 HCC1395_NYGC 36.0% 52.3% 5,308 HCC1937 28.8% 53.3% 4,245 HCC1954 46.8% 38.1% 5,647 H1437 29.8% 53.2% 13,740 H2009 19.5% 52.2% 23,128 COLO829 42.8% 45.7% 10,757 單層無分支 多層無分支(七個裡有六個是最大類) 分支類 + 未解析 重現性:同細胞株換機構換 basecaller 0.909;乳癌之間 0.84–0.90; 兩個肺癌之間 0.86;跨癌別掉到 0.59–0.78。換了 basecaller 還守得住,代表訊號是真的。 但這張圖還沒針對覆蓋幾何校正,所以類別比例還不能直接當成演化結論。
七個資料集的連鎖視窗分類組成。 在本頁的模型下這張圖的讀法變了:它不是「有幾條約束」, 而是「狀態表的形狀分布」——「分支類」僅佔 6%–22%, 是拆峰能力唯一的來源,最為稀缺。
觀測數值在本頁的意義
可分析連鎖區段總數85,941 個含突變的單倍型連鎖區段原料充足,不需重新定序
候選集合可完整列舉75,224 個(87.53%可整組帶進全域推論的比例;其餘須另行處理
分支類的比例各資料集 6%–22%拆峰能力唯一的來源,最為稀缺
多層無分支的比例38.1%–53.3%次序資訊的來源,數量最多
更換 basecaller 的重現性同細胞株跨機構 0.909此分類非流程雜訊
單一連鎖區段的覆蓋結構194 條 read,覆蓋 3 個位點者僅 3 條遮罩必須留下來的直接依據

三項須注意的事項

其一,0.909 為目前最強的結果。一個在更換 basecaller 後仍維持、 且能區分癌別的統計量,所承載的是真實訊號。改成似然之後應重新計算此數值: 若維持或提升,表示新的分數確實在解釋同一個訊號;若下降, 則原本的 0.909 有一部分係由共同的覆蓋幾何所致。

其二,「分支類」的比例尚不可直接視為證據產量。 分岔的判定需要兩個單突變狀態皆存在,雙突變狀態的缺席不是抽樣零也不是錯誤地板 —— 後者正是第四節所檢驗的對象。故 6%–22% 為上限,而非實際可用量。

其三,有一項計數需要釐清。 各資料集的連鎖區段數總和為 71,955,而結論中引用的數值為 85,941。 兩者可能計數不同的對象,此點須在成文之前確認。

預測與結果檢視

既然改成似然之後「證據弱的觀測自然只貢獻一點點」, 那是不是就不必再管品質了 —— 把所有連鎖區段、所有遮罩全部丟進去就好?

展開答案

對一半。門檻確實不需要了,但有一件事變得更重要,不是更不重要。

舊寫法必須設門檻,是因為一條由 n=3 產生的假「不可同群」 會迫使混合模型分出一個不存在的群,而且不留任何跡象。 新寫法沒有這個失效模式:沒有任何一格的機率是 0, 一個 n=3 的連鎖區段算出來的似然差異本來就很小。這一半是對的。

但代價轉移到了錯誤地板身上。地板由第二節的兩個錯誤通道決定, 而地板訂錯的後果與舊寫法的假約束一樣嚴重、一樣安靜

  • 地板訂得太低(例如只寫了逐位點錯誤、漏了家族誤標): 誤標造出來的少數幾條 read 在模型眼中變成「錯誤不可能產生」, 於是被解釋成一個新的 clone。這正是舊寫法那個失效模式換一個位置再出現一次。
  • 地板訂得太高:真實的低頻 subclone 被吸進地板,K 少算。 這一種更難察覺,因為群數少一個不會引起任何注意。

所以取捨並沒有消失,只是從「要不要相信這條約束」變成「錯誤率估得準不準」。 好消息是後者是一個可以就地量測的量(不相容連鎖區段的比例、 同一連鎖區段內互斥狀態的共現率),而前者從來都不是。 這正是改寫的實際收益:把一個靠判斷的旋鈕,換成一個可以估計的參數。

實際強度仍應藉重現性外部檢驗: 在不同 basecaller、不同機構的同一細胞株上掃描一系列錯誤率設定, 比較何者的群與樹最為一致。此檢驗不需金標準, 而金標準正是此領域最欠缺的條件。

尚未解決的問題

  • 整條路線尚未經實測驗證。上述各項皆有結構性的理由,但均未在真實資料上檢驗。 最小的驗證即中篇第三節的數值例:合成 ρ = 0.60、CCF 分別為 1.00/0.40/0.40 的三群, 確認僅用 VAF 的分群必然給出 K=2 與線性樹, 再量測需要多少個多變異連鎖區段、錯誤率要估得多準,方能正確分離而不誤拆。
  • φ 的量測方式需要重新設計。第三節指出: 用同一批分子上的變異估 φ 會系統性偏低,而偏低的方向恰好偏向本路線想要的結論。 改由相距夠遠的同群變異估計之後,φ^ 會變大多少是一個必須先回答的問題 —— 它直接決定用途二還剩多少效力。
  • 推論的計算成本尚未評估。全域取樣的內層包了每個連鎖區段的候選集合與 σv 加總,而連鎖視窗有數萬個。這是整份規格中唯一沒有閉式估計的部分。
  • 內層最佳化的凹性沒有保證。第七節指出, qw 是比值函數、狀態機率又是加權和,兩者都會破壞對數似然的凹性。 因此「找到的是全域最大值」目前只是假設: 需要先用合成資料量出多起點之間收斂到不同解的比例, 才知道多起點要跑幾個、以及區間估計要不要因此加寬。
  • 連鎖區段的來源具有偏性。它們僅來自變異密集的連鎖視窗, 而變異密集有時並非偶然:kataegis 為一種局部超突變, 單次事件於數十 kb 內產生一連串變異。 該串變異幾乎必然同時發生且同屬一群,故將貢獻大量高度相關的證據, 在統計上卻被計為數十個獨立觀測。應先偵測並降權為每叢一個有效觀測。
  • 一個群未必對應單一細胞群體。本實驗室的甲基化觀測顯示: 單一個「單倍型 + 等位」狀態之下仍可區分出五群甲基化模式。 故 K 的正確讀法恆為「至少此數」。
  • 超出 read 跨距的關係仍不可觀測。相距 100 kb 的兩個變異無法落入同一個連鎖區段, 與定序深度無關;第八節的三層結構為此設下硬上限。

原始文獻與程式碼

本頁「現行實作的量測結果」一節的數值均出自: 廖子游,Subclonal reconstruction using somatic haplotagging and methylation profiles with Nanopore sequencing,國立中正大學資訊工程學系碩士學位口試,2026 年 7 月 30 日。

以 read 上的多變異狀態計數(而非單點 VAF)直接建模 subclone, 最接近的既有做法是 PairClone 與 TreeClone:Zhou T, Sengupta S, Müller P, Ji Y, PairClone: a Bayesian subclone caller based on mutation pairsJ R Stat Soc Ser C 2019;68:705–725 (academic.oup.com); 以及 Zhou T et al., TreeClone: Reconstruction of tumor subclone phylogeny based on genotype pairsarXiv:1703.03853。 兩者處理的是成對的位點與部分觀測的 read;本頁規格與其相異之處在於 可變的 k、逐 phase set 的方向邊際化,以及與全基因體單變異連鎖視窗的相乘接合。 此一相異性尚未經文獻檢索確認,成文前應先查證。

單變異連鎖視窗那個因子所屬路線的代表性實作:SciClone,Miller CA et al., PLoS Comput Biol 2014;10:e1003665;PyClone,Roth A et al., Nat Methods 2014;11:396–398; MOBSTER,Caravagna G et al., Nat Genet 2020;52:898–907 (doi 10.1038/s41588-020-0675-5), 程式碼在 github.com/caravagnalab/mobster。 換算式與檢定力指標見 Tarabichi M et al., Nat Methods 2021;18:144–155 (doi 10.1038/s41592-020-01013-2); 評比數據見 Salcedo A et al., Nat Biotechnol 2024 (doi 10.1038/s41587-024-02250-y)。

簡約假設的原始出處為 Camin JH, Sokal RR, A method for deducing branching sequences in phylogeny, Evolution 1965;19:311–326; 有向最小成本 Steiner 樹形圖的標準參考為 Charikar M et al., Approximation algorithms for directed Steiner problems, J Algorithms 1999;33:73–91。 第八節所沿用的候選列舉即屬此系。

前處理所依賴的單倍型標記見 LongPhase-S 預印本 (bioRxiv, 2025,doi 10.1101/2025.11.20.689492), 程式碼在 github.com/CCU-Bioinformatics-Lab/longphase-s。 參數名稱與欄位一律以原始碼為準。

本模組術語

cancer cell fraction(癌細胞比例)
帶有某個特定突變的腫瘤細胞佔全部腫瘤細胞的比例。用來區分 clonal(1)與 subclonal(<1)突變。不等於 VAF。
clone tree(克隆演化樹)
描述腫瘤內各群細胞祖先關係的樹:節點是一群帶有相同變異組合的細胞,邊代表在祖先之上又多拿到變異。要注意同一組群集常常有多棵樹同時相容。
haplotagging
根據已 phase 好的 variants,把每一條 read 指派到 HP1 或 HP2,並把結果寫回 BAM 的 HP tag。
homopolymer(同聚物)
同一個鹼基連續重複的區段,例如 AAAAAA。nanopore 在此類區段較容易發生長度判讀錯誤,是 indel 假陽性的常見來源之一。
latent node(潛在節點)
建樹時為了讓圖連得起來而補進的中間狀態,沒有被任何 read 直接觀測到。它是模型的產物,不能當成「還沒觀察到的細胞」。
mutation multiplicity
在帶有某突變的細胞中,該突變所占的拷貝數;是 VAF 與 cancer cell fraction 換算時的重要參數。
phase block
一段可建立連續相位關係的區域。read 長度不足、缺少 informative heterozygous 位點或證據不一致時,可能形成不同 phase blocks。
pigeonhole(鴿籠原理)
由父代與子代的細胞比例限制樹形的算術規則:一個細胞至多屬於父節點底下的一個子節點,所以各子節點的細胞比例加起來不得超過父節點。名稱來自鴿籠原理 —— 東西放進籠子,總量不會憑空變多。在 subclone 重建的文獻中也稱為 sum rule 或 crossing rule。它只能排除樹,不能挑出樹:通過檢查的候選通常仍不只一棵,其餘要靠 parsimony 之類的偏好決定。
read-AF(read 層級的 ALT 比例)
在同一個分析區域、同一個單倍型家族的 read 之中,某個 somatic 位點帶 ALT 的比例。分母已限縮到同一條 haplotype 的同一段區域,所以不必經過純度與拷貝數換算;用途是在步數並列的候選樹之間排序。
tumour purity(腫瘤純度)
樣本中腫瘤細胞所佔的比例。purity 越低,somatic 訊號被正常細胞稀釋得越嚴重,偵測越困難。
單倍型家族(一條 germline 單倍型,加上由它衍生的 somatic 單倍型)
把 read 依 HP tag 分成的兩組之一。家族一HP1 與從它長出來的 HP1-1家族二HP2HP2-1;歸不到任何一條 germline 單倍型的 HP3 不屬於任何一族。叫「家族」是因為它把一條 germline 單倍型與由它衍生的 somatic 單倍型收在同一組裡 —— 分組看的是 germline 那一層,不是有沒有帶 somatic 突變。

在同一個 phase block 內,一個家族對應一條染色體拷貝,所以「兩族」就是那個位置上的兩條同源染色體。但兩件事不成立:其一,軟體判定不出哪一族來自父親、哪一族來自母親(那需要另外定序父母);其二,標號只在該 phase block 內有定義,跨 block 的「家族一」並非同一條染色體。