标准化的原因
芯片实验中存在大量干扰因素,标准化可以削弱这些干扰因素,使得实验条件下的测量可以相互比较,大大减小误差。
常见引起数据需要标准化的因素:芯片杂交的RNA总量不一致、芯片表面不平整、探针非特异性结合、杂交条件不一致。
过滤探针,也算标化的一部分。limma包的说明对此提供了两点建议:
一,如果要进行探针过滤(filter),最好在进行标准化之后再过滤。
二,如果要在后续分析中使用limma包,请不要进行基于方差(variance)的过滤,否则会影响方差分布,从而导致limma包处理产生糟糕的结果(poor results)。
标准化的方法
芯片数据的标准化可以分为四个步骤,这个步骤甚至你可以在affy包的rma函数trace到,如果你留心的话。
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函数相对灵活,可以用于自己组合不同的处理方法对数据进行标准化。但那是大神用的,新手一般不建议这么做:因为许多处理方法不能整合到一起,弄巧惩治u哦。
建议使用一体化的标准化处理函数,就用rma()。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函数提供的标准化方法如下:
#这样会使用RMA方法进行标准化,就没有区别了
library(affyPLM)
library(affydata)
data(Dilution)
eset <- threestep(Dilution)
#这样就能使用自定义的方式进行标准化了。
eset <- threestep(Dilution, background.method = "MASIM",
normalize.method="quantile",summary.method="tukey.biweight")
threestep函数返回值是经过log2变换的!
3 使用一体化函数进行标准化
使用整合好的一体化函数对数据进行标准化是最常见的方式,常用的一体化函数有
rma()、gcrma()、mas5(),下面一个一个介绍:
rma
其中,rma(Robust Multiarray Average)算法是最常用的算法之一,等价于
expresso(data,
bgcorrect.method="rma",
normalize.method="quantiles",
pmcorrect.method="pmonly",
summary.method="medianpolish")
mas5
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算法的返回值还需要i经过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")