ERCC与housekeeping的作用
1.1 spike-in 的组成及原理
原理:RNA-seq 的本质是相对定量,并非绝对定量。这是因为测序测到的部分为 cDNA
文库的一部分,所以测到的部分相当于是文库中抽取的一部分,属于抽样测序,
而我们认为抽样测序的比例是一定的。
目前对 RNA-seq 定量的 spike-in 主要可以用 ERCC 进行,并认为 ERCC 在各个样
本间的表达量不变。关于 ERCC 具体的实验原理可参考文献《The External RNA
controls Consortium: a progress report,Nature method,2005》。基本原理是
利用外源的 RNA 序列,在建库的时候加入这些外源的 RNA 序列,做下游分析的时
候就可以将 spike-in 的绝对量定量出来。这里的基本假设一定是每个 sample
之间的 spike-in 的含量一致。
分析流程:利用spike-in进行RNA-seq的上游分析与普通RNA-seq类似,只不过需要在ERCC
上下载相应的 ERCC fasta 和 ERCC gtf 文件,并且将这两个文件分别合并到参考
基 因 组 和 注 释 文 件 里 面 。 具 体 的 操 作 可 以 参 照 :
https://github.com/broadinstitute/gtex-pipeline/blob/master/TOPMed_RNAseq_pipeline.md
当我们得到 count 文件,进行下游分析时,需要利用 spike-in 进行校正,目前
比较流行的R包是RUVseq,
链接地址:http://www.bioconductor.org/packages/release/bioc/html/RUVSeq.html
它的基本原理是假设每个 sample 的 spike-in 表达量都是一致的,RUVseq 包根
据这个建立线性模型,矫正数据。那么经过 RUVseq 包矫正以后就不需要其他
normalization 的方法进行矫正了,矫正后的 count data 直接利用 edgeR 或者DESeq2 进行下游分析。
难点:该方法需要在建库的时候加入 ERCC,而 ERCC 试剂盒很昂贵,售价大概是 2W RMB,目前相关文献我很少见到有用 spike-in 矫正的数据,如果有还请大家和我分享
一下。
1.2 Housekeeping 基因矫正
原理:类似于 spike-in,我们认为每个 sample 里面的 Housekeeping 基因是恒定不变
的,通过这些不变的基因来对我们的数据进行矫正。不同的物种 Housekeeping
基 因 是 不 同 的 , 目 前 这 里 有 一 篇 文 献 可 以 分 享 《 Human Housekeeping
genes,revisited,cell》,上面列举了 3000 多种 Housekeeping genes,关于斑
马鱼或者果蝇的 Housekeeping genes 可以通过查阅文献获取。
分析流程:与 spike-in 一致,用的是 R 包是 RUVseq,建立线性模型进行矫正,同样的,利
用 R 包 RUVseq 矫正后的 data 不需要用其他 normalization 的方法进行矫正了,
矫正后的 count data 直接利用 edgeR 或者 DESeq2 进行下游分析。这种方法不需
要额外的购买试剂盒,只需要在 count table 里面选出 Housekeeping 基因进行
矫正即可。
总结:无论是 spike-in 还是 Housekeeping 基因进行矫正,它们的本质都是一样的。
在利用 R 包 RUVseq 矫正时,spike-in 方法提取的是 ERCC 相关序列(基因)的
表 达 数 据 , 用 它 作 为 基 准 做 矫 正 。 而 Housekeeping 基 因 方 法 则 是 用
Housekeeping 基因的表达数据作为基准做矫正。
RUVg的简单理解
RUVSeq的官方说明文档:RUVSeq
可参照《Normalization of RNA-seq data using factor analysis of control genes or samples》文章中所叙述的RUVg原理,简单理解为:
假设y为基因矫正前的表达矩阵,w为矫正后的表达矩阵,α是实验设计的影响因素;x为潜在变量影响的部分,β为潜在因素(随机因素);而后两行为ERCC的基因表达count矩阵,而我们要扣除的是 βx 的部分,得到矫正后的表达矩阵
RUVg源代码分析
这一块主要参考Removing Unwanted Variation from High Dimensional Data with
Negative Controls和RUVg的源代码
RUV-2的理论部分
其中:
- 合并后的表达矩阵即为Y,m代表m个sample,来自不同批次或者实验条件,n代表n个基因
- X表示的是观测矩阵,m代表m个sample,p代表p个影响因子(这个因子来自你的实验设计)
- Z代表已知的协变量矩阵,m代表m个sample,q代表q个已知的协变量
- W代表未知的协变量矩阵(多为随机因素影响),m代表m个sample,k代表k个未知的协变量
- β为p行n列的系数矩阵;γ为q行n列的系数矩阵;α为k行n列的系数矩阵
- ε 代表高斯白噪声
下图是Y矩阵构造,m指代sample,只不过是来自不同批次的sample
X矩阵的列为实验设计所带来的影响因素(可理解为设计矩阵)
当我们只考虑不同矩阵合并后ERCC的表达量时,假设方程模型为:
其中:
- Yc代表ERCC的表达矩阵
- βc为p行c列的系数矩阵;γc为q行c列的系数矩阵;αc为k行c列的系数矩阵,c代表ERCC基因数量
当 βc = 0 (即实验设计条件不影响ERCC表达量)时,这就变成了标准的因子分析,此时的αc为公共因子(此时因理解为影响ERCC表达量差异的因素);W为因子载荷矩阵,主要衡量各个公共因子的贡献
因此可以通过SVD的方法计算出W矩阵,那么已知 X矩阵 以及 W矩阵 就可以根据OLS计算回归系数 β (可以参考多元线性回归回归系数的求解公式):
那么 correctedY = Xβ 即为所求矫正后的表达矩阵(correctedY为矫正后的表达矩阵)
代码部分
我们看一下源代码:
drop = 0
#filtered为标准的基因表达矩阵,Y相对于做了次转置
Y <- t(log(filtered+1))
Ycenter <- apply(Y, 2, function(x) scale(x, center = TRUE, scale=FALSE))
m <- nrow(Y)
n <- ncol(Y)
#提取ERCC的基因count,并进行svd分解
svdWa <- svd(Ycenter[, spikes])
#选取潜在影响的因素
first <- 1 + drop
k <- min(1, max(which(svdWa$d > 1e-8)))
#对svd的u矩阵进行特征向量的提取,得到因子载荷矩阵 W
W <- svdWa$u[, (first:k), drop = FALSE]
#求解因子载荷矩阵的回归系数 α,可参照混合线性模型的求解公式
alpha <- solve(t(W) %*% W) %*% t(W) %*% Y #solve求逆矩阵
##Y矩阵减去潜在影响的那一部分,Y矩阵为矫正前的经过转置后的表达矩阵
correctedY <- Y - W %*% alpha
// W %*% alpha 代表 W×α 这一部分,这一部分对应下图公式中协变量的影响
#恢复log前的值并取整,去掉负数
correctedY <- round(exp(correctedY) - 1e-8)
correctedY[correctedY<0] <- 0
那么RUVg采用的是线性混合模型,因此我们要估计的回归参数有三个,分别是固定效应回归系数β,随机效应回归系数α和随机误差项ε,所有此时应该采用**广义最小二乘法进行参数估计,如上面代码所示,我们要求出 Xβ 这一部分,需要用 y - W×α 得到矫正后的矩阵,即:
correctedY <- Y - W %*% alpha
其中:Xβ 这一部分被认为是只受实验设计所影响,而不受其他因素所影响,且ERCC表达量在各个sample中基本恒定,影响ERCC表达的因子矩阵 W 同样也会影响整个表达矩阵,因此仅提取ERCC求解的 W 矩阵也会影响整个表达矩阵,即 W对αc影响可放大为W对α的影响
怎么求解α这个参数呢?由于我们研究对象是估计α这个参数,因此我们的操作均是针对W矩阵,因此根据线性混合模型系数求解公式(参照《高级医学统计学》):
其中V矩阵为Y的协方差矩阵,当表达谱 Y矩阵 满足多维标准正态分布时,它的协方差矩阵为单位矩阵
小tips
(1). 矫正矩阵的求解
代码部分没有直接求解回归系数β,而是先求解W矩阵(因子载荷矩阵),再根据W矩阵求解公共因子矩阵 α,构造出W×α这一项,然后用你原始矩阵Y减去W×α这一项,反过来得到 correctedY = Xβ 这一项
(2). ERCC的SVD分解的意义
而对提取出来的ERCC count矩阵进行svd分解的意义是寻找到潜在的影响因子,如果取值k=1,drop=0那么就相当于只定义一个协变量,该协变量潜在影响了各个sample中ERCC的表达,使其在各个样本间出现较大的波动
而影响ERCC表达的因子矩阵 W 同样也会影响整个表达矩阵,因此仅提取ERCC求解的 W 矩阵也会影响整个表达矩阵,即 W对αc影响可放大为W对α的影响
这个该怎么理解呢?我们注意到W矩阵是m×k的矩阵,而αc矩阵是k×c(c为ERCC的基因数目)的矩阵,α矩阵是k×n的矩阵,W矩阵的列与αc,α矩阵的行是一样的
那么W矩阵乘αc,则代表随机因素W对ERCC表达矩阵的影响;W矩阵乘α,则代表随机因素W对全部基因表达矩阵的影响
(3). 回归系数alpha的求解
至于参数 alpha 的求解,其实是对下面的方程进行α的OLS分析
α的OLS分析其实是对α求偏导(对α求偏导实际上与β就无关了),使得离均差最小,从而求得相应的系数,因此结合混合线性模型求回归系数的公式,α等于:
alpha <- solve(t(W) %*% W) %*% t(W) %*% Y
但是在代码中这里的系数求解少了V矩阵,这是因为作者假设 Y矩阵 是满足于多维标准正态分布的,所以在求解时相当于乘了一个单位矩阵(代码中省略)
svd原理可参照:
Using control genes to correct for unwanted variation in microarray data
Removing Unwanted Variation from High Dimensional Data with
Negative Controls
《高级医学统计学 万崇华》