ExomeDepth检测CNV

ExomeDepth是一个基于HMM方法来检测全外显子CNV的软件。软件文档可在这里查看。

安装exomeDepth

exomeDepth是一个R包,在R中安装

install.packages("ExomeDepth")

下载测试数据

测试数据使用上次xhmm的数据。

wget https://statgen.bitbucket.io/xhmm/EXAMPLE_BAMS.zip
unzip EXAMPLE_BAMS.zip

这些数据是使用hs37d5参考基因组进行比对,经过了排序、去重以及GATK BQSR的标准bam文件准备流程。

ExomeDepth流程

以下均是R脚本。

导入bam及bed

bed文件需要四列,无标题

<chrom>	<start>	<end>	<name>

导入数据

library(ExomeDepth)

# 导入bed文件
bedFilePath <- "/path/to/EXOME.bed"
bedFile <- read.table(bedFilePath, head=FALSE)
names(bedFile) <- c("chromosome", "start", "end", "name")
bedFile <- as.data.frame(bedFile)

# 导入bam文件
bamFilePath <- "/path/to/bam/"
bamFile <- list.files(bamFilePath, pattern="*.bam$")
bamFile <- file.path(bamFilePath, bamFile)

# 输出文件夹
outputPath <- "/path/to/output/"
if(!(dir.exists(outputPath))) {
    dir.create(outputPath)
}

获得counts

对bam获得bed中每个区域的read counts。

my.counts <- getBamCounts(bed.frame=bedFile,
    bam.files=bamFile,
    include.chr=FALSE
)
my.counts.dafr <- as(my.counts, "data.frame")
exomeCount.mat <- as.matrix(my.counts.dafr[, grep(names(my.counts.dafr), pattern="*.bam")])

注释

可以使用这一步加入注释,但是我后续运行时报错了,因此没有加入

data(exons.hg19)
genes.GRanges.hg19 <- GenomicRanges::GRanges(
    seqnames=exons.hg19$chromosome,
    IRanges::IRanges(start=exons.hg19$start, end=exons.hg19$end),
    names=exons.hg19$name
)

同样的,加入常见CNV注释,后续执行也报错了

data(Conrad.hg19)

循环执行

循环执行即每次挑出一个样本作为case,其余样本作为control,获得每个样本的结果。下面代码中使用AnnotateExtra注释时,报错。但是还可以自行注释,因此影响不大。循环执行的方式适合于在同一批次的数据中找CNV。如果是单样本的方式,则调整下面脚本,固定reference和choice即可。分析获得的结果与上次的xhmm结果相比,多了一个缺失。不过看了下支持reads数只有15条,因此可以排除,实际结果是相同的。

nSamples <- ncol(exomeCount.mat)
for (i in 1:nSamples) {
    my.choice <- select.reference.set(
        test.counts=exomeCount.mat[, i],
        reference.counts=exomeCount.mat[, -i],
        bin.length=(my.counts.dafr$end - my.counts.dafr$start)/1000, n.bins.reduced=10000
    )
    my.reference.selected <- apply(X=exomeCount.mat[, my.choice$reference.choice, drop=FALSE], MAR=1, FUN=sum)
    all.exons <- new("ExomeDepth", test=exomeCount.mat[, i],
        reference=my.reference.selected,
        formula="cbind(test, reference) ~ 1"
    )
    all.exons <- CallCNVs(x=all.exons,
        transition.probability=10^-4,
        chromosome=my.counts.dafr$chromosome,
        start=my.counts.dafr$start,
        end=my.counts.dafr$end,
        name=my.counts.dafr$exon
    )
    # all.exons <- AnnotateExtra(x=all.exons, reference.annotation=Conrad.hg19.common.CNVs,
    #     min.overlap=0.5, column.name="Conrad.hg19"
    # )
    # all.exons <- AnnotateExtra(x=all.exons, reference.annotation=genes.GRanges.hg19,
    #     min.overlap=0.0001, column.name="exons.hg19"
    # )
    output.file <- paste(outputPath, "/", colnames(exomeCount.mat)[i], ".txt", sep="")
    write.table(file=output.file, x=all.exons@CNV.calls, row.names=FALSE, quote=FALSE, sep="\t")
}

docker

建立了一个docker镜像

docker pull pzweuj/exomedepth:1.1.15

使用命令

docker run --rm -it -v /outsidePath:/insidePath pzweuj/exomedepth:1.1.15 exomeDepthPipe.R -i <bam dir> -o <output dir> -b <bed file>