在前面两节中,我们比较了不同 vcf 注释软件的使用,以及将注释后的记过转换成了 maf 格式的文件,由于snpeff 注释结果暂时无法转换成 maf,所以后面我们就比较 ANNOVAR、VEP、GATK Funcatator 的注释结果得到的合并后的 maf 文件。首先将拿到的结果载入到R语言中,然后用 maftool 可视化,代码如下:

读入数据

  1. rm(list = ls())
  2. require(maftools)
  3. options(stringsAsFactors = F)
  4. ## annovar
  5. annovar.laml <- annovarToMaf(annovar = "./7.annotation/annovar/annovar_merge.vcf",
  6. refBuild = 'hg38',
  7. tsbCol = 'Tumor_Sample_Barcode',
  8. table = 'refGene',
  9. MAFobj = T)
  10. ## gatk
  11. # gatk.laml = read.maf(maf = 'gatk/gatk4.1.4.0_merge.maf')
  12. library(data.table)
  13. tmp=fread('./7.annotation/funcatator/funcatator_merge.maf')
  14. gatk.laml = read.maf(maf = tmp)
  15. ## vep
  16. vep.laml = read.maf(maf = './7.annotation/vep/vep_merge.maf')
  17. ## for vep.laml
  18. library(stringr)
  19. vep.laml@data$Protein_Change = paste0("p.",
  20. str_sub(vep.laml@data$Amino_acids,1,1),
  21. vep.laml@data$Protein_position,
  22. str_sub(vep.laml@data$Amino_acids,3,3))
  23. ## save Rdata
  24. save(annovar.laml, gatk.laml, vep.laml, file = 'laml.Rdata')
  25. ## Summary
  26. laml=annovar.laml
  27. unique(laml@data$Tumor_Sample_Barcode)
  28. getSampleSummary(laml)
  29. getGeneSummary(laml)
  30. getFields(laml)
  31. laml=gatk.laml
  32. unique(laml@data$Tumor_Sample_Barcode)
  33. getSampleSummary(laml)
  34. getGeneSummary(laml)
  35. getFields(laml)
  36. laml=vep.laml
  37. unique(laml@data$Tumor_Sample_Barcode)
  38. getSampleSummary(laml)
  39. getGeneSummary(laml)
  40. getFields(laml)

mafSummary

上述步骤是把拿到的 maf 文件读入 R 中,初步处理后保存成 Rdata,并且对数据进行初步了解。接下来是绘图可视化 mafSummary

  1. rm(list = ls())
  2. require(maftools)
  3. options(stringsAsFactors = F)
  4. load(file = 'laml.Rdata')
  5. laml=c(annovar.laml,gatk.laml,vep.laml)
  6. ## mafsummary
  7. anno=c('annovar','gatk','vep')
  8. for (i in 1:3) {
  9. #i = 1
  10. png(paste0('plotmafSummary_', anno[i], '.png'),res = 150,width = 1080,height = 1080)
  11. plotmafSummary(maf = laml[[i]],
  12. rmOutlier = TRUE,
  13. showBarcodes = T,
  14. textSize = 0.4,
  15. addStat = 'median',
  16. dashboard = TRUE,
  17. titvRaw = FALSE)
  18. dev.off()
  19. }

10 比较不同注释软件可视化结果 - 图1

可以看到,3 个软件的注释结果总体上非常接近的,但是还是有一些小细节不同,比如我们看一下,top30 基因的oncoplot

oncoplot

  1. ## oncoplot_top30
  2. for (i in 1:3) {
  3. #i = 1
  4. png(paste0('oncoplot_top30_', anno[i], '.png'),res = 150,width = 1080,height = 1080)
  5. oncoplot(maf = laml[[i]],
  6. top = 30,
  7. fontSize = 0.5,
  8. sampleOrder = laml[[i]]@clinical.data$Tumor_Sample_Barcode,
  9. showTumorSampleBarcodes = T)
  10. dev.off()
  11. }

10 比较不同注释软件可视化结果 - 图2

从上面的图可以看到,3 个软件注释后的可视化结果非常接近,当然也不是完全一模一样,比如说 SP140 基因,在 ANNOVAR 和 VEP 的注释结果都是排在了第 5 位,而在 GATK 的注释结果就排到了第 13 位,少了一个突变位点。

lollipopPlot

下面通过 lollipopPlot 函数来进一步比较一下:

  1. ## lollipopPlot for SP140
  2. gene='SP140'
  3. protein=c("AAChange.refGene","Protein_Change","Protein_Change")
  4. for (i in 1:3) {
  5. #i=3
  6. png(paste0(gene,'_', anno[i], '.png'),res = 150,width = 1080,height = 1080)
  7. maftools::lollipopPlot(maf = laml[[i]],
  8. gene = gene,
  9. AACol = protein[i],
  10. labelPos = 'all')
  11. dev.off()
  12. }

10 比较不同注释软件可视化结果 - 图3

可以看到 GATK 比另外两个软件的注释结果少了一个位点,且三个软件的氨基酸的坐标也不完全一致。我猜是注释到不同转录本的原因,结合 IGV 进行查看一下,果然如此,GATK 选择的转录本是 NM_001278452.1,在 IGV 中这个转录本该位点 230238870内含子,同样导致氨基酸坐标不一致也是因为注释到不同的转录本:

2019-11-13 (1)_LI.jpg

最后我们再来比较 TP53 基因的注释结果,也是因为转录本的不同导致氨基酸坐标不一致:

  1. ## lollipopPlot for TP53
  2. gene='TP53'
  3. protein=c("AAChange.refGene","Protein_Change","Protein_Change")
  4. for (i in 1:3) {
  5. #i=3
  6. png(paste0(gene,'_', anno[i], '.png'),res = 150,width = 1080,height = 1080)
  7. maftools::lollipopPlot(maf = laml[[i]],
  8. gene = gene,
  9. AACol = protein[i],
  10. labelPos = 'all')
  11. dev.off()
  12. }

10 比较不同注释软件可视化结果 - 图5

maftools 还可以绘制很多图,完成更多的分析。感兴趣的朋友可以试试。