对于芯片数据而言,在分析之前,需要先进行背景校正background correct。所谓背景校正,其本质上都是一个减法,将总体信号看做由探针特异性的结合信号(真实信号)和非特异性结合(噪声信号)两部分组成,背景校正的工作就是从总体信号中减去噪声信号,从而得到真实信号。
具体到应用层面,有多种算法可供选择,在limma包中,通过backgroundCorrect函数提供了各种算法的接口,具体如下
1. substract
将E看做总体信号,将Eb看做背景信号,substract算法如下
直接用总体信号减去背景信号
2. half
half 算法如下
substract算法校正后的intensity可能为负数,为了避免负值的问题,half算法设置了一个阈值0.5, 当校正后的intensity小于0.5时,直接用0.5作为校正后的intensity。
3. minimum
minimum算法如下
E <- E - Ebfor (slide in 1:ncol(E)) {
i <- E[, slide] < 1e-18
if (any(i, na.rm = TRUE)) {
m <- min(E[!i, slide], na.rm = TRUE)
E[i, slide] <- m/2
}
}
和half算法类似,也是为了避免负值问题,对于校正后的每一列,以1e-18作为阈值,小于该阈值的intensity替换为这一列大于该阈值的最小intensity的1/2。
4. movingmin
movingmin算法如下
5. edwards
edwards算法如下
one <- matrix(1, nrow(E), 1)delta.vec <- function(d, f = 0.1) {
quantile(d, mean(d < 1e-16, na.rm = TRUE) * (1 +
f), na.rm = TRUE)
}
sub <- E - Eb
delta <- one %*% apply(sub, 2, delta.vec)
E <- ifelse(sub < delta, delta * exp(1 - (Eb + delta)/E), sub)
和half算法类似,也是为了避免负值问题,不同点在于使用一个函数来设置最小intensity。
6. normexp
normexp算法如下
for (j in 1:ncol(E)) {
if (verbose) cat("Array", j)
x <- E[, j]
out <- normexp.fit(x, method = normexp.method)
E[, j] <- normexp.signal(out$par, x)
if (verbose) cat(" corrected\n")
}
})
可以通过官方自带的示例来看下normexp算法的效果
> x <- c(2,3,1,10,3,20,5,6)> out <- normexp.fit(x)
> normexp.signal(out$par, x=x)
[1] 1.000000e+00 2.000000e+00 4.930469e-07 9.000000e+00 2.000000e+00
[6] 1.900000e+01 4.000000e+00 5.000000e+00
如果对于算法的细节和效果感兴趣,可以详细阅读以下文献
>https://academic.oup.com/bioinformatics/article/23/20/2700/230165
在该文献中,推荐使用normexp算法来处理绝大多数的双通道芯片。
·end·
一个只分享干货的
生信公众号