轉換 VCF 檔染色體命名慣例
VCF 檔中的 ##contig=<ID=*,lenth=*>
記錄了參考基因體所有染色體的名稱和長度等資訊,而 CHROM
欄位則標示變異所在的染色體。目前,染色體名稱有 UCSC (chr
+ 染色體編號,例如:chr1
和 chrX
)和 Ensembl (沒有前綴,僅有染色體編碼,例如:1
和 X
)兩種慣例。執行分析時, 如果輸入的 VCF 檔和對應的參考資料採用相異命名慣例,往往會導致分析結果失真。
舉例來說,GIAB 提供的 VCF 檔是評估變異分析常用的資料。這些 VCF 檔採用 Ensembl 慣例,如果拿 UCSC 慣例的 VCF 檔和它們比較,程式會以為沒有找到這些變異。因此,執行分析時,常常要調整染色體名稱,確保分析結果正確。
本文簡介使用 linux sed 和 bcftools 轉換 VCF 檔染色體命名慣例的方式。
範例資料:分別採用 UCSC 和 Ensembl 慣例的 VCF 檔
ucsc.vcf
,UCSC 慣例會在染色體名稱加上 chr
前綴,粒線體基因則命名為 chrM
。
1 | ##fileformat=VCFv4.2 |
ensembl.vcf
,Ensembl 慣例只標記染色體名稱,粒線體基因則命名為 MT
。
1 | ##fileformat=VCFv4.2 |
除了 CHROM
,轉換慣例時也要一併異動 ##contig=<ID=*
的格式。許多軟體(例如 GATK)會檢查兩者是否相符,如果 ##contig=<ID=*>
含有 CHROM
不存在的染色體(反之亦然)就會報錯。
使用 sed
轉換染色體命名慣例
我們可以使用 sed
添加或是刪除 chr
來轉換命名慣例。使用時要注意替換字串的順序和模式。舉例來說,從 UCSC 轉換為 Ensembl 慣例時,如果先把 VCF 檔內所有的 chr
移除,那麼調整粒線體基因名稱時要把 M
改成 MT
。然而,M
可能配對到太多字符,所以需要新增其它判斷的根據。
UCSC -> Ensembl
1 | cat ucsc.vcf |\ |
Ensembl -> UCSC
1 | cat ensembl.vcf |\ |
使用 bcftools
轉換染色體命名慣例
bcftools annotate
會依據用戶提供的命名格式辭典,同時更新 ##contig=<ID=*>
和 CHROM
的紀錄。例如:
ucsc_to_ensembl.tsv
1 | chr1 1 |
以及
ensembl_to_ucsc.tsv
1 | 1 chr1 |
UCSC -> Ensembl
1 | bcftools annotate --rename-chrs ucsc_to_ensembl.tsv ucsc.vcf |
Ensembl -> UCSC
1 | bcftools annotate --rename-chrs ensembl_to_ucsc.tsv ensembl.vcf |
如果你拿到的是壓縮過的 VCF 檔
前述案例都是處理未壓縮的 VCF 檔,但實務上為了節省空間和時間都會事先壓縮 VCF 檔為 vcf.gz
,並且用索引檔加速後續的資料處理。
調整 vcf.gz
的染色體命名慣例的步驟為解壓縮、調整格式、壓縮和索引,程式碼範例如下,記得把 <commands>
部分替換成對應的 sed
指令。
1 | # 解壓縮 vcf.gz 以執行資料處理,隨後再壓縮 |
bcftools annotate
可以直接處理並輸出壓縮的 VCF 檔,但最後還是要自行建立索引檔:
1 | # UCSC to Ensembl |
延伸資訊
- VCF files: Change Chromosome Notation:Biostar 上的討論了用 awk、sed、bcftools 等轉換染色體命名慣例的途徑。
- What are Ensembl and GENCODE and is there a difference?:UCSC 的網站介紹了他們和 Ensembl 的染色體命名慣例差異。