模組 5 · Germline variant calling
Germline variant calling:從證據到判定
說明 Clair3 與 DeepVariant 的角色,以及 phasing 如何提供額外證據、協助區分變異與定序雜訊。
本模組學習目標
- 說明 variant caller 在做什麼判斷,以及為什麼它不是單純數 read
- 說明 phasing 資訊如何作為辨識定序錯誤的輔助證據
- 說出 Clair3 與 DeepVariant 在流程中的位置
- 說明為什麼 phasing 與 calling 是來回兩次,而不是單向的一次
為什麼重要
本課程後續工具多以 caller 輸出的候選變異為輸入,進一步進行篩選或校正。 因此需要先理解 caller 的輸出內容與限制。
germline calling 的情境相對單純:一個人只有兩條染色體,變異要嘛在其中一條、要嘛兩條都有。 本節在這個單純的情境下把 caller 的判斷方式講清楚,M07 再處理腫瘤帶來的額外因素。
概念與互動
變異檢測variant calling從已比對 read 中判斷哪些位置具有足夠證據支持變異存在的過程,通常輸出 VCF。Deciding which positions genuinely carry variants, given aligned reads. Outputs a VCF.完整條目 →的判斷內容
某個位置有 30 條 read 支持 A、28 條支持 G。這組數字可以提出 heterozygous 候選,
但不能單獨定案 —— 因為同樣的 30 比 28,畫面可以完全不同:
G 的 read 正反股都有、鹼基品質高,鄰近序列也沒有對齊困難。右邊支持 G 的 read 全部落在同一股、鹼基品質低(畫成淡字),而且緊鄰一段連續的 A,比對位置本身就有歧義。數量分不出這兩者。所以 caller 讀的不是兩個數字,而是這個位置的整張畫面 —— 把覆蓋此處的 read 排成一張表(一列一條 read、一欄一個位置,這種排法叫 pileup), 再把表上每個格子的資訊編碼成好幾層數值送進模型。Clair3Clair3以深度學習做 germline variant calling 的工具,長 read 上常用。A deep-learning germline variant caller widely used for long reads.完整條目 → 與 DeepVariantDeepVariantGoogle 開發的 germline variant caller,把 pileup 轉成影像再用 CNN 分類。Google's germline variant caller; encodes pileups as images and classifies them with a CNN.完整條目 → 都是這種做法:
0/0、0/1、1/1)的機率。實際通道定義與模型結構依 caller 與版本而異。兩個工具的內部步驟不同:DeepVariant 把「做數值」「跑模型」「寫 VCF」拆成三個程式; Clair3 則先用輕量模型掃過所有位置,只把信心不足的少數位置交給看完整比對的模型重判。
把 read 先分成兩群,判斷就變簡單了
前面那張畫面還有一個沒用上的線索:這些 read 分別來自哪一條染色體。
一個人的每個位置有兩條染色體,一條來自父親、一條來自母親。
把 read 依這兩條分成兩群(也就是 phasingphasing 定相為可判定的 variants 建立其位於不同實體染色體拷貝上的相位關係;VCF 常以 0|1 等形式表示。長 read 可提供跨位點的分子層級觀測證據。Determining which variants lie on the same physical chromosome, turning 0/1 into 0|1. Long reads provide direct molecular evidence.完整條目 →),同一個畫面會變得好判斷得多:
關鍵在一致性,不在數量。真的 heterozygous 變異只存在於其中一條染色體上, 所以那一群的每一條 read 都應該帶著它;隨機的定序錯誤沒有這個約束,會零星散落在兩群裡。 這個判準對錯誤率較高的平台(例如部分 ONT 資料)特別有用 —— 那正是單看計數最不可靠的情形。
這也解釋了一個看起來矛盾的地方:明明要先有變異才能 phasing,怎麼又說 phasing 幫助 calling?
因為兩者是來回兩次:先用最有把握的位點做一次 calling,用它們把 read 分群,
再把 HP 標籤HP tagBAM 裡標示某條 read 屬於哪一條 haplotype 的 tag。LongPhase-S 的 germline haplotag 寫成整數 HP:i:1;somatic haplotag 與 LongPhase-TO 則寫成字串 HP:Z:1-1。BAM tag assigning a read to a haplotype. Integer HP:i:1 for germline haplotag; string HP:Z:1-1 for somatic.完整條目 →當成模型的額外輸入重判一次。Clair3 的 full-alignment 階段與
PEPPER-Margin-DeepVariant 都採用這個順序。
同一個「集中或分散」的線索在腫瘤資料裡會再出現一次,只是那時要判斷的不只是真假, 還包括這個變異長在哪一條 haplotypehaplotype 單倍型同一條實體染色體拷貝上,具有一致相位的一組 alleles 或 variants。HP1 與 HP2 是任意的相對標籤。A set of variants that lie on the same physical chromosome copy and are inherited together.完整條目 → 上 —— 需要的證據也更多。以下這張圖先把最重要的陷阱說清楚: 兩種情況的支持 read 總數可以幾乎一樣,所以不能靠數量判斷。
適用邊界:haplotype 一致性不能單獨定案
系統性錯誤、mapping bias,以及腫瘤裡的 copy-number 變化或 LOHLOH 異型合子性喪失原本 heterozygous 的區域變成只剩一種 allele。LOH 不等於缺失 —— 也可能是一條 haplotype 遺失後另一條被複製(copy-neutral LOH)。Loss of heterozygosity: a formerly het region retains only one allele. Not necessarily a deletion.完整條目 →,都可能讓分布不符合上述的簡化模式。它是重要線索,不是單獨的判定依據。
真實證據
本教材示例使用 Clair3Clair3以深度學習做 germline variant calling 的工具,長 read 上常用。A deep-learning germline variant caller widely used for long reads.完整條目 →;部分流程也會使用 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 與模型版本記錄於 provenanceprovenance 資料來源履歷記錄資料來源、細胞株、定序平台、basecaller、reference build、caller、benchmark 與混樣方式。在本實驗室中,這些資訊是重要實驗變數,而非附註。The full origin record of a dataset. In this lab it is a first-class experimental variable, not metadata.完整條目 →。
在本教材流程中,germline VCF 產生後,再由後續 phasing 工具使用其中的 heterozygous 位點作為錨點。 這是本流程的先 call、再 phase 順序;其他工具可能採用不同的整合方式。
判讀練習
某個位點有 50 條 read 覆蓋,其中 25 條支持 alt allele(VAF = 0.5)。
檢查這 25 條 read 的 HP tagHP tagBAM 裡標示某條 read 屬於哪一條 haplotype 的 tag。LongPhase-S 的 germline haplotag 寫成整數 HP:i:1;somatic haplotag 與 LongPhase-TO 則寫成字串 HP:Z:1-1。BAM tag assigning a read to a haplotype. Integer HP:i:1 for germline haplotag; string HP:Z:1-1 for somatic.完整條目 →,發現 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。