标准化
标准化的原因
芯片实验中存在大量干扰因素,标准化可以削弱这些干扰因素,使得实验条件下的测量可以相互比较。
常见干扰因素:芯片杂交的RNA总量不一致、芯片表面不平整、探针非特异性结合、杂交条件不一致。
注意,limma包的说明里面提供了两点建议。一,如果要进行探针过滤(filter),最好在进行标准化之后再过滤。二,如果要在后续分析中使用limma包,请不要进行基于方差(variance)的过滤,否则会影响方差分布,从而导致limma包处理产生糟糕的结果(poor results)。
标准化的方法
芯片数据的标准化可以分为四个步骤:
1、background correction
移除非特异结合等背景噪音,有助于检出较低丰度下的倍数差异检出
2、normalization
消除测量间的非实验误差,使得实验条件下的测量可以相互比较。
3、pm correction
对pm探针的荧光值进行修正
4、summarization
将前面得到的荧光强度值从探针水平汇总到探针组水平
下面提供三类常见的标准化方法。
1 使用expresso进行标准化
affy包提供了expresso函数进行标准化,用户可以自定义每一步使用的方法。oligo读取的数据也可以用expresso函数进行标准化。expresso函数提供的标准化方法如下。
> bgcorrect.methods()
[1] "bg.correct" "mas""none" "rma"
> normalize.methods(CLLbatch)
[1] "constant" "contrasts" "invariantset" "loess" "methods""qspline"
[7] "quantiles" "quantiles.robust" "quantiles.probeset" "scaling"
> pmcorrect.methods()
[1] "mas""methods""pmonly" "subtractmm"
> express.summary.stat.methods()
[1] "avgdiff" "liwong" "mas" "medianpolish" "playerout"
用法举例。
library(affy)
library(affydata)
data(Dilution)
eset <- expresso(Dilution,bgcorrect.method="rma",
normalize.method="quantiles",
pmcorrect.method="pmonly",
summary.method="medianpolish")
以上代码等价于使用rma函数。
affy包提供了expresso函数,可以用于自己组合不同的处理方法对数据进行标准化。但一般不建议这么做,因为许多处理方法不能整合到一起。建议使用一体化的标准化处理函数,如rma()
。
比如说,rma background correction 只用到了PM探针,因此PM correction只能选择pmonly;mas和medianpolish汇总方法会对数据进行log变换,因此不用和产生负值的步骤一起使用,比如说subtractmm pm correction。
2 使用threestep进行标准化
affyPLM包提供了threestep函数进行芯片数据标准化操作。
threestep函数提供的标准化方法分为三类,分别是background/signal adjustment, normalization 和 summarization。
注意,threestep 第一步进行的不是background correction而是background adjustment,注意与affy包的expresso函数进行区分。
threestep函数提供的标准化方法如下。
用法举例。
library(affyPLM)
library(affydata)
data(Dilution)
eset <- threestep(Dilution)
这样会使用RMA方法进行标准化。
eset <- threestep(Dilution, background.method = "MASIM",
normalize.method="quantile",summary.method="tukey.biweight")
这样就能使用自定义的方式进行标准化了。
注意,threestep函数返回值是经过log2变换的!
3 使用一体化函数进行标准化
使用整合好的一体化函数对数据进行标准化是最常见的方式,常用的一体化函数有rma,gcrma和mas5.
rma(Robust Multiarray Average)算法是最常用的算法之一,等价于
expresso(data,bgcorrect.method="rma",normalize.method="quantiles",pmcorrect.method="pmonly",summary.method="medianpolish")
其中normalize.method使用的quantiles方法,无需假设任何参数,因此适用于质量不好的芯片,如Agilent的芯片。affy包整合了rma函数,可以直接使用rma函数进行标准化。
使用代码如下。
library(affy)
eset <- rma(data)
注意,rma算法返回值经过log2变换。
mas5是affy包整合的另一个一体化函数。整合了expresso函数和affy.scalevalue.exprSet,等价于
affy.scalevalue.exprSet(expresso(data,bgcorrect.method="mas",normalize.method=FALSE,pmcorrect.method="mas",summary.method="mas" ))
注意,mas5算法在最后一步才进行normalize,而且输出的数据并没有经过log2变换,而大多数的后续分析都要求数据进行log2变换。
使用代码如下。
library(affy)
eset <- mas5(data)
gcrma算法是rma算法的改进版本。由于rma算法的pm correction只用到了PM探针而不考虑MM探针,因此可能导致探针表达值虚高。gcrma引入了探针亲和的信息,对探针信号进行修正。用户可以自定义探针亲和信息,也可以使用默认的hgu95芯片的探针亲和信息。
使用代码如下。
library(affy)
library(gcrma)
eset <- gcrma(data)
注意,由于gcrma算法使用了MM探针的信息,因此不适用于没有MM探针的affy芯片,如Affymetrix Human Gene 1.0 ST Array。因此适用范围比rma算法窄。和rma算法一样,gcrma算法的返回值经过log2变换。
总的来说,没有必要的话尽量不要使用expresso函数和threestep函数,可能出现问题。尽量使用整合好的一体化函数。如果可以的话,可以对不同的算法效果进行比较,选择最好的算法。affycomp包是专门比较不同算法效果定位,但很多时候没必要这么做。
下面是比较不同算法效果的一个例子。大家如果有需要可以把数据换成自己的数据。
library(affy)
library(gcrma)
library(affyPLM)
library(RColorBrewer)
library(CLL)
data("CLLbatch")
colors <- brewer.pal(12, "Set3")
# use MAS5
CLLmas5 <- mas5(CLLbatch)
# use rma
CLLrma <- rma(CLLbatch)
# use gcrma
CLLgcrma <- gcrma(CLLbatch)
## hist plot
hist(CLLbatch, main="orignal", col=colors)
legend("topright", rownames(pData(CLLbatch)), col=colors,
lwd=1, inset=0.05, cex=0.5, ncol=3)
hist(CLLmas5, main="MAS 5.0", xlim=c(-150,2^10), col=colors)
hist(CLLrma, main="RMA", col=colors)
hist(CLLgcrma, main="gcRMA", col=colors)
## boxplot
boxplot(CLLbatch, col=colors, las=3, main="original")
boxplot(CLLmas5, col=colors, las=3, ylim=c(0,1000), main="MAS 5.0")
boxplot(CLLrma, col=colors, las=3, main="RMA")
boxplot(CLLgcrma, col=colors, las=3, main="gcRMA")
参考: