模組 5 · Germline variant calling

Germline variant calling:從證據到判定

說明 Clair3 與 DeepVariant 的角色,以及 phasing 如何提供額外證據、協助區分變異與定序雜訊。

約 35 分鐘建議先修:資料格式

本模組學習目標

  • 說明 variant caller 在做什麼判斷,以及為什麼它不是單純數 read
  • 說明 phasing 資訊如何作為辨識定序錯誤的輔助證據
  • 說出 Clair3 與 DeepVariant 在流程中的位置
  • 說明為什麼 phasing 與 calling 是來回兩次,而不是單向的一次

為什麼重要

本課程後續工具多以 caller 輸出的候選變異為輸入,進一步進行篩選或校正。 因此需要先理解 caller 的輸出內容與限制。

germline calling 的情境相對單純:一個人只有兩條染色體,變異要嘛在其中一條、要嘛兩條都有。 本節在這個單純的情境下把 caller 的判斷方式講清楚,M07 再處理腫瘤帶來的額外因素。

概念與互動

的判斷內容

某個位置有 30 條 read 支持 A、28 條支持 G。這組數字可以提出 heterozygous 候選, 但不能單獨定案 —— 因為同樣的 30 比 28,畫面可以完全不同

同樣是 30 比 28,畫面可以完全不同 兩邊的計數完全一樣:30 條 read 支持參考鹼基 A、28 條支持 G。 左半部畫出一種與真 heterozygous 相容的畫面:支持 G 的 read 正反股都有, 鹼基品質高,附近序列沒有對齊困難。右半部畫出另一種畫面:支持 G 的 read 全部落在同一股, 鹼基品質低,而且候選位置緊鄰一段同型多聚體。兩者的支持數相同, 因此僅依數量無法區分,必須看每個觀測本身帶的品質與比對資訊。 同一組計數,畫面 A 30 條支持 A 28 條支持 G 計數 30 : 28 兩邊完全一樣 候選位置 C T G C T A C G T C T A C T A C G T C T G C T A C G T C T A C T A C G T C T G C T A C G T C T A C T A C G T 支持 G 的 read:正反股都有、鹼基品質高 鄰近序列沒有重複片段,比對位置明確 同一組計數,畫面 B 30 條支持 A 28 條支持 G 計數 30 : 28 跟左邊一模一樣 候選位置 C T G C A A A A T C T G C A A A T T C T G C A A A A T C T A C A A A A T C T A C A A A A T C T A C A A A A T 同型多聚體 支持 G 的 read:全部同一股、鹼基品質低(淡字) 右側是一段連續 A,比對位置本身就有歧義 數量一樣,畫面不一樣 —— caller 判斷的是後者。 所以 30 比 28 只能提出候選;每一個觀測還帶著品質、股向與鄰近序列,這些才是判定的依據。
兩邊的計數一模一樣。左邊支持 G 的 read 正反股都有、鹼基品質高,鄰近序列也沒有對齊困難。右邊支持 G 的 read 全部落在同一股、鹼基品質低(畫成淡字),而且緊鄰一段連續的 A,比對位置本身就有歧義。數量分不出這兩者。

所以 caller 讀的不是兩個數字,而是這個位置的整張畫面 —— 把覆蓋此處的 read 排成一張表(一列一條 read、一欄一個位置,這種排法叫 pileup), 再把表上每個格子的資訊編碼成好幾層數值送進模型。 都是這種做法:

caller 把一個位置的 read 堆疊變成多層數值,再由模型判定基因型 由左而右三步。第一步:把候選位置周圍的參考序列與覆蓋此處的 read 排成一張表, 每一列是一條 read,每一欄是一個位置,中間那一欄是待判定的候選。 第二步:同一張表被編碼成好幾層數值,每一層記錄一種資訊 —— 鹼基種類、鹼基品質、比對品質、read 落在哪一股;深淺代表數值大小。 第三步:這疊數值送進神經網路,輸出三種基因型的機率: 兩條都是參考、一條有變異、兩條都有變異。此例的機率集中在一條有變異,即 heterozygous。 不同 caller 的通道定義與模型結構並不相同,此圖為示意。 ① 這個位置的 read 堆疊 候選 參考 C T A A G C T C T A G G C T C T A A G C T C T A G G C T C T A A G C T C T A G G C T C T A A G C T C T A G G C T C T A A G C T 一列是一條 read,一欄是一個位置 每個格子還帶著品質與股向 ② 編碼成多層數值 鹼基種類 鹼基品質 比對品質 整條 read 一個值 read 落在哪一股 深=正股 淺=反股 深淺=數值大小。實際通道數與定義 依 caller 與版本而異,這裡只取四層示意 ③ 模型輸出基因型機率 卷積層:找局部樣態 卷積層:組合成證據 全連接層 三種基因型的機率 0/0 0.01 0/1 0.97 1/1 0.02 此例判為 heterozygous(0/1) 模型看的不是「幾比幾」,而是整張帶著品質與比對資訊的畫面。 Clair3 與 DeepVariant 都屬於這種做法,但兩者的通道定義、模型結構與訓練資料並不相同。
① 候選位置周圍的 read 堆疊。② 同一張表被編碼成多層數值:鹼基種類、鹼基品質、比對品質、read 落在哪一股,深淺代表數值大小。③ 這疊數值送進神經網路,輸出三種基因型(0/00/11/1)的機率。實際通道定義與模型結構依 caller 與版本而異。

兩個工具的內部步驟不同:DeepVariant 把「做數值」「跑模型」「寫 VCF」拆成三個程式; Clair3 則先用輕量模型掃過所有位置,只把信心不足的少數位置交給看完整比對的模型重判。

variant caller 在流程中的位置,以及兩個常用工具的內部步驟 上方是輸入與輸出:比對後的 BAM 與參考序列進入 variant caller, 輸出 germline VCF,再供後續的 phasing 工具使用。 中間列出 DeepVariant 的三個步驟:先把每個候選位置的 read 堆疊做成多層數值, 再由神經網路輸出基因型機率,最後寫成 VCF。 下方列出 Clair3 的兩段式設計:先用較輕量的模型掃過所有候選位置, 大多數位置在這一步就定案,只有少數信心不足的位置再交給看完整比對的模型重判。 兩者的步驟名稱與細節依版本而異。 aln.bam(比對後的 read) reference.fasta(參考序列) variant caller Clair3 / DeepVariant germline VCF 位置+基因型+品質分數 後續 phasing 用其中的 het 位點當錨點 DeepVariant:三個步驟 make_examples 把 read 堆疊做成多層數值 call_variants 神經網路輸出基因型機率 postprocess_variants 整理成 VCF Clair3:先快掃一遍,難判的才細看 輕量模型掃全部位置 用每欄的摘要統計 多數位置在此定案 機率明確,不必再算 少數位置信心不足 留給下一步重判 完整比對模型再判 看整段比對的細節 兩段式的用意:把昂貴的計算只花在難判的少數位置上。實際步驟名稱與門檻依版本而異。
上:caller 吃 BAM 與參考序列,吐出 germline VCF,供後續 phasing 使用。中:DeepVariant 的三個步驟。下:Clair3 的兩段式設計 —— 把昂貴的計算只花在難判的少數位置上。步驟名稱與門檻依版本而異。

把 read 先分成兩群,判斷就變簡單了

前面那張畫面還有一個沒用上的線索:這些 read 分別來自哪一條染色體。 一個人的每個位置有兩條染色體,一條來自父親、一條來自母親。 把 read 依這兩條分成兩群(也就是 ),同一個畫面會變得好判斷得多:

先把 read 分成兩群,再判定變異:haplotype 資訊如何幫助 germline calling ① 六條 read、四個位置;其中三個位置各出現了兩種鹼基,但看不出哪些是真的變異、哪些是錯誤。 ② phasing 把 read 分成兩群之後,位置 1 與位置 3 的差異在同一群裡每一條 read 都一致, 與真的 heterozygous 變異相容;位置 2 的差異則是兩群各零星一條,與定序錯誤相容。 ③ 因此實際流程是來回兩次:先做一次 calling 取得可靠的 heterozygous 位點, 用它們把 read 分成 HP1 與 HP2,再把 haplotype 標籤當成模型的額外輸入重判一次。 ④ 最終判定中,位置 1 與位置 3 保留為 heterozygous 變異,位置 2 被判為錯誤而移除。 ① 定序後的 read:混在一起 G T T A A T C A G C T A A T C A G T T A A C C A 六條 read、四個位置;其中三個位置出現兩種鹼基。 哪些是真的變異、哪些是錯誤?這樣排看不出來。 ② phasing:把 read 分成兩群 HP1 HP2 G T T A G C T A G T T A A T C A A T C A A C C A 位置 1、3:同一群內每條都一致 → 像真的變異 位置 2:兩群各零星一條 → 像定序錯誤 ③ 所以實際流程是來回兩次 第一次 calling 還沒有 haplotype 取得可靠的 het 位點 用這些位點 phasing 把 read 分成 HP1 與 HP2 帶著 HP 再判一次 haplotype 成為 模型的額外輸入 難判的位置在第二次才定案;容易的位置第一次就結束了。 ④ 最終判定 兩條染色體各自的鹼基 HP1 HP2 G A T C 位置 2 被判為錯誤,不寫進 VCF。 「先 call 再 phase」與「phase 幫助 call」並不衝突:先用最有把握的 het 位點做 phasing, 再把 haplotype 資訊餵回模型重判一次 —— Clair3 與 PEPPER-Margin-DeepVariant 都是這樣做。
① 六條 read 混在一起時,其中三個位置各看得到兩種鹼基,分不出哪些是真的。② 分成兩群之後:位置 1 與位置 3 在同一群裡每條 read 都一致,與真的 heterozygous 變異相容;位置 2 只是兩群各零星一條,與定序錯誤相容。③ 因此流程是來回兩次:先 call 出可靠的 het 位點 → 用它們 phasing → 帶著 HP 標籤再判一次。④ 位置 2 被移除,不寫進 VCF。

關鍵在一致性,不在數量。真的 heterozygous 變異只存在於其中一條染色體上, 所以那一群的每一條 read 都應該帶著它;隨機的定序錯誤沒有這個約束,會零星散落在兩群裡。 這個判準對錯誤率較高的平台(例如部分 ONT 資料)特別有用 —— 那正是單看計數最不可靠的情形。

這也解釋了一個看起來矛盾的地方:明明要先有變異才能 phasing,怎麼又說 phasing 幫助 calling? 因為兩者是來回兩次:先用最有把握的位點做一次 calling,用它們把 read 分群, 再把 當成模型的額外輸入重判一次。Clair3 的 full-alignment 階段與 PEPPER-Margin-DeepVariant 都採用這個順序。

同一個「集中或分散」的線索在腫瘤資料裡會再出現一次,只是那時要判斷的不只是真假, 還包括這個變異長在哪一條 上 —— 需要的證據也更多。以下這張圖先把最重要的陷阱說清楚: 兩種情況的支持 read 總數可以幾乎一樣,所以不能靠數量判斷。

以 haplotype 分布作為候選判讀的輔助證據 兩邊示意同一種畫面:中間是待判斷的候選位置,左右兩側各有一個已知參考位點, 用來把 read 分成兩個 haplotype 群組。左半部示意在一般 heterozygous、相位可靠的情境下, 支持 read 較集中於一群;右半部示意隨機錯誤的支持 read 可能分布於兩群。 系統性錯誤、mapping bias、copy-number/LOH 或 phasing 錯誤可能不符合此簡化模式。 最下方比較兩邊的數量與分布,說明僅依 read 數量可能無法區分。 候選變異(示例) 簡化情境:支持 read 多集中於一群 參考點 候選 參考點 HP1 A G A G A G A G A G HP2 T C T C T C T C T C 支持 read 集中於 HP1 HP1: 5 條  HP2: 0 條 分布集中 隨機錯誤(示例) 支持 read 可能分散於兩群 參考點 候選 參考點 HP1 A G A G A G A G A G HP2 T C T C T C T C T C 兩群皆有支持,分布較分散 HP1: 2 條  HP2: 3 條 分布分散 支持 read 的 haplotype 分布可作為重要輔助線索。 此示例兩邊的總數相近(5 條對 5 條)—— 僅依數量難以區分, 需先建立 HP1/HP2 分群,再結合品質、比對與其他證據判讀。
兩邊示意同一種畫面:中間是待判斷的候選位置,左右各有一個已知參考位點,將 read 分成兩個 haplotype 群組。左邊示意支持 read 集中於一群;右邊示意支持 read 分布於兩群。兩邊的總數相近,因此僅依數量難以區分,仍需整合品質與比對證據。
適用邊界:haplotype 一致性不能單獨定案

系統性錯誤、mapping bias,以及腫瘤裡的 copy-number 變化或 ,都可能讓分布不符合上述的簡化模式。它是重要線索,不是單獨的判定依據。

真實證據

本教材示例使用 ;部分流程也會使用 PEPPER-Margin-DeepVariant。 以下提供一組示範指令:

docker run \
  -v "${INPUT_DIR}":"${INPUT_DIR}" \
  -v "${OUTPUT_DIR}":"${OUTPUT_DIR}" \
  kishwars/pepper_deepvariant:r0.7 \
  run_pepper_margin_deepvariant call_variant \
  -b "${INPUT_DIR}/alignment.bam" \
  -f "${INPUT_DIR}/reference.fasta" \
  -o "${OUTPUT_DIR}" \
  -t 10 \
  --ont_r9_guppy5_sup

最後的 --ont_r9_guppy5_sup 是與特定 ONT 化學版本/basecaller 資料相容的模型選項。 R10 與 PacBio HiFi 應依所用版本文件選擇相容模型(例如 --ont_r10_q20--hifi)。 模型不匹配可能降低效能,且流程未必報錯;請將平台、basecaller 與模型版本記錄於

在本教材流程中,germline VCF 產生後,再由後續 phasing 工具使用其中的 heterozygous 位點作為錨點。 這是本流程的先 call、再 phase 順序;其他工具可能採用不同的整合方式。

判讀練習

某個位點有 50 條 read 覆蓋,其中 25 條支持 alt allele(VAF = 0.5)。 檢查這 25 條 read 的 ,發現 13 條屬於 HP1、12 條屬於 HP2。

請判斷此分布較支持一般 germline 變異,還是定序錯誤/比對假訊號,並說明需要補充哪些證據。

展開答案

在相位與 mapping 品質可靠、且未見 CN/LOH 等因素時,這個分布與一般 heterozygous germline 模式不一致,可列為可疑訊號。

一般 heterozygous germline 變異預期位於其中一條染色體,因此支持 read 往往較集中於 HP1 或 HP2;13 比 12 的分布需要結合其他證據判讀,不能單獨定義為錯誤。

接近均分的支持 read 可與隨機錯誤一致,但系統性錯誤、mapping bias、相位錯誤或腫瘤區域的 copy-number 狀態也可能造成類似結果。

另需注意以下情況:

  • 若位點的 DNA 拷貝數相對一般二倍體狀態改變,haplotype 比例可能失衡
  • 若為 homozygous 變異,兩條 haplotype 都可能帶有該 allele;VAF 仍會受 copy number、污染與測序品質影響,不必然等於 1.0

因此,VAF = 0.5 加上 HP 近乎均分只能提高可疑程度,仍需搭配 allele balance、base/mapping quality 與 copy-number 證據。

實作練習

執行一次 germline calling

# Clair3(Docker 範例;請依環境調整路徑)
docker run -v "${INPUT_DIR}":"${INPUT_DIR}" -v "${OUTPUT_DIR}":"${OUTPUT_DIR}" \
  hkubal/clair3:latest \
  /opt/bin/run_clair3.sh \
  --bam_fn="${INPUT_DIR}/aln.bam" \
  --ref_fn="${INPUT_DIR}/reference.fasta" \
  --threads=10 \
  --platform="ont" \
  --model_path="/opt/models/ont" \
  --output="${OUTPUT_DIR}"

模型應與定序化學版本、basecaller 與工具版本相容。模型不匹配可能降低效能, 且未必觸發錯誤;請在執行前核對模型文件,並將設定記錄於 provenance。

檢查結果的合理性

取得 VCF 後,先進行以下基本合理性檢查:

# 變異總數;典型高品質人類全基因體 callset 約為數百萬筆,實際值依篩選條件而異
bcftools view -H out.vcf | wc -l

# het 與 hom 的比例;實際值依族群、平台與篩選條件而異
bcftools view -H -g het out.vcf | wc -l
bcftools view -H -g hom out.vcf | wc -l

# SNV 與 indel 的比例;實際值依平台與篩選條件而異
bcftools view -H -v snps out.vcf | wc -l
bcftools view -H -v indels out.vcf | wc -l

這些統計若明顯偏離同類資料的預期,可能提示 coverage、模型相容性、參數、過濾條件或樣本品質問題。 請先檢查原因,再進行 phasing,以降低問題在後續流程中傳遞的風險。

學習檢核

原始文獻與程式碼

  • Clair3:Zheng Z 等,Symphonizing pileup and full-alignment for deep learning-based long-read variant calling,Nature Computational Science,2022。程式碼在 github.com/HKU-BAL/Clair3
  • DeepVariant:Poplin R 等,A universal SNP and small-indel variant caller using deep neural networks,Nature Biotechnology,2018(doi 10.1038/nbt.4235)。程式碼在 github.com/google/deepvariant

本模組術語

Clair3
以深度學習做 germline variant calling 的工具,長 read 上常用。
DeepVariant
Google 開發的 germline variant caller,把 pileup 轉成影像再用 CNN 分類。
HP tag
BAM 裡標示某條 read 屬於哪一條 haplotype 的 tag。LongPhase-S 的 germline haplotag 寫成整數 HP:i:1;somatic haplotag 與 LongPhase-TO 則寫成字串 HP:Z:1-1
LOH(異型合子性喪失)
原本 heterozygous 的區域變成只剩一種 allele。LOH 不等於缺失 —— 也可能是一條 haplotype 遺失後另一條被複製(copy-neutral LOH)。
haplotype(單倍型)
同一條實體染色體拷貝上,具有一致相位的一組 alleles 或 variants。HP1 與 HP2 是任意的相對標籤。
phasing(定相)
為可判定的 variants 建立其位於不同實體染色體拷貝上的相位關係;VCF 常以 0|1 等形式表示。長 read 可提供跨位點的分子層級觀測證據。
provenance(資料來源履歷)
記錄資料來源、細胞株、定序平台、basecaller、reference build、caller、benchmark 與混樣方式。在本實驗室中,這些資訊是重要實驗變數,而非附註。
variant calling
從已比對 read 中判斷哪些位置具有足夠證據支持變異存在的過程,通常輸出 VCF。