我的ChIP-Seq(4):MAnorm差异分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的ChIP-Seq(4):MAnorm差异分析相关的知识,希望对你有一定的参考价值。

参考技术A

哈哈,搜了一圈没发现网上有关于MAnorm的中文教程或者是说明,本文将是第一篇~撒花✿✿ヽ(°▽°)ノ✿那就要用心写了,感到鸭梨.jpg==

首先,MAnorm是什么,可以做什么呢?
简单地说,这是一款寻找两个ChIP-Seq样本之间差异peak的软件。一般ChIP的流程中,若是单一处理的细胞系,那么callpeak之后可能会做binding motif的分析或是peak相关gene的功能分析等;但若是两种处理的细胞系(比如饥饿组和对照组),我们肯定想要知道两种处理下,组蛋白修饰的差异,类似于RNA-Seq中差异表达基因的分析,所以这时就需要进行差异分析。MAnorm就可以实现这样的分析需要。

一般来说,上述差异分析不一定要在peaks水平进行,完全可以在reads水平,这个就叫做“一步法”;而通过先分别callpeak再比较peaks的density或者depth等,就是所谓的“两步法”。不同方法有不同类型的软件可供选择,这就是ChIP分析成熟的地方,不过技术流大可根据自己的目的写脚本进行个性化处理,这个暂且不表。

那么差异分析软件如何选择呢?根据组蛋白修饰类型、样品是否有重复、是否需要callpeak(即predefined region set),下图一目了然:

我的样品有宽峰窄峰两种修饰、无重复,项目时间紧张尽量想用一个软件实现,所以选择了MAnorm。

话不多说,直接看图:

1.1.4版本
conda/PyPi
需要注意的是,此版本只支持bed格式且不支持paired-end模式,会把所有reads当成single-end处理。若reads文件想用支持更多的格式(sam/bam/bedpe等),请用v1.2.0。
1.2.0版本
暂时只能从Github复制源码进行安装。方法:

建议首先阅读使用说明,最好从linux中 manorm --help ,或者在Github中找到相应版本的 附带说明 ,这一点很重要,因为有时网上搜到的说明和你实际用的版本不一致,会走弯路,不要问我咋知道的。
所以要准备的文件有4个:

将如上文件移动至新文件夹下待用。***tips:这里不再需要对照组In的文件了

基本命令(--p1 --p2 --r1 --r2 -o是5个必需参数,注意是两个-):

建议试运行一组数据先,根据报错文件调整格式。软件还不太成熟,需要多调整格式。

运行约10min,产生4个结果文件:
sample1peaks_vs_sample2peaks_all_MAvalues.xls :这个是主要的结果文件,Excel格式,里面的peak_group有标注是common/1unique/2unique的。
output_figures 文件夹 :4个图,计算的Mvalue Avalue(MA)及校正之后的MA,大概就是这个意思,还需要读文献琢磨
output_filters 文件夹 :3个peaks.bed文件,可能就是条件严格了点之后的结果,两个biased包括的peaks很少,一个unbiased包括的peaks很多跟all那个文件差不了多少。
output_tracks 文件夹 :3个wig文件,是M A values的,UCSC可视的文件类型。

综上,决定用main output file即第一个结果,进行后面的分析。

转录组入门(7):差异表达分析

参考技术A

原先三个样本的HTSeq-count计数的数据可以在我的GitHub中找到,但是前面已经说过Jimmy失误让我们分析的人类就只有3个样本, 另外一个样本需要从另一批数据获取(请注意batch effect),所以不能保证每一组都有两个重复。

我一直坚信”你并不孤独“这几个字,遇到这种情况的人肯定不止我一个,于是我找到了几种解决方法

以上方法都会在后续进行介绍,但是我们DESeq2必须得要有重复的问题亟待解决,没办法我只能自己瞎编了。虽然是编,我们也要有模有样,不能直接复制一份,要考虑到高通量测序的read是默认符合泊松分布的。我是这样编的。

这仅仅是一种填坑的方法而已,更好模拟数据的方法需要参阅更加专业的文献, 有生之年 我希望能补上这一个部分。

