limma包的使用技巧

limmar package是一個功能比較全的包,既含有cDNA芯片的RAW data輸入、前處理(歸一化)功能,同時也有差異化基因分析的“線性”算法(limma: Linear Models for Microarray Data),特別是對於“多因素實驗(multifactor designed experiment)”。limmar包的可擴展性非常強,單通道(one channel)或者雙通道(tow channel)數據都可以分析差異基因,甚至也包括了定量PCR和RNA-seq(第一次見分析microarray的包也能處理RNA-seq)。
limmar package是一個集大成的包,對載入數據、數據前處理(背景矯正、組內歸一化和組間歸一化都有很多種選擇方法)、差異基因分析都有很多的選擇。而且,所設計的線性迴歸和經驗貝葉斯方法找差異基因非常值得學習。

1. 讀入樣本信息
使用函數讀readTargets(file="Targets.txt", path=NULL, sep="\t", row.names=NULL, quote="\"",...)。這個函數其實是一個包裝了的read.table(),讀入的是樣本的信息,創建的對象類似於marray包的marrayInfos和Biobase包的AnnotatedDataFrame。

2. 讀入探針密度數據 
marray包一致,Bioconductor不能讀入原始的TIFF圖像文件,只能輸出掃描儀輸入的、轉換成數字信號的文本文件。使用函數read.maimages(files=NULL, source="generic", path=NULL, ext=NULL, names=NULL, columns=NULL, other.columns=NULL, annotation=NULL, green.only=FALSE, wt.fun=NULL, verbose=TRUE, sep="\t", quote=NULL, ...)
參數說明:files需要通過函數dir(pattern = "Mypattern")配合正則表達式篩選(規範命名很重要),同時該函數可以讀入符合格式的壓縮過的文件,比如*.txt.gz的文件,這極大的減小的數據儲存大小;source的取值分爲兩類,一類是“高富帥”,比如“agilent”、“spot”等等(下表),它們是特定掃描儀器的特定輸出格式;如果不幸是“屌絲”,即格式是自己規定的,可以選定source="generic",這時需要規定columns;任何cDNA文件都要有R/G/Rb/Gb四列(Mean或者Median);annotation可以規定哪些是註釋列;wt.fun用於對點樣點進行質量評估,取值爲0表示這些點將在後續的分析中被剔除,取值位1表示需要保留,對點樣點的評估依賴於圖像掃描軟件的程序設定,比如SPOT和GenePix軟件,查看QualityWeights(現成函數或者自己寫函數)。
讀入單通道數據:讀入單通道數據,可以設定green.only = TRUE即可,然後對應讀入columns = list(G = "Col1", Gb = "Col2")。
讀入的數據,如果是單通道,則成爲EListRaw class;如果是雙通道,則是RGList class。
數據操作:
cbind():合併數據;
[”:分割數據;
RGList class有的names是 "R","G","Rb","Gb","weights","printer","genes","targets","notes":  R/G/Rb/Gb分別紅和綠的前景和背景噪音;weight是掃描軟件的質量評估;printer是點樣規則(printer layout);genes是基因註釋;target是樣本註釋;notes是一般註釋。可以通過myRGList$names進行相應的取值和賦值
limma包的使用技巧

3. 前處理
cDNA芯片前處理的流程是:背景去除(background correction)--> 組內歸一化(with-array normalization)--> 組間歸一化(between-array normalization)。最後一步組間歸一化可選,注意trade-off原則。
3.1 背景去除: 
backgroundCorrect(RG, method="auto", offset=0, printer=RG$printer, normexp.method="saddle", verbose=TRUE)
RG:可以是EListRaw,也可以是RGList class;
method:取“auto”,none”,“subtract”,"half","minimum","movingmin","edwards"或者"normexp";
normexp.method:在method取“normexp”時,可以取"saddle","mle","rma"或者"rma75"。
作者建議使用“mle”或者“saddle”,兩個運行速度也差不多。如果數據中含有“形態背景估計(morphological background estimates)”,比如SPOT和GenePix圖像處理軟件,那麼method = "subtract"也就較好的表現。
3.2 組內歸一化
normalizeWithinArrays(object, layout, method="printtiploess", weights=object$weights, span=0.3, iterations=4, controlspots=NULL, df=5, robust="M", bc.method="subtract", offset=0)
method:"none","median","loess","printtiploess","composite","control"和"robustspline"。初始值設定爲“printtiploess”,但是對於Agilent芯片或者小樣本芯片(每個“點樣塊”少於150個探針)。可用選用的loess或者robustspline。“loess歸一化方法假設了有相當大的一部分探針沒有發生差異化表達,而不是上調或者下調的基因數差不多或者差異化程度圍繞着0波動。”(參考文獻1)。需要注意,組內歸一化只是對單張芯片的M值進行了規整(不影響A值),但是對與組間各個通道沒有進行比較。
weight:是圖像處理軟件對探針權重的標記,如果使用weight,那麼在歸一化過程中weight爲0的探針不會影響其他探針,這並不意味着這些探針會被剔除,它們同樣會被歸一化,也會出現在歸一化的結果中。如果不想使用,那麼weight設爲NULL。
iterations:設定loess的循環數,循環數越多,結果越強健(robust)。
3.3 組間歸一化
normalizeBetweenArrays(object, method=NULL, targets=NULL, cyclic.method="fast", ...)
method:“none","scale","quantile","Aquantile","Gquantile",“Rquantile”,“Tquantile”,“cyclicloess”。“scale”對log-ratio數值進行歸一化;“quantile”對密度(intensity)進行歸一化;“Aquantile”對A數值進行歸一化,不調正M數值;"Gquantile"和“Rquantile”則分別對Green和Red通道進行歸一化,適用於Green或者Red爲“參考標準(common reference)”的樣品;“Tquantile”表示樣品分開歸一化或者Green和Red一先一後進行歸一化。
以下是一個cDNA芯片的密度圖,分別爲原始、去背景(method = "normexp", normexp.method="mle")、組內歸一化(method = "robustspline")和組間歸一化(method = “quantile”),使用plotDensities()繪製。
limma包的使用技巧limma包的使用技巧

limma包的使用技巧limma包的使用技巧

4. 線性模型設計(linear model desigh)
“線性模型”主要分析差異化表達基因,使用這種方法需要準備兩個矩陣:“實驗設計矩陣(design matrix)”和“對比矩陣(contrast matrix)”。“實驗設計矩陣”主要用於每張芯片上用的RNA樣品種類,“對比矩陣”主要用於規定實驗組和對照組。
“實驗設計矩陣”:列表示RNA樣品種類,對於oligo芯片或者使用common reference的cDNA芯片(簡稱第一類),列數與不同RNA樣品數恰好相同;行數等於芯片數。對於不同染料對應不同樣品的cDNA芯片(簡稱第二類),列數比RNA樣品數恰好少一,行數等於芯片數(如要要衡量染料效應(dye effect),則列數與第一類相同)。對於第一類芯片,使用model.matrix()函數創建“實驗設計矩陣”:比如oligo芯片model.matrix(~ 0+factor(c(1,1,1,2,2,3,3,3)))表示三類RNA樣品;對於cDNA芯片,modelMatrix(targets,ref="EGFP")創建以“EGFP”爲common reference的矩陣。對於第二類芯片,需要手動創建。
“對比矩陣”通過函數makeContrasts()函數創建。
使用步驟:創建“實驗設計矩陣” --> lmFit() --> 創建“對比矩陣”(此步可選,如正交實驗) -->contrasts.fit()(接上步,可選)--> eBayes() --> topTable()。文檔詳細列出了各種各樣的例子。
 比較有用的例子:
4.1 交換染料的技術重複
===========================================================================
beta7pq$targets
      FileNames SubjectID  Cy3  Cy5 Date of Blood Draw Date of Scan
1 6Hs.195.1.gpr         1 b7 - b7 +         2002.10.11   2003.07.25
2   6Hs.168.gpr         3 b7 + b7 -         2003.01.16   2003.08.07
3   6Hs.166.gpr         4 b7 + b7 -         2003.01.16   2003.08.07
4 6Hs.187.1.gpr         6 b7 - b7 +         2002.09.16   2003.07.18
5   6Hs.194.gpr         8 b7 - b7 +         2002.09.18   2003.07.25
6 6Hs.243.1.gpr        11 b7 + b7 -         2003.01.13   2003.08.06
         Labels
1 6Hs.195.1.gpr
2   6Hs.168.gpr
3   6Hs.166.gpr
4 6Hs.187.1.gpr
5   6Hs.194.gpr
6 6Hs.243.1.gpr
# 假定這六張芯片每兩兩做技術重複
design <- c(1, -1, -1, 1, 1, -1)
corfit <- duplicateCorrelation(beta7pq, design, ndups=1, block = c(1, 1, 2, 2, 3, 3), weight = NULL)
fit <- lmFit(beta7pq, design, block = c(1, 1, 2, 2, 3, 3), cor = corfit$consensus)
fit <- eBayes(fit)
topTable(fit, adjust = "dfr")
           P.Value  adj.P.Val        B
6647  4.870266e-07 0.01129122 5.341680
11025 1.507433e-06 0.01747417 4.663784
4910  9.223463e-06 0.04706320 3.434271
11470 1.054914e-05 0.04706320 3.336518
7832  1.182200e-05 0.04706320 3.252921
22582 1.217992e-05 0.04706320 3.230931
20812 1.939031e-05 0.05662524 2.882772
1755  2.042581e-05 0.05662524 2.843204
21405 2.743542e-05 0.05662524 2.616544
11717 2.833754e-05 0.05662524 2.591458
# 也可以採用以下方法
design <- modelMatrix(beta7pq$targets, ref = "b7 -")
design <- cbind(Dye = 1, desigh)
fit <- lmFit(beta7pq, design)
colnames(design)[2] <- "b7"
cont.matrix <- makeContrasts(MUvsWT = b7/2, levels = design)
fit2 <- contrasts.fit(fit, cont.matrix)
fit2 <- eBayes(fit2)
topTable(fit2, adjust = "fdr")
        P.Value  adj.P.Val        B
6647  8.351055e-07 0.01936109 4.430939
11025 3.555781e-06 0.02976803 3.700994
11431 3.851970e-06 0.02976803 3.656632
6211  6.431916e-06 0.03727939 3.362305
11470 2.201258e-05 0.09075900 2.586146
4910  2.495165e-05 0.09075900 2.501700
1755  3.124884e-05 0.09075900 2.347645
7832  3.131780e-05 0.09075900 2.346120
11987 5.008082e-05 0.12764486 2.014907
21859 5.505731e-05 0.12764486 1.946501
#  兩者有些不同,原因可能是第一種方法是專門爲“對稱”的cDNA芯片設計,而第二種是爲非對稱設計。
===========================================================================
4.2 類型2的芯片
參考文獻8.4和8.5節。其中用到了model.matrix()這個函數,什麼意思?
4.3 正交實驗
參考文獻8.6和8.7節。
4.4 將兩個通道分開分析
參考文獻8.8節

5. 做圖
5.1 背景和前景
imageplot(z, layout, low = NULL, high = NULL, ncolors = 123, zerocenter = NULL, zlim = NULL, mar=c(2,1,1,1), legend=TRUE, ...)
z:可以定義R/Rb/G/Gb,也可以是導數;
low/high:規定顏色,比如low = "white" , high = "red"
下圖是一張芯片的綠色前景圖、紅色背景圖和log-ratio圖(M值圖):
=======================================================
imageplot(log2(beta7$G[, 1]), beta7$printer, low = "white", high = "green")
imageplot(log2(beta7$Rb[, 1]), beta7$printer, low = "white", high = "red")
imageplot(beta7q$M[, 1], beta7$printer)
=======================================================
limma包的使用技巧limma包的使用技巧limma包的使用技巧
也可以使用imageplot3by2(RG, z="Gb", prefix=paste("image",z,sep="-"), path=NULL, zlim=NULL, common.lim=TRUE, ...),將圖以3*2的格式六個一組保存成圖片。
5.2 M-A圖
使用plotMA(MA, array=1, xlab="A", ylab="M", main=colnames(MA)[array], xlim=NULL, ylim=NULL, status, values, pch, col, cex, legend=TRUE, zero.weights=FALSE, ...)畫單個MA圖。但這個函數有些問題,有時畫不出。所以,完全可以自己來畫,比如:
==========================================================
# plot the MAplot befor normalization
M <- log2((beta7$R[, 1]-beta7$Rb[, 1])/(beta7$G[, 1]-beta7$Gb[, 1]))
A <- (log2((beta7$R[, 1]-beta7$Rb[, 1]))+log2((beta7$G[, 1]-beta7$Gb[, 1])))/2
plot(A, M, cex = 0.5)
# we can also plot the MAplot above using marray package
beta7ma <- as(beta7, "marrayRaw")
plot(maA(beta7ma)[,1], maM(beta7ma)[, 1])
# plot the MAplot after normalization
plot(beta7q$A[, 1], beta7q$M[, 1], cex = 0.5)
===========================================================
limma包的使用技巧limma包的使用技巧

使用plotPrintTipLoess(object,layout,array=1,span=0.4,...)畫print-tip的MA圖,下圖分別是歸一化前和後的print-tip的MA圖。
limma包的使用技巧

limma包的使用技巧
使用boxplot()畫盒箱圖,使用plotDensity()畫密度曲線圖。下圖爲原始數據、組內歸一化(method = "normexp", normexp.method="mle")和組建歸一化(method = "scale")的盒箱圖。
limma包的使用技巧

limma包的使用技巧

limma包的使用技巧
最後,還可以使用 volcanoplot(fit, coef=1, highlight=0, names=fit$genes$ID, xlab="Log Fold Change", ylab="Log Odds", pch=16, cex=0.35, ...)畫“火山圖”(highlight標記前N個差異基因);
使用vennDiagram(object, include="both", names, mar=rep(1,4), cex=1.5, lwd=1, circle.col, counts.col, show.include, ...)畫“韋恩圖”;
使用plotMDS()繪製多緯標度圖(multidimensional scaling plot, MDS)。




參考文獻:limma: Linear Models for Microarray Data User’s Guide

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章