CUT&Tag数据分析笔记(3)

这是CUT&Tag数据分析的最后一部分,这一部分基本就是进行各种的可视化了。

第七节 可视化

通常,我们感兴趣的是使用基因组浏览器在各个区域可视化染色质landscape。Integrative Genomic Viewer提供了一个易于使用的网页应用程序版本和本地桌面版本。UCSC Genome Browser提供了最全面的补充基因组信息。

(一)查看标准化的bedgraph文件

根据官网展示的染色体位置区域,我们可以使用IGV也查看一下:hg38 ,chr7:131,000,000-134,000,000

下面是我运行后得到的IGV峰图:

再看一下官网的图:

基本上是一样的。

(二)热图可视化特异区域

我们还感兴趣的是在一系列的注释位点上观察染色质特征,例如基因启动子上的组蛋白修饰信号。我们将使用deepTools的computeMatrix和plotHeatmap函数来生成热图。

首先,我们要先把bam文件sort,生成其索引,在生成bw文件:

#!/bin/bash

projPath="/gpfs/home/fangy04/cut_tag"

cat /gpfs/home/fangy04/cut_tag/filenames | while read i
do
samtools sort -o $projPath/bam_files/${i}.sorted.bam $projPath/bam_files/${i}_bowtie2.mapped.bam                               
samtools index $projPath/bam_files/${i}.sorted.bam                                                                             
bamCoverage -b $projPath/bam_files/${i}.sorted.bam -o $projPath/bigwig/${i}_raw.bw
done
(1)Heatmap over transcription units

这一步首先你要先下载hg38的基因注释文件,可以参考我之前的文章:ChIP-seq实践(非转录因子,非组蛋白)进行下载。然后运行(这一步非常非常耗时以及耗内存,我用了服务器上120G,运行了9个小时。。。):

#!/bin/bash

projPath="/gpfs/home/fangy04/cut_tag"

cores=8
computeMatrix scale-regions -S $projPath/bigwig/SH_Hs_K27m3_rep1_raw.bw \
                               $projPath/bigwig/SH_Hs_K27m3_rep2_raw.bw \
                               $projPath/bigwig/SH_Hs_K4m3_rep1_raw.bw \
                               $projPath/bigwig/SH_Hs_K4m3_rep2_raw.bw \
                              -R $projPath/data/hg38_genes.bed \ #这是我们下载的基因组注释文件,bed格式的
                              --beforeRegionStartLength 3000 \ 
                              --regionBodyLength 5000 \
                              --afterRegionStartLength 3000 \
                              --skipZeros -o $projPath/data/matrix_gene.mat.gz -p $cores

plotHeatmap -m $projPath/data/matrix_gene.mat.gz -out $projPath/data/Histone_gene.png --sortUsing sum --missingDataColor "#cc2200"

这里你可以看到上面的plotheatmap代码里,我使用了--missingDataColor "#cc2200"这个参数,是因为你要指定画图的时候,你的missing data的颜色,如果你不指定,并且在computeMatrix代码里也没有指定--missingDataAsZero,那么你画出来的图很有可能是这样的:

参考:https://www.biostars.org/p/322414/

运行完成后生成两个文件:

-rw------- 1 fangy04 fangy04   2069525 Dec 25 03:08 Histone_gene.png
-rw------- 1 fangy04 fangy04 134316380 Dec 25 03:04 matrix_gene.mat.gz
(2)在CUT&Tag peaks上的热图

我们使用从SEACR返回的信号块的中点来对齐热图中的信号。SEACR输出的第六列是一个chr:start-end形式的条目,表示该区域信号最大的第一个和最后一个碱基的位置。我们首先在第6列中生成一个包含中点信息的bed文件,并使用deeptools进行热图可视化。

#!/bin/bash

projPath="/gpfs/home/fangy04/cut_tag"
cores=12

cat /gpfs/home/fangy04/cut_tag/filenames2 | while read i
do

awk '{split($6, summit, ":"); split(summit[2], region, "-"); print summit[1]"\t"region[1]"\t"region[2]}' $projPath/peak_calling/${i}_seacr_control.peaks.stringent.bed > $projPath/peak_calling/${i}_seacr_control.peaks.summitRegion.bed

computeMatrix reference-point -S $projPath/bigwig/${i}_raw.bw \
              -R $projPath/peak_calling/${i}_seacr_control.peaks.summitRegion.bed \
              --skipZeros -o $projPath/data/${i}_SEACR.mat.gz -p $cores \
              -a 3000 -b 3000 --referencePoint center \
              --missingDataAsZero #这次我加了这个参数,因为第一次按照官网的代码没有加这个参数,画出来的热图里很多黑色的线,很难看

plotHeatmap -m $projPath/data/${i}_SEACR.mat.gz -out $projPath/data/${i}_SEACR_heatmap.png --sortUsing sum --startLabel "Peak Start" --endLabel "Peak End" --xAxisLabel "" --regionsLabel "Peaks" --samplesLabel "${i}"
done

第八节 差异分析

评估来自高通量测序分析count数据的方差-均值依赖性和基于使用负二项分布的模型的差异表达测试。

(一)创建peak x sample矩阵

通常,差异检测比较相同组蛋白修饰的两种或多种条件。在本教程中,受演示数据的限制,我们将通过比较两个重复的H3K27me3和两个重复的H3K4me3来说明差异检测。我们将使用DESeq2 (complete tutorial)作为说明。

(1)创建主要peak列表,合并每个样品的peaks
> library(GenomicRanges)
> library(magrittr)
> mPeak = GRanges()
## overlap with bam file to get count
> histL = c("SH_Hs_K27m3", "SH_Hs_K4m3")
> repL = c("rep1","rep2")
> for(hist in histL){
    for(rep in repL){
      peakRes = read.table(paste0(hist, "_", rep, "_seacr_control.peaks.stringent.bed"), header = FALSE, fill = TRUE)
      mPeak = GRanges(seqnames = peakRes$V1, IRanges(start = peakRes$V2, end = peakRes$V3), strand = "*") %>% append(mPeak, .)
    }
  }
> masterPeak = reduce(mPeak)
(2)在主要peak列表里获取每个peak的片段counts
> library(DESeq2)
# 这里官网的代码仍然是有问题的,不能直接用,需要自己加for语句
> for (hist in histL){
    for(rep in repL){
      countMat = matrix(NA, length(masterPeak), length(histL)*length(repL))
    }
  }

## overlap with bam file to get count
> library(chromVAR)
> i = 1
> for(hist in histL){
    for(rep in repL){
    
      bamFile = paste0(hist, "_", rep, "_bowtie2.mapped.bam")
      fragment_counts <- getCounts(bamFile, masterPeak, paired = TRUE, by_rg = FALSE, format = "bam")
      countMat[, i] = counts(fragment_counts)[,1]
      i = i + 1
    }
  }
> colnames(countMat) = paste(rep(histL, 2), rep(repL, each = 2), sep = "_")

(二)测序深度标准化和差异富集peaks检测

> selectR = which(rowSums(countMat) > 5) ## remove low count genes
> dataS = countMat[selectR,]
> condition = factor(rep(histL, each = length(repL)))
> dds = DESeqDataSetFromMatrix(countData = dataS,
                             colData = DataFrame(condition),
                             design = ~ condition)
> DDS = DESeq(dds)
> normDDS = counts(DDS, normalized = TRUE) ## normalization with respect to the sequencing depth
> colnames(normDDS) = paste0(colnames(normDDS), "_norm")
> res = results(DDS, independentFiltering = FALSE, altHypothesis = "greaterAbs")

> countMatDiff = cbind(dataS, normDDS, res)
> head(countMatDiff)

DataFrame with 6 rows and 14 columns
  SH_Hs_K27m3_rep1 SH_Hs_K4m3_rep1 SH_Hs_K27m3_rep2 SH_Hs_K4m3_rep2 SH_Hs_K27m3_rep1_norm SH_Hs_K4m3_rep1_norm
         <numeric>       <numeric>        <numeric>       <numeric>             <numeric>            <numeric>
1                3               4                5               4              0.748764             1.248831
2                0               0              298             198              0.000000             0.000000
3                0               1              173              91              0.000000             0.312208
4                0               0              266             206              0.000000             0.000000
5                4               3                0               2              0.998352             0.936623
6                4               2                0               1              0.998352             0.624415
  SH_Hs_K27m3_rep2_norm SH_Hs_K4m3_rep2_norm  baseMean log2FoldChange     lfcSE      stat      pvalue        padj
              <numeric>            <numeric> <numeric>      <numeric> <numeric> <numeric>   <numeric>   <numeric>
1               19.9532             11.66190   8.40317        3.97867   1.06773  3.726287 1.94321e-04 3.08812e-03
2             1189.2085            577.26424 441.61819       14.06841   1.55908  9.023519 1.82142e-19 1.31189e-17
3              690.3795            265.30831 238.99999       11.73399   1.54086  7.615238 2.63205e-14 5.63249e-13
4             1061.5083            600.58805 415.52408       13.98064   1.54744  9.034672 1.64495e-19 1.20258e-17
5                0.0000              5.83095   1.94148        1.70735   1.82556  0.935247 3.49661e-01 9.53197e-01
6                0.0000              2.91548   1.13456        1.02468   2.28264  0.448903 6.53502e-01 9.53197e-01

(1)DESeq2要求输入矩阵应该是非标准化counts或测序reads的估计counts。
(2)DESeq2模型在内部修正文库大小。
(3)countMatDiff总结了差异分析结果:
前4列:在过滤低counts的峰区域后,原始reads计数
第二个4列:消除文库大小差异的标准化reads计数。
剩余列:差示检测结果。

©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容