Q:該如何選擇limma, DESeq2, edgeR
A:各有各自應(yīng)用的場景
- 如果是芯片數(shù)據(jù),一般選擇limma,畢竟它是處理芯片數(shù)據(jù)之王。 不過edgeR也可以。芯片數(shù)據(jù)默認(rèn)符合正態(tài)分布,而limma正是基于正態(tài)分布。
- 如果是二代測序的原始count值,一般選擇DESeq或edgeR。注意這兩者只能處理count,不能處理FPKM等矯正后的數(shù)據(jù)。二代測序數(shù)據(jù)符合柏松分布,理論上不能用T檢驗,只能用非參數(shù)檢驗(秩和),但是統(tǒng)計力度不夠,所以還是得用經(jīng)過矯正后的參數(shù)檢驗。
- 如果是FPKM等矯正后的表達(dá)量,可以用cuffdiff
Sum: 基于以上,對于二代測序數(shù)據(jù),先拿到原始count值進行DESeq2差異分析,再轉(zhuǎn)換成TPM進行下游分析。不建議用edgeR和cuffdiff。
DESeq找差異基因+火山圖 傳送門:http://www.lxweimin.com/p/7c6a15eddfb6
今天寫的是limma進行差異分析。PS:limma的說明書實在太太太長了,不過卻是入門生信必讀的。
Step1: 準(zhǔn)備數(shù)據(jù)
-
group數(shù)據(jù)
group分組信息 -
表達(dá)譜數(shù)據(jù)
Step2: 構(gòu)建design 樣本分組矩陣
library(limma)
design <- model.matrix(~0+group)
rownames(design) = colnames(expr1)
colnames(design) <- levels(group)
Step3: 構(gòu)建進行差異分析的對象
%構(gòu)建DGElist對象
DGElist <- DGEList(counts = expr1, group = group)
% 去除表達(dá)量過低的基因
% Compute counts per million (CPM)
keep_gene <- rowSums(cpm(DGElist) > 1) >= 2
table(keep_gene)
DGElist <- DGElist[keep_gene, ,keep.lib.sizes =FALSE]
Step4:構(gòu)建線性模型
% 計算列的矯正因子
DGElist <- calcNormFactors( DGElist )
% 將count值轉(zhuǎn)化成log2-counts per million (logCPM),準(zhǔn)備進行線性回歸
v <- voom(DGElist, design, plot = TRUE, normalize = "quantile")
% 對每一個基因進行線性模型構(gòu)建
fit <- lmFit(v, design)
% 構(gòu)建比較矩陣
cont.matrix <- makeContrasts(contrasts = c('cancer-normal'), levels = design)
% 構(gòu)建芯片數(shù)據(jù)的線性模型,計算估計的相關(guān)系數(shù)和標(biāo)準(zhǔn)差
fit2 <- contrasts.fit(fit, cont.matrix)
% 基于貝葉斯計算T值,F(xiàn)值和log-odds
fit2 <- eBayes(fit2)
Step5:得出結(jié)果
nrDEG_limma_voom = topTable(fit2, coef = 'cancer-normal', n = Inf)
nrDEG_limma_voom = na.omit(nrDEG_limma_voom)
head(nrDEG_limma_voom)
% 篩選出符合要求的差異基因
library(dplyr)
res<-cbind(rownames(nrDEG_limma_voom),nrDEG_limma_voom)
res_1<-res %>% dplyr::filter((logFC>1 | logFC < (-1)) & adj.P.Val < 0.05)
colnames(res_1)[1]<-"Symbol"