Microarray: 如何讓 limma 使用 Tab delimited text table 計算 p 值

在統計上用來區分兩群族有無差異,常用的方法是 t-test 之類的方法, t-test 的原理是用觀察兩群樣本的分布來作判定是否有差異,而為了顯現族群的分布,適當的取樣是必需的(至少上百個sample), 但是microarray 實驗,通常沒有多少人可以拿出三五百萬來作一個實驗, 所以 limma 就被發展出來, 用以補足Microarray 傳統上 t-test 統計方法上的不足, limma 是一個線性的模型的方法概念上有點像ANOVA,不過原理我就不詳述了,而在應用上,目前我也只知道 R 上有 package, limma, 而且還出了 GUI 的界面,讓不會寫R 的使用者可以用選單的方法, raw data (.gpr or .cel) 餵進去, p-value 跑出來, 算是很成熟的演算法了.  不過也許太過 user freindly 了,反而讓我很傷腦筋. 最近我接了一個任務,要作一組分析,客戶指定要用 limma 來挑基因,不過,不是從 raw data 開始,我拿到的是一組已經處理過的數據(tab delimited text table), 可是 limma 可沒支援這種半生不熟的data 格式, 所以我花了一點時間,想了一個方法騙過 limma, 從中間插入.如果你也有相同的問題,希望我的方法,對你有幫助:

load limma 的 package
>library(limma)

接下來,讀取 data file,格式像這樣

            S1  S2  S3   ...    S7
gene1    1    2    2    ...    1
gene3    2    3    1    ...    0

以 Tab 分開. s1-s7是sample name

 >raw <- read.table (file="c:/yourdata.txt",sep="\t",row.names=1,header=T)

然後把他假裝成 marray 產生的物件 ExpresssionSet, limma就可以把資料吃進去了!
> eset<-new("ExpressionSet",exprs=as.matrix(raw))

接下來就一樣了,先設定實驗設計模型, 然後套入linear model 及 contrast model
>design <- model.matrix (~-1+factor(c(1,1,1,1,2,2,2,2))
>colnames(design) <- c("test","control")
> fit <- lmFit(eset,design=design)
>contrast.matrix <-makeContrasts(test-control, levels=design)
>fit2<-contrasts.fit(fit,contrast.matrix)

然後用 empirical Bayes smoothing 的方法,求 p-values
>P <- eBayes(fit2)

這個就是你要的啦!
>P$p.value
##ReadMore##

留言

  1. 可以請問一下
    quantile normalization的流程嗎?
    是把.cel中的pm值取出來做排序再取mean
    然後把mean放入原本的位置嗎?

    回覆刪除
  2. 可以請問一下
    因為我現在發現了一個問題
    如果我要把mean放回每個array中
    可是有二個一樣的rank要怎麼放

    array.1=1,2,2,4
    mean=m1,m2,m3,m4
    放回時…
    array.1=m1,m2,m2,m3
    or
    array.1=m1,m3,m3,m4
    還是別的
    因為我是用r寫
    所以在rank中的ties.method要寫成什麼呢?
    我有測試…好像都不對…
    不知道要如何解決…
    如果方便的話…
    是否有教我一下
    他的擺法
    謝謝

    回覆刪除
  3. 板主回覆:
    是的, 因此所有 array 間的差異會被平均掉,只剩 Ranking order, Quantile normalization 是很暴力的方法,不過,超好用!

    回覆刪除
  4. 可以請問一下 我好像遇到處理相同檔案格式的問題
    當我輸入
    eset<-new("ExpressionSet",exprs=as.matrix(raw))
    它跟我說

    錯誤在getClass(Class, where = topenv(parent.frame())) :
    "ExpressionSet" is not a defined class

    請問這是什麼問題
    感謝

    回覆刪除
  5. 看起來是他不認識 ExpressionSet 這個 Class, 他定義在Biobase 中, 通常執行R是會自動載入, 如果沒有,您可以用 library("Biobase") 把他加入!

    回覆刪除
  6. 請問一下為什麼算出來的 p value有兩個?? 結果如下:
    MAP1D 1.393595e-05 1.793687e-08
    NPAS1 2.126797e-06 4.343194e-10
    MFAP3 8.151126e-04 9.757330e-01

    回覆刪除
    回覆
    1. 可以再說明清楚一點嗎? ex. your R script.

      刪除
  7. 文中
    P <- eBayes(fit)
    fit 應為fit2

    回覆刪除
  8. 現在在用TCGA的DATA在分析,想請問一下做完quantile normalization(between microarray normalization)將不同病人的表現量資料分布拉齊後,還需要做within microarray normalization嗎?

    回覆刪除
    回覆
    1. 通常 single-channel (e.g. Affymetrix) 只要作做一次 between array normalization, Signal 就可以直接上統計分析了。dual-channel 的就要看前端數值處理的流程了。

      刪除
  9. 想請問一下前輩,就是我設FDR = 0.05找到的DE genes,有五千多個,然後為了要建後續的蛋白質交互作用網路,我需要找co-express gene,於是我取前10%最顯著的基因群(500多個)去算PCC,回傳的matrix給我的PCC落在0.6~0.9,而且大部分都是0.8~0.9,個人覺得有點高得嚇人,然而我也取不顯著的五百個基因群去算PCC,發現落在0.05~0.5。主要是算出來的PCC高得有點讓人無法相信,但是又確認過quantile normalization沒做錯(用了preprocessCore跟limma裡面的都是回傳一樣的matrix)。想請問前輩看法??PCC這麼高是否有問題

    回覆刪除
    回覆
    1. PCC是指 Pearson correlation coefficient 嗎? 如果是的話我覺得還蠻有可能,主要還是看你的用來做分析的樣品的狀態,如果你是用Treat vs Control group 比的話,你的顯著基因在這兩個群組本來就高低的關係, 你用PCC 來看這群基因當然一定是highly correlation,你如果用的是Time cours, Stages, dosage dependent...系列型的Data, 會有比較好的效果,不過,個人覺得看R值來分群不太準,你可以用K-mean or SOM 來分,比較容找到co-expressed genes.

      刪除
  10. lucas大大您好:
    昨天繼續爬了一下文,http://blog.sciencenet.cn/blog-295006-403640.html
    發現除了通常大家還會去挑logFC,普遍來說是挑>1.5還是>2呢? 我挑>1.5同時又顯著的畫出來的PCC matrix range :0.3~0.9了。
    只是有一個問題是,上述網址文中的絕對表現值會挑>10,可是TCGA的mRNA express microarray的表現量都蠻低的,想請問lucas前輩是不是通常只要挑顯著性ANDlogFC做為判斷DE gene的依據呢?

    回覆刪除
    回覆
    1. 用FC 來選基因有很大的問題,是 signal 的fold change 不代表 mRNA conc. 的fold change, 他會嚴重受到 probe design 的影響,我們通常只有在統計方法無法使用是才用FC選,FC >? 當然越高越好,表示表現差明顯,用1.5 or 2 也是可以的,反正是自由心証的數字,最後結果可以用就好.

      刪除

張貼留言