这部分内容最先在 RNA-Seq Data Analysis 的8.5.3节看到,刚开始一点都不理解,但是学完生物统计之后,我认为这是理解所有差异基因表达分析R包的关键。

基本上,统计课都会介绍如何使用 t检验 用来比较两个样本之间的差异,然后在样本比较多的时候使用 方差分析 确定样本间是否有差异。当然前是样本来自于正态分布的群体,或者随机独立大量抽样。

对于基因芯片的差异表达分析而言,由于普遍认为其数据是服从正态分布,因此差异表达分析无非就是用t检验和或者方差分析应用到每一个基因上。高通量一次性找的基因多,于是就需要对多重试验进行矫正,控制假阳性。目前在基因芯片的分析用的最多的就是 limma

但是 ,高通量测序(HTS)的read count普遍认为是服从泊松分布(当然有其他不同意见),不可能直接用正态分布的 t检验 方差分析 。 当然我们可以简单粗暴的使用对于的 非参数检验 的方法,但是统计力不够,结果的p值矫正之估计一个差异基因都找不到。老板花了一大笔钱,结果却说没有差异基因,是个负结果,于是好几千经费打了水漂,他肯定是不乐意的。因此,还是得要用参数检验的方法,于是就要说到方差分析和线性模型之间的关系了。

线性回归和方差分析是同一时期发展出的两套方法。在我本科阶段的田间统计学课程中就介绍用 方差分析 (ANOVA)分析不同肥料处理后的产量差异,实验设计如下

这是最简单的单因素方差分析,每一个结果都可以看成 yij = ai + u + eij, 其中u是总体均值,ai是每一个处理的差异,eij是随机误差。

:方差分析(Analysis of Variance, ANAOVA)名字听起来好像是检验方差,但其实是为了判断样本之间的差异是否真实存在,为此需要证明不同处理内的方差显著性大于不同处理间的方差。

线性回归 一般是用于量化的预测变量来预测量化的响应变量。比如说体重与身高的关系建模:

当然线性回归也可用处理名义型或有序型因子(也就是离散变量)作为预测变量,如果要画图的话,就是下面这个情况。

如果我们需要通过一个实验找到不同处理后对照组和控制组的基因变化,那么基因表达可以简单写成, y = a + b · treament + e。 和之前的 yij = ai + u + eij 相比,你会发现公式是如此的一致。 这是因为线性模型和方差分析都是 广义线性模型 (generalizing linear models, GLM)在正态分布的预测变量的特殊形式。而GLM本身只要采用合适的 连接函数 是可以处理对任意类型的变量进行建模的。

目前认为read count之间的差异是符合负二项分布,也叫gamma-Possion分布。那么问题来了,如何用GLM或者LM分析两个处理件的差异呢?其实可以简单的用上图的拟合直线的斜率来解释,如果不同处理之间存在差异,那么这个拟合线的斜率必定不为零,也就是与X轴平行。但是这是一种便于理解的方式(虽然你也未必能理解),实际更加复杂,考虑因素更多。

注1 负二向分布有两个参数,均值(mean)和离散值(dispersion). 离散值描述方差偏离均值的程度。泊松分布可以认为是负二向分布的离散值为1,也就是均值等于方差(mean=variance)的情况。
注2 这部分涉及大量的统计学知识,不懂就用维基百科一个个查清楚。

聊完了线性模型和方差分析,下面的设计矩阵(design matrix)就很好理解了, 其实就是用来告诉不同的差异分析函数应该如何对待变量。比如说我们要研究的KD和control之间变化,设计矩阵就是

那么比较矩阵(contrast matrix)就是告诉差异分析函数应该如何对哪个因素进行比较, 这里就是比较不同处理下表达量的变化。

其实read count如何标准化的方法有很多,最常用的是FPKM和RPKM,虽然它们其实是错的-- FPKM/RPKM是错的 。

我推荐阅读 Comparing the normalization methods for the differential analysis of Illumina high-throughput RNA-Seq data , 了解不同标准化方法之间的差异。

有一些方法是要求原始数据,有一些则要求经过某类标准化后的数据,记得区分。

关于DESeq2分析差异表达基因,其实在 https://www.bioconductor.org/help/workflows/rnaseqGene/ 里面介绍的非常清楚了。

我们已经准备好了count matrix,接下来就是把数据导入DESeq2。DESeq2导入数据的方式有如下4种,基本覆盖了主流read count软件的结果。
DESeq2要求的数据是raw count, 没必要进行FPKM/TPM/RPFKM/TMM标准化。

本来我们是可以用DESeq2为htseq-count专门提供的 DESeqDataSetFromHTSeq ,然而很尴尬数据不够要自己凑数,所以只能改用 DESeqDataSetFromMatrix 了 :cold_sweat:

导入数据,构建 DESeq2 所需的 DESeqDataSet 对象

: 这一步到下一步之间可以过滤掉一些low count数据,节省内存,提高运行速度

使用 DESeq 进行差异表达分析: DESeq 包含三步,estimation of size factors(estimateSizeFactors), estimation of dispersion(estimateDispersons), Negative Binomial GLM fitting and Wald statistics(nbinomWaldTest),可以分布运行,也可用一步到位,最后返回 results 可用的DESeqDataSet对象。

用results获取结果: results的参数非常的多,这里不好具体展开 :pensive: 但是你们会自己看的吧

我们可用mcols查看每一项结果的具体含义,比如说 log2FoldChange 表示倍数变化取log2结果,还能画个火山图。一般简单粗暴的用2到3倍作为阈值,但是对于低表达的基因,3倍也是噪音,那些高表达的基因,1.1倍都是生物学显著了。更重要的没有考虑到组内变异,没有统计学意义。 padj 就是用BH对多重试验进行矫正。

用summary看描述性的结果,大致是上调的基因占总体的11%,下调的是7.1%(KD vs control)

画个MA图,还能标注p值最小的基因。

下图是没有经过 statistical moderation平缓log2 fold changes的情况

如果经过 lfcShrink 收缩log2 fold change, 结果会好看很多

当然还有火山图,不过留给其他方法作图,我们先把差异表达的基因找出来。

一般p value 小于0.05就是显著了, 显著性不代表结果正确,只用于给后续的富集分析和GSEA提供排序标准和筛选而已。关于P值的吐槽简直无数, 请多注意。

edgeR在函数说明中称其不但可以分析SAGE, CAGE的RNA-Seq,Tag-RNA,或RNA-seq, 也能分析ChIP-Seq和CRISPR得到的read counts数据。嗯,我信了:confused:!

edgeR使用 DGEList 函数读取count matrix数据,也就说你需要提供一个现成的matrix数据,而不是指望它能读取单独的文件,然后进行合并(当然机智的我发现,其实可以用 tximport 或 DESeqDataSetFromHTSeq 读取单独的文件,然后传递给 DGEList )

第一步: 构建DGEList对象

第二步: 过滤 low counts数据。与DESeq2的预过滤不同,DESeq2的预过滤只是为了改善后续运算性能,在运行过程中依旧会自动处理low count数据,edgeR需要在分析前就要排除那些low count数据,而且非常严格。从生物学角度,有生物学意义的基因的表达量必须高于某一个阈值。从统计学角度上, low count的数据不太可能有显著性差异,而且在多重试验矫正阶段还会拖后腿。 综上所诉,放心大胆的过滤吧。

根据经验(又是经验 :dog: ), 基因至少在某一些文库的count超过10 ~ 15 才被认为是表达。这一步全靠尝试, 剔除太多就缓缓,剔除太少就严格点。 我们可以简单的对每个基因的raw count进行比较,但是建议用CPM(count-per-million) 标准化 后再比较,避免了 文库大小 的影响。

这里的0.5(即阈值)等于 10/(最小的文库的 read count数 /1000000),keep.lib.size=FALSE表示重新计算文库大小。

第三步: 根据组成偏好(composition bias)标准化。edgeR的 calcNormFactors 函数使用 TMM算法 对DGEList标准化

大部分的mRNA-Seq数据分析用TMM标准化就行了,但是也有例外,比如说single-cell RNA-Seq(Lun, Bach, and Marioni 2016), 还有就是global differential expression, 基因组一半以上的基因都是差异表达的,请尽力避免,(D. Wu et al. 2013), 不然就需要用到内参进行标准化了(Risso et al. 2014).

第四步: 实验设计矩阵(Design matrix), 类似于DESeq2中的design参数。 edgeR的线性模型和差异表达分析需要定义一个实验设计矩阵。很直白的就能发现是1vs0

第五步: 估计离散值(Dispersion)。前面已经提到负二项分布(negative binomial,NB)需要均值和离散值两个参数。edgeR对每个基因都估测一个经验贝叶斯稳健离散值(mpirical Bayes moderated dispersion),还有一个公共离散值(common dispersion,所有基因的经验贝叶斯稳健离散值的均值)以及一个趋势离散值

还可以进一步通过quasi-likelihood (QL)拟合NB模型,用于解释生物学和技术性导致的基因特异性变异 (Lund et al. 2012; Lun, Chen, and Smyth 2016).

注1 估计离散值这个步骤其实有许多 estimate*Disp 函数。当不存在实验设计矩阵(design matrix)的时候, estimateDisp 等价于 estimateCommonDisp 和 estimateTagwiseDisp 。而当给定实验设计矩阵(design matrix)时, estimateDisp 等价于 estimateGLMCommonDisp , estimateGLMTrendedDisp 和 estimateGLMTagwiseDisp 。 其中tag与gene同义。

注2 其实这里的第三, 四, 五步对应的就是DESeq2的 DESeq 包含的2步,标准化和离散值估测。

第六步: 差异表达检验(1)。这一步主要构建比较矩阵,类似于DESeq2中的 results 函数的 contrast 参数。

这里用的是 glmQLFTest 而不是 glmLRT 是因为前面用了glmQLTFit进行拟合,所以需要用QL F-test进行检验。如果前面用的是 glmFit ,那么对应的就是 glmLRT . 作者称QL F-test更加严格。多重试验矫正用的也是BH方法。

后续就是提取显著性差异的基因用作下游分析,做一些图看看

第六步:差异表达检验(2)。上面找到的显著性差异的基因,没有考虑效应值,也就是具体变化了多少倍。我们也可用找表达量变化比较大的基因,对应的函数是 glmTreat 。

经过上面两个方法的洗礼,基本上套路你也就知道了,我先简单小结一下,然后继续介绍limma包的 voom 。

Limma原先用于处理基因表达芯片数据,可是说是这个领域的老大 :sunglasses: 。如果你仔细看edgeR导入界面,你就会发现,edgeR有一部分功能依赖于limma包。Limma采用经验贝叶斯模型( Empirical Bayesian model)让结果更稳健。

在处理RNA-Seq数据时,raw read count先被转成log2-counts-per-million (logCPM),然后对mean-variance关系建模。建模有两种方法:

数据预处理 : Limma使用edgeR的DGEList对象,并且过滤方法都是一致的,对应edgeR的第一步,第二步, 第三步

差异表达分析 : 使用”limma-trend“

差异表达分析 : 使用”limma-voom“

如果分析基因芯片数据,必须好好读懂LIMMA包。

基本上每一个包,我都提取了各种的显著性基因,比较就需要用韦恩图了,但是我偏不 :stuck_out_tongue: 我要用UpSetR.

感觉limma的结果有点奇怪,有生之年在折腾吧。

好吧,这部分我鸽了

[1] Comparing the normalization methods for the differential analysis of Illumina high-throughput RNA-Seq data

[2] https://www.bioconductor.org/help/workflows/rnaseqGene/

[3] https://www.bioconductor.org/help/workflows/RnaSeqGeneEdgeRQL/

[4] https://www.bioconductor.org/help/workflows/RNAseq123/

以上是关于我的ChIP-Seq(4):MAnorm差异分析的主要内容,如果未能解决你的问题,请参考以下文章

DESeq2差异分析

ChIP-Seq数据挖掘系列-5.2: ngs.plot 画图工具ngs.plot.r 和 replot.r 参数详解

edgeR之配对检验分析差异基因的使用教程

ChIP-Seq数据挖掘系列-2: Motif 分析(2) - HOMER Motif 分析基本步骤

NGS基础 - 高通量测序原理

chip-seq生信笔记