轉(zhuǎn)錄組入門(7):差異表達(dá)分析

這個(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ī)誤差。

image

:方差分析(Analysis of Variance, ANAOVA)名字聽起來(lái)好像是檢驗(yàn)方差,但其實(shí)是為了判斷樣本之間的差異是否真實(shí)存在,為此需要證明不同處理內(nèi)的方差顯著性大于不同處理間的方差。

線性回歸 一般是用于量化的預(yù)測(cè)變量來(lái)預(yù)測(cè)量化的響應(yīng)變量。比如說(shuō)體重與身高的關(guān)系建模:

image

當(dāng)然線性回歸也可用處理名義型或有序型因子(也就是離散變量)作為預(yù)測(cè)變量,如果要畫圖的話,就是下面這個(gè)情況。


image

如果我們需要通過(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")
})
image

如果經(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")
})
image

當(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í)可以用 tximportDESeqDataSetFromHTSeq 讀取單獨(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à)于 estimateCommonDispestimateTagwiseDisp 。而當(dāng)給定實(shí)驗(yàn)設(shè)計(jì)矩陣(design matrix)時(shí), estimateDisp 等價(jià)于 estimateGLMCommonDisp, estimateGLMTrendedDispestimateGLMTagwiseDisp。 其中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")
image

第六步:差異表達(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
image

使用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)))
image

感覺(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/

[4] https://www.bioconductor.org/help/workflows/RNAseq123/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,716評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,746評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,706評(píng)論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,036評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,203評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,725評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,451評(píng)論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,677評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,857評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,407評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,643評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容