這個(gè)步驟推薦在R里面做,載入表達(dá)矩陣,然后設(shè)置好分組信息,統(tǒng)一用DEseq2進(jìn)行差異分析,當(dāng)然也可以走走edgeR或者limma的voom流程。
基本任務(wù)是得到差異分析結(jié)果,進(jìn)階任務(wù)是比較多個(gè)差異分析結(jié)果的異同點(diǎn)。
目錄
- 數(shù)據(jù)填坑
- 理論基礎(chǔ):線性模型, 設(shè)計(jì)矩陣和比較矩陣
- 標(biāo)準(zhǔn)化一二事
- 探索性分析一二事
- 使用DESeq2進(jìn)行差異基因分析
- 使用edgeR進(jìn)行差異基因分析
- 使用limma進(jìn)行差異基因分析
- 不同軟件包分析結(jié)果比較
- 使用GFOLD進(jìn)行無(wú)重復(fù)樣本的差異基因分析
- 不同差異表達(dá)分析的比較
數(shù)據(jù)填坑
原先三個(gè)樣本的HTSeq-count計(jì)數(shù)的數(shù)據(jù)可以在我的GitHub中找到,但是前面已經(jīng)說(shuō)過(guò)Jimmy失誤讓我們分析的人類就只有3個(gè)樣本, 另外一個(gè)樣本需要從另一批數(shù)據(jù)獲取(請(qǐng)注意batch effect),所以不能保證每一組都有兩個(gè)重復(fù)。
我一直堅(jiān)信”你并不孤獨(dú)“這幾個(gè)字,遇到這種情況的人肯定不止我一個(gè),于是我找到了幾種解決方法
- 使用edgeR,指定dispersion值
- 無(wú)重復(fù)轉(zhuǎn)錄組數(shù)據(jù)推薦用同濟(jì)大學(xué)的GFOLD
以上方法都會(huì)在后續(xù)進(jìn)行介紹,但是我們DESeq2必須得要有重復(fù)的問(wèn)題亟待解決,沒(méi)辦法我只能自己瞎編了。雖然是編,我們也要有模有樣,不能直接復(fù)制一份,要考慮到高通量測(cè)序的read是默認(rèn)符合泊松分布的。我是這樣編的。
- 計(jì)算KD重復(fù)組的均值差,作為泊松分布的均值
- 使用概率函數(shù)
rpois()
隨機(jī)產(chǎn)生一個(gè)數(shù)值,前一步的均值作為lambda, - 對(duì)一些read count 低于均值的直接加上對(duì)應(yīng)KD重復(fù)組之間的差值
# import data if sample are small
options(stringsAsFactors = FALSE)
control <- read.table("F:/Data/RNA-Seq/matrix/SRR3589956.count",
sep="\t", col.names = c("gene_id","control"))
rep1 <- read.table("F:/Data/RNA-Seq/matrix/SRR3589957.count",
sep="\t", col.names = c("gene_id","rep1"))
rep2 <- read.table("F:/Data/RNA-Seq/matrix/SRR3589958.count",
sep="\t",col.names = c("gene_id","rep2"))
# merge data and delete the unuseful row
raw_count <- merge(merge(control, rep1, by="gene_id"), rep2, by="gene_id")
raw_count_filt <- raw_count[-1:-5,]
ENSEMBL <- gsub("(.*?)\\.\\d*?_\\d", "\\1", raw_count_filt$gene_id)
row.names(raw_count_filt) <- ENSEMBL
## the sample problem
delta_mean <- abs(mean(raw_count_filt$rep1) - mean(raw_count_filt$rep2))
sampleNum <- length(raw_count_filt$control)
sampleMean <- mean(raw_count_filt$control)
control2 <- integer(sampleNum)
for (i in 1:sampleNum){
if(raw_count_filt$control[i] < sampleMean){
control2[i] <- raw_count_filt$control[i] + abs(raw_count_filt$rep1[i] - raw_count_filt$rep2[i])
}
else{
control2[i] <- raw_count_filt$control[i] + rpois(1,delta_mean)
}
}
# add data to raw_count
raw_count_filt$control2 <- control2
這僅僅是一種填坑的方法而已,更好模擬數(shù)據(jù)的方法需要參閱更加專業(yè)的文獻(xiàn), 有生之年 我希望能補(bǔ)上這一個(gè)部分。
理論基礎(chǔ):線性模型, 設(shè)計(jì)矩陣和比較矩陣
這部分內(nèi)容最先在 RNA-Seq Data Analysis 的8.5.3節(jié)看到,剛開始一點(diǎn)都不理解,但是學(xué)完生物統(tǒng)計(jì)之后,我認(rèn)為這是理解所有差異基因表達(dá)分析R包的關(guān)鍵。
基本上,統(tǒng)計(jì)課都會(huì)介紹如何使用t檢驗(yàn)用來(lái)比較兩個(gè)樣本之間的差異,然后在樣本比較多的時(shí)候使用方差分析確定樣本間是否有差異。當(dāng)然前是樣本來(lái)自于正態(tài)分布的群體,或者隨機(jī)獨(dú)立大量抽樣。
對(duì)于基因芯片的差異表達(dá)分析而言,由于普遍認(rèn)為其數(shù)據(jù)是服從正態(tài)分布,因此差異表達(dá)分析無(wú)非就是用t檢驗(yàn)和或者方差分析應(yīng)用到每一個(gè)基因上。高通量一次性找的基因多,于是就需要對(duì)多重試驗(yàn)進(jìn)行矯正,控制假陽(yáng)性。目前在基因芯片的分析用的最多的就是limma。
但是,高通量測(cè)序(HTS)的read count普遍認(rèn)為是服從泊松分布(當(dāng)然有其他不同意見),不可能直接用正態(tài)分布的t檢驗(yàn)和方差分析。 當(dāng)然我們可以簡(jiǎn)單粗暴的使用對(duì)于的非參數(shù)檢驗(yàn)的方法,但是統(tǒng)計(jì)力不夠,結(jié)果的p值矯正之估計(jì)一個(gè)差異基因都找不到。老板花了一大筆錢,結(jié)果卻說(shuō)沒(méi)有差異基因,是個(gè)負(fù)結(jié)果,于是好幾千經(jīng)費(fèi)打了水漂,他肯定是不樂(lè)意的。因此,還是得要用參數(shù)檢驗(yàn)的方法,于是就要說(shuō)到方差分析和線性模型之間的關(guān)系了。
線性回歸和方差分析是同一時(shí)期發(fā)展出的兩套方法。在我本科階段的田間統(tǒng)計(jì)學(xué)課程中就介紹用方差分析(ANOVA)分析不同肥料處理后的產(chǎn)量差異,實(shí)驗(yàn)設(shè)計(jì)如下
肥料 | 重復(fù)1 | 重復(fù)2 | 重復(fù)3 | 重復(fù)4 |
---|---|---|---|---|
A1 | ... | ... | ... | ... |
A2 | ... | ... | ... | ... |
A3 | ... | ... ... | ... | ... |
這是最簡(jiǎn)單的單因素方差分析,每一個(gè)結(jié)果都可以看成 yij = ai + u + eij, 其中u是總體均值,ai是每一個(gè)處理的差異,eij是隨機(jī)誤差。
注:方差分析(Analysis of Variance, ANAOVA)名字聽起來(lái)好像是檢驗(yàn)方差,但其實(shí)是為了判斷樣本之間的差異是否真實(shí)存在,為此需要證明不同處理內(nèi)的方差顯著性大于不同處理間的方差。
線性回歸 一般是用于量化的預(yù)測(cè)變量來(lái)預(yù)測(cè)量化的響應(yīng)變量。比如說(shuō)體重與身高的關(guān)系建模:
當(dāng)然線性回歸也可用處理名義型或有序型因子(也就是離散變量)作為預(yù)測(cè)變量,如果要畫圖的話,就是下面這個(gè)情況。
如果我們需要通過(guò)一個(gè)實(shí)驗(yàn)找到不同處理后對(duì)照組和控制組的基因變化,那么基因表達(dá)可以簡(jiǎn)單寫成, y = a + b · treament + e。 和之前的 yij = ai + u + eij 相比,你會(huì)發(fā)現(xiàn)公式是如此的一致。 這是因?yàn)榫€性模型和方差分析都是廣義線性模型(generalizing linear models, GLM)在正態(tài)分布的預(yù)測(cè)變量的特殊形式。而GLM本身只要采用合適的連接函數(shù)是可以處理對(duì)任意類型的變量進(jìn)行建模的。
目前認(rèn)為read count之間的差異是符合負(fù)二項(xiàng)分布,也叫g(shù)amma-Possion分布。那么問(wèn)題來(lái)了,如何用GLM或者LM分析兩個(gè)處理件的差異呢?其實(shí)可以簡(jiǎn)單的用上圖的擬合直線的斜率來(lái)解釋,如果不同處理之間存在差異,那么這個(gè)擬合線的斜率必定不為零,也就是與X軸平行。但是這是一種便于理解的方式(雖然你也未必能理解),實(shí)際更加復(fù)雜,考慮因素更多。
注1 負(fù)二向分布有兩個(gè)參數(shù),均值(mean)和離散值(dispersion). 離散值描述方差偏離均值的程度。泊松分布可以認(rèn)為是負(fù)二向分布的離散值為1,也就是均值等于方差(mean=variance)的情況。
注2 這部分涉及大量的統(tǒng)計(jì)學(xué)知識(shí),不懂就用維基百科一個(gè)個(gè)查清楚。
聊完了線性模型和方差分析,下面的設(shè)計(jì)矩陣(design matrix)就很好理解了, 其實(shí)就是用來(lái)告訴不同的差異分析函數(shù)應(yīng)該如何對(duì)待變量。比如說(shuō)我們要研究的KD和control之間變化,設(shè)計(jì)矩陣就是
樣本 | 處理 |
---|---|
sample1 | control |
sample2 | control |
sample3 | KD |
sample4 | KD |
那么比較矩陣(contrast matrix)就是告訴差異分析函數(shù)應(yīng)該如何對(duì)哪個(gè)因素進(jìn)行比較, 這里就是比較不同處理下表達(dá)量的變化。
標(biāo)準(zhǔn)化一二事
其實(shí)read count如何標(biāo)準(zhǔn)化的方法有很多,最常用的是FPKM和RPKM,雖然它們其實(shí)是錯(cuò)的--FPKM/RPKM是錯(cuò)的。
我推薦閱讀 Comparing the normalization methods for the differential analysis of Illumina high-throughput RNA-Seq data , 了解不同標(biāo)準(zhǔn)化方法之間的差異。
有一些方法是要求原始數(shù)據(jù),有一些則要求經(jīng)過(guò)某類標(biāo)準(zhǔn)化后的數(shù)據(jù),記得區(qū)分。
探索性分析一二事
使用DESeq2進(jìn)行差異基因分析
關(guān)于DESeq2分析差異表達(dá)基因,其實(shí)在https://www.bioconductor.org/help/workflows/rnaseqGene/ 里面介紹的非常清楚了。
我們已經(jīng)準(zhǔn)備好了count matrix,接下來(lái)就是把數(shù)據(jù)導(dǎo)入DESeq2。DESeq2導(dǎo)入數(shù)據(jù)的方式有如下4種,基本覆蓋了主流read count軟件的結(jié)果。
注 DESeq2要求的數(shù)據(jù)是raw count, 沒(méi)必要進(jìn)行FPKM/TPM/RPFKM/TMM標(biāo)準(zhǔn)化。
function | package | framework | output | DESeq2 input function |
---|---|---|---|---|
summarizeOverlaps | GenomicAlignments | R/Bioconductor | SummarizedExperiment | DESeqDataSet |
featureCounts | Rsubread | R/Bioconductor | matrix | DESeqDataSetFromMatrix |
tximport | tximport | R/Bioconductor | list of matrices | DESeqDataSetFromTximport |
htseq-count | HTSeq | Python | files | DESeqDataSetFromHTSeq |
本來(lái)我們是可以用DESeq2為htseq-count專門提供的 DESeqDataSetFromHTSeq ,然而很尷尬數(shù)據(jù)不夠要自己湊數(shù),所以只能改用 DESeqDataSetFromMatrix了 :cold_sweat:
導(dǎo)入數(shù)據(jù),構(gòu)建 DESeq2 所需的 DESeqDataSet 對(duì)象
library(DESeq2)
countData <- raw_count_filt[,2:5]
condition <- factor(c("control","KD","KD","control"))
dds <- DESeqDataSetFromMatrix(countData, DataFrame(condition), design= ~ condition )
注: 這一步到下一步之間可以過(guò)濾掉一些low count數(shù)據(jù),節(jié)省內(nèi)存,提高運(yùn)行速度
nrow(dds)
dds <- dds[ rowSums(counts(dds)) > 1, ]
nrow(dds)
使用DESeq
進(jìn)行差異表達(dá)分析: DESeq
包含三步,estimation of size factors(estimateSizeFactors), estimation of dispersion(estimateDispersons), Negative Binomial GLM fitting and Wald statistics(nbinomWaldTest),可以分布運(yùn)行,也可用一步到位,最后返回 results
可用的DESeqDataSet對(duì)象。
dds <- DESeq(dds)
# 出現(xiàn)如下提示信息,說(shuō)明運(yùn)行成功
estimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
用results獲取結(jié)果: results的參數(shù)非常的多,這里不好具體展開 :pensive: 但是你們會(huì)自己看的吧
res <- results()
我們可用mcols查看每一項(xiàng)結(jié)果的具體含義,比如說(shuō)log2FoldChange 表示倍數(shù)變化取log2結(jié)果,還能畫個(gè)火山圖。一般簡(jiǎn)單粗暴的用2到3倍作為閾值,但是對(duì)于低表達(dá)的基因,3倍也是噪音,那些高表達(dá)的基因,1.1倍都是生物學(xué)顯著了。更重要的沒(méi)有考慮到組內(nèi)變異,沒(méi)有統(tǒng)計(jì)學(xué)意義。padj 就是用BH對(duì)多重試驗(yàn)進(jìn)行矯正。
mcols(res, use.names = TRUE)
DataFrame with 6 rows and 2 columns
type description
<character> <character>
baseMean intermediate mean of normalized counts for all samples
log2FoldChange results log2 fold change (MLE): condition KD vs control
lfcSE results standard error: condition KD vs control
stat results Wald statistic: condition KD vs control
pvalue results Wald test p-value: condition KD vs control
padj results BH adjusted p-values
用summary看描述性的結(jié)果,大致是上調(diào)的基因占總體的11%,下調(diào)的是7.1%(KD vs control)
summary(res)
out of 29469 with nonzero total read count
adjusted p-value < 0.1
LFC > 0 (up) : 3154, 11%
LFC < 0 (down) : 2095, 7.1%
outliers [1] : 0, 0%
low counts [2] : 15111, 51%
(mean count < 22)
[1] see 'cooksCutoff' argument of ?results
[2] see 'independentFiltering' argument of ?results
畫個(gè)MA圖,還能標(biāo)注p值最小的基因。
An MA plot is an application of a Bland–Altman plot for visual representation of genomic data. The plot visualises the differences between measurements taken in two samples, by transforming the data onto M (log ratio) and A (mean average) scales, then plotting these values. Though originally applied in the context of two channel DNA microarray gene expression data, MA plots are also used to visualise high-throughput sequencing analysis --From wikipeida
M表示log fold change,衡量基因表達(dá)量變化,上調(diào)還是下調(diào)。A表示每個(gè)基因的count的均值。根據(jù)summary可知,low count的比率很高,所以大部分基因表達(dá)量不高,也就是集中在0的附近(log2(1)=0,也就是變化1倍).提供了模型預(yù)測(cè)系數(shù)的分布總覽。
下圖是沒(méi)有經(jīng)過(guò) statistical moderation平緩log2 fold changes的情況
plotMA(res, ylim = c(-5,5))
topGene <- rownames(res)[which.min(res$padj)]
with(res[topGene, ], {
points(baseMean, log2FoldChange, col="dodgerblue", cex=2, lwd=2)
text(baseMean, log2FoldChange, topGene, pos=2, col="dodgerblue")
})
如果經(jīng)過(guò)lfcShrink
收縮log2 fold change, 結(jié)果會(huì)好看很多
res.shrink <- lfcShrink(dds, contrast = c("condition","KD","control"), res=res)
plotMA(res.shrink, ylim = c(-5,5))
topGene <- rownames(res)[which.min(res$padj)]
with(res[topGene, ], {
points(baseMean, log2FoldChange, col="dodgerblue", cex=2, lwd=2)
text(baseMean, log2FoldChange, topGene, pos=2, col="dodgerblue")
})
當(dāng)然還有火山圖,不過(guò)留給其他方法作圖,我們先把差異表達(dá)的基因找出來(lái)。
res.deseq2 <- subset(res, padj < 0.05)
一般p value 小于0.05就是顯著了, 顯著性不代表結(jié)果正確,只用于給后續(xù)的富集分析和GSEA提供排序標(biāo)準(zhǔn)和篩選而已。關(guān)于P值的吐槽簡(jiǎn)直無(wú)數(shù), 請(qǐng)多注意。
使用edgeR進(jìn)行差異基因分析
edgeR在函數(shù)說(shuō)明中稱其不但可以分析SAGE, CAGE的RNA-Seq,Tag-RNA,或RNA-seq, 也能分析ChIP-Seq和CRISPR得到的read counts數(shù)據(jù)。嗯,我信了:confused:!
edgeR使用DGEList
函數(shù)讀取count matrix數(shù)據(jù),也就說(shuō)你需要提供一個(gè)現(xiàn)成的matrix數(shù)據(jù),而不是指望它能讀取單獨(dú)的文件,然后進(jìn)行合并(當(dāng)然機(jī)智的我發(fā)現(xiàn),其實(shí)可以用 tximport 或 DESeqDataSetFromHTSeq 讀取單獨(dú)的文件,然后傳遞給DGEList
)
第一步: 構(gòu)建DGEList對(duì)象
library(edgeR)
group <- factor(c("control","KD","KD","control"))
genelist <- DGEList(counts=raw_count_filt[,2:5], group = group)
第二步: 過(guò)濾 low counts數(shù)據(jù)。與DESeq2的預(yù)過(guò)濾不同,DESeq2的預(yù)過(guò)濾只是為了改善后續(xù)運(yùn)算性能,在運(yùn)行過(guò)程中依舊會(huì)自動(dòng)處理low count數(shù)據(jù),edgeR需要在分析前就要排除那些low count數(shù)據(jù),而且非常嚴(yán)格。從生物學(xué)角度,有生物學(xué)意義的基因的表達(dá)量必須高于某一個(gè)閾值。從統(tǒng)計(jì)學(xué)角度上, low count的數(shù)據(jù)不太可能有顯著性差異,而且在多重試驗(yàn)矯正階段還會(huì)拖后腿。 綜上所訴,放心大膽的過(guò)濾吧。
根據(jù)經(jīng)驗(yàn)(又是經(jīng)驗(yàn) :dog: ), 基因至少在某一些文庫(kù)的count超過(guò)10 ~ 15 才被認(rèn)為是表達(dá)。這一步全靠嘗試, 剔除太多就緩緩,剔除太少就嚴(yán)格點(diǎn)。 我們可以簡(jiǎn)單的對(duì)每個(gè)基因的raw count進(jìn)行比較,但是建議用CPM(count-per-million)標(biāo)準(zhǔn)化 后再比較,避免了文庫(kù)大小的影響。
# 簡(jiǎn)單粗暴的方法
keep <- rowSums(genelist$count) > 50
# 利用CPM標(biāo)準(zhǔn)化
keep <- rowSums(cpm(genelist) > 0.5 ) >=2
table(keep)
genelist.filted <- genelist[keep, ,keep.lib.sizes=FALSE]
這里的0.5(即閾值)等于 10/(最小的文庫(kù)的 read count數(shù) /1000000),keep.lib.size=FALSE表示重新計(jì)算文庫(kù)大小。
第三步: 根據(jù)組成偏好(composition bias)標(biāo)準(zhǔn)化。edgeR的calcNormFactors
函數(shù)使用TMM算法對(duì)DGEList標(biāo)準(zhǔn)化
genelist.norm <- calcNormFactors(genelist.filted)
注 大部分的mRNA-Seq數(shù)據(jù)分析用TMM標(biāo)準(zhǔn)化就行了,但是也有例外,比如說(shuō)single-cell RNA-Seq(Lun, Bach, and Marioni 2016), 還有就是global differential expression, 基因組一半以上的基因都是差異表達(dá)的,請(qǐng)盡力避免,(D. Wu et al. 2013), 不然就需要用到內(nèi)參進(jìn)行標(biāo)準(zhǔn)化了(Risso et al. 2014).
第四步: 實(shí)驗(yàn)設(shè)計(jì)矩陣(Design matrix), 類似于DESeq2中的design參數(shù)。 edgeR的線性模型和差異表達(dá)分析需要定義一個(gè)實(shí)驗(yàn)設(shè)計(jì)矩陣。很直白的就能發(fā)現(xiàn)是1vs0
design <- model.matrix(~0+group)
colnames(design) <- levels(group)
design
control KD
1 1 0
2 0 1
3 0 1
4 1 0
第五步: 估計(jì)離散值(Dispersion)。前面已經(jīng)提到負(fù)二項(xiàng)分布(negative binomial,NB)需要均值和離散值兩個(gè)參數(shù)。edgeR對(duì)每個(gè)基因都估測(cè)一個(gè)經(jīng)驗(yàn)貝葉斯穩(wěn)健離散值(mpirical Bayes moderated dispersion),還有一個(gè)公共離散值(common dispersion,所有基因的經(jīng)驗(yàn)貝葉斯穩(wěn)健離散值的均值)以及一個(gè)趨勢(shì)離散值
genelist.Disp <- estimateDisp(genelist.norm, design, robust = TRUE)
plotBCV(genelist.Disp)
還可以進(jìn)一步通過(guò)quasi-likelihood (QL)擬合NB模型,用于解釋生物學(xué)和技術(shù)性導(dǎo)致的基因特異性變異 (Lund et al. 2012; Lun, Chen, and Smyth 2016).
fit <- glmQLFit(genelist.Disp, design, robust=TRUE)
head(fit$coefficients)
注1 估計(jì)離散值這個(gè)步驟其實(shí)有許多estimate*Disp
函數(shù)。當(dāng)不存在實(shí)驗(yàn)設(shè)計(jì)矩陣(design matrix)的時(shí)候,estimateDisp 等價(jià)于 estimateCommonDisp 和 estimateTagwiseDisp 。而當(dāng)給定實(shí)驗(yàn)設(shè)計(jì)矩陣(design matrix)時(shí), estimateDisp 等價(jià)于 estimateGLMCommonDisp, estimateGLMTrendedDisp 和 estimateGLMTagwiseDisp。 其中tag與gene同義。
注2 其實(shí)這里的第三, 四, 五步對(duì)應(yīng)的就是DESeq2的DESeq
包含的2步,標(biāo)準(zhǔn)化和離散值估測(cè)。
第六步: 差異表達(dá)檢驗(yàn)(1)。這一步主要構(gòu)建比較矩陣,類似于DESeq2中的results
函數(shù)的 contrast 參數(shù)。
cntr.vs.KD <- makeContrasts(control-KD, levels=design)
res <- glmQLFTest(fit, contrast=cntr.vs.KD)
ig.edger <- res$table[p.adjust(res$table$PValue, method = "BH") < 0.01, ]
這里用的是glmQLFTest
而不是glmLRT
是因?yàn)榍懊嬗昧薵lmQLTFit進(jìn)行擬合,所以需要用QL F-test進(jìn)行檢驗(yàn)。如果前面用的是glmFit
,那么對(duì)應(yīng)的就是glmLRT
. 作者稱QL F-test更加嚴(yán)格。多重試驗(yàn)矯正用的也是BH方法。
后續(xù)就是提取顯著性差異的基因用作下游分析,做一些圖看看
topTags(res,n=10)
is.de <- decideTestsDGE(res)
summary(is.de)
plotMD(res, status=is.de, values=c(1,-1), col=c("red","blue"),
legend="topright")
第六步:差異表達(dá)檢驗(yàn)(2)。上面找到的顯著性差異的基因,沒(méi)有考慮效應(yīng)值,也就是具體變化了多少倍。我們也可用找表達(dá)量變化比較大的基因,對(duì)應(yīng)的函數(shù)是 glmTreat
。
tr <- glmTreat(fit, contrast=B.LvsP, lfc=log2(1.5))
s
使用limma進(jìn)行差異分析
經(jīng)過(guò)上面兩個(gè)方法的洗禮,基本上套路你也就知道了,我先簡(jiǎn)單小結(jié)一下,然后繼續(xù)介紹limma包的 voom 。
- 導(dǎo)入read count, 保存為專門的對(duì)象用于后續(xù)分析
- 原始數(shù)據(jù)過(guò)濾,根據(jù)標(biāo)準(zhǔn)化read count 或者 raw count 作為篩選標(biāo)準(zhǔn)
- raw read count 標(biāo)準(zhǔn)化
- 通過(guò)各種算法(如經(jīng)驗(yàn)貝葉斯,EM)預(yù)測(cè)dispersion離散值
- 廣義線性模型擬合數(shù)據(jù)
- 差異分析,也就是統(tǒng)計(jì)檢驗(yàn)部分
Limma原先用于處理基因表達(dá)芯片數(shù)據(jù),可是說(shuō)是這個(gè)領(lǐng)域的老大 :sunglasses: 。如果你仔細(xì)看edgeR導(dǎo)入界面,你就會(huì)發(fā)現(xiàn),edgeR有一部分功能依賴于limma包。Limma采用經(jīng)驗(yàn)貝葉斯模型( Empirical Bayesian model)讓結(jié)果更穩(wěn)健。
在處理RNA-Seq數(shù)據(jù)時(shí),raw read count先被轉(zhuǎn)成log2-counts-per-million (logCPM),然后對(duì)mean-variance關(guān)系建模。建模有兩種方法:
- 精確權(quán)重法(precision weights)也就是“voom"
- 經(jīng)驗(yàn)貝葉斯先驗(yàn)趨勢(shì)(empirical Bayes prior trend),也就是”limma-trend“
數(shù)據(jù)預(yù)處理: Limma使用edgeR的DGEList對(duì)象,并且過(guò)濾方法都是一致的,對(duì)應(yīng)edgeR的第一步,第二步, 第三步
library(edgeR)
library(limma)
group <- factor(c("control","KD","KD","control"))
genelist <- DGEList(counts=raw_count_filt[,2:5], group = group)
### filter base use CPM
keep <- rowSums(cpm(genelist) > 0.5 ) >=2
table(keep)
genelist.filted <- genelist[keep, ,keep.lib.sizes=FALSE]
### normalizaition
x <- calcNormFactors(x, method = "TMM")
差異表達(dá)分析: 使用”limma-trend“
design <- model.matrix(~0+group)
colnames(design) <- levels(group)
logCPM <- cpm(genelist.norm, log=TRUE, prior.count=3)
fit <- lmFit(logCPM, design)
fit <- eBayes(fit, trend=TRUE)
topTable(fit, coef=ncol(design))
差異表達(dá)分析: 使用”limma-voom“
### DGE with voom
v <- voom(genelist.norm, design, plot=TRUE)
#v <- voom(counts, design, plot=TRUE)
fit <- lmFit(v, design)
fit <- eBayes(fit)
all <- topTable(fit, coef=ncol(design), number=10000)
sig.limma <- all[all$adj.P.Val < 0.01, ]
fit <- treat(fit, lfc=log2(1.2))
topTreat(fit, coef=ncol(design))
如果分析基因芯片數(shù)據(jù),必須好好讀懂LIMMA包。
不同軟件包分析結(jié)果比較
基本上每一個(gè)包,我都提取了各種的顯著性基因,比較就需要用韋恩圖了,但是我偏不 :stuck_out_tongue: 我要用UpSetR.
library(UpSetR)
input <- fromList(list(edgeR=rownames(sig.edger), DESeq2=rownames(sig.deseq2), limma=rownames(sig.limma)))
感覺(jué)limma的結(jié)果有點(diǎn)奇怪,有生之年在折騰吧。
使用GFOLD進(jìn)行無(wú)重復(fù)樣本的差異基因分析
好吧,這部分我鴿了
參考文件
[1] Comparing the normalization methods for the differential analysis of Illumina high-throughput RNA-Seq data
[2] https://www.bioconductor.org/help/workflows/rnaseqGene/
[3] https://www.bioconductor.org/help/workflows/RnaSeqGeneEdgeRQL/