轉自:http://blog.sciencenet.cn/home.php?mod=space&uid=635619&do=blog&id=884213
用tophat和cufflinks分析RNAseq數據
人的基因組一共有兩萬多個基因,但是這些基因不是每時每刻都在表達,在不同發育時期和不同組織中,基因的表達是不同的,一個檢測這些表達的有效的方法就是RNA-seq,它結合了下一代測序的技術來對細胞整個的mRNA進行測序,從而確定每一個基因的表達量和表達區段,主要用在分析不同條件下細胞內基因表達差異和分析基因表達的不同可變剪接上。
RNAseq分析大致分下面幾個步驟,首先要把測到的序列map到基因組上,然后根據map到的區段對細胞構建轉錄本,然后比較幾種細胞的轉錄本并且合并,最后衡量差異和可變間接和其他的分析。
1. Mapping
所有的序列分析的第一步,都是把測到的序列map到基因組上,這樣就能知道序列原來是在基因組的什么地方。mapping一般基于兩種快速索引算法,一種是哈希,MOSAIK,SOAP,SHRiMP用的就是這種算法,在對參照基因組建好哈希表之后,可以在常數次的運算里查找到給定序列的位置,雖然高效,但是由于基因組有些區段重復性很高,所以查找次數雖是常數,但有時會變得非常大,降低效率;還有一種叫Burrows-Wheeler變換,BWA,Bowtie和SOAP2都是用它,Burrows-Wheeler變換的設計比哈希更加巧妙,它最開始是一種文本壓縮算法,文本重復性越高,它的壓縮比就越大,這正好克服了基因組重復性高的問題,而且對于一個精確的序列查找,最多在給定序列的長度的次數里就能找到匹配,所以說基于Burrows-Wheeler變換的軟件在mapping里用得更加廣泛。可是RNAseq的map還有另外一個問題,那就是要允許可變剪接的存在,因為一條RNA不一定是一個外顯子表達出來的,也有可能是幾個外顯子結合在了一起,原來基因里的內含子被空了出來,這些內含子的長度從五十到十萬個堿基不等,如果直接用DNAseq的方法的話去在基因組里尋找,有些正好在兩個exon連接處的序列就會有錯配,而且有些在進化過程中遺漏下來的假基因是沒有intron的,這樣就導致有些序列會被map到假基因上去,使假基因的表達變得很高,所以,傳統的bwa和bowtie在RNAseq里都不是最好的選擇。
更加適合RNA mapping的軟件需要克服上面的兩個問題,Tophat,subread, STAR, GSNAP, RUM,
MapSplice都是為RNA測序而開發的
我只用過Tophat,它的新版Tophat2,在map的過程中分三個步驟:
如果基因注釋文件存在的話,它會先用注釋文件的轉錄組來map;
然后再對剩下的序列用bowtie進行普通的map;
最后再用bowtie里用過的所有的序列做剪接map,所以跟其他的軟件比起來會有比較高的正確率。
在運行tophat之前,要對參考基因組作index,samtools可以輕松搞定。
samtools faidx hg38.fasta
如果用的是tophat的話,還需要用bowtie2做index.
bowtie2-build genome.fa genome
hg38.fasta是人類的參考基因組,對參考基因組做index是為了提高mapping時查找的效率.
(對懶人來說,在這里可以直接下載到Bowtie打包做好的index文件,這樣就可以省略掉做index的步驟了 :D )
然后用Tophat開始mapping:
path/tophat
-p 8
-G $path_ref/Homo.GTF ?
-o tophat_output
$path_ref/hg38
single_end.fastq;
-p指定用幾個線程來工作,-G指定注釋文件的位置,-o指定輸出文件的路徑和文件名,最后兩個參數分別告訴參考基因組的位置和要map的fastq文件。在參考基因組里不用加.fa的后綴,因為程序還要去尋找其他后綴的index文件。
這步的運行時間是根據fastq文件的大小和設定的線程數來決定的,一般單端8個線程需要每G一個小時,雙端各4G,線程數設為16的話需要五六小時,運行完之后會在fastq文件的目錄里產生一個-o命令指定的文件夾,這個文件夾里有幾個bam文件和bed文件,還有一個summary,在下一步需要用到的是accepted_hits.bam這個文件。
注釋文件的后綴是GTF,它包含了所有已知的基因的外顯子在基因組中的位置。(hg38的注釋文件可以在這里下載)所以對于已經map在基因組上的序列,我們可以直接根據它的位置從注釋文件里查找它是不是屬于一個外顯子,或者是一個轉錄本。對于要不要在這一步提供注釋文件,各有各的看法,我用單端測序的序列用兩種方法做了實驗,發現他們有些差別:
有注釋的時候:
沒注釋的時候:
Mapping的最后一步是去除map到基因組中多于一處的序列,如果出現好幾個序列都map在完全相同的一個區段,那么就應該只保留一個這樣的序列,所以,只保留匹配最高的那一個。而且這樣的序列占很大一部分,這步也很簡單,samtools里的rmdup可以輕松解決:
samtools rmdup -s input.bam output.bam
-s小寫是告訴samtools,bam文件是單端測序的結果,不指定-s的話默認是雙端。
2 構建轉錄本
Mapping完了以后,cufflinks就可以把map到基因組里的序列組裝成一個轉錄組了,這個轉錄組理論上包含了所有當時細胞里的所有mRNA,組裝好的轉錄組包含了可能的剪切信息和所有轉錄的表達量,這個表達量是根據map到基因組的序列的總數和每個轉錄片斷的長度進行歸一化的,聽起來比較難懂,它是對于在轉錄片斷里的每一千個堿基對,在每一百萬個成功map的序列中,map在這一千個堿基對上的序列的比例,fragments
per kilobase of transcript per million mapped fragments (FKPM)。
FPKM是這么算出來的:
在公式里,C代表的是map在這一千個堿基對上的序列的個數,N是所有成功map的序列的個數,L是轉錄片斷的長度。
命令:
~/software/cufflinks-2.2.1/cufflinks
-g ?/wrk/ref/Homo_sapiens.GRCh38.78.gtf
-o ../cufflinks_sample1
-p 8
accepted_hits.bam;
然后在輸出的cufflinks_sample1文件夾里會產生四個文件,genes.fpkm_tracking, isoforms.fpkm_tracking, skipped.gtf 和 transcripts.gtf,下一步需要用到的就是transcripts.gtf這個文件,transcripts.gtf就是這個樣品的轉錄組。
3。合并轉錄組
為了比較不同樣本間的差異,需要把實驗組和對照組的轉錄組合并起來,cuffmerge不僅可以用來合并兩個或者多個轉錄組,還能把注釋過后的基因組的信息也合并起來,從而找到新的基因可變剪接,提高合并轉錄組的質量。有人說需要在合并之前用cuffcompare,但從官網的說法來看沒有是必要的。它們最大的區別是,cuffcompare不改變原有樣本里的轉錄片段,只是將他們的位置作比較,輸出的combined文件也只是包含了所有的小轉錄片段,而cuffmerge會尋找幾個樣本間的不同,試著把幾個樣本里的轉錄片段從頭開始盡可能拼接成更長更完整的片段,所以cuffmerge的輸出merge文件比cuffcompare輸出的combined文件更有說服力。兩個小工具的作用都是為了生成一個合并的注釋文件給接下來要用的cuffdiff。
命令:
~/software/cufflinks-2.2.1/cuffmerge
-g /wrk/ref/Homo_sapiens.GRCh38.78.gtf
-s /wrk/ref/hg38.fa
-p 16
assembly_list.txt
在最后輸入的assemby_list.txt文件里,要寫上所有需要合并的transcripts.gtf文件的路徑,兩個和多個都可以,然后cuffmerge就會生成一個merged文件夾,里面有一個merged.gtf,這個文件就是合并好的轉錄組。
4. 基因差異表達分析
最后一步就是分析可變剪接和差異表達了,用到的小工具叫cuffdiff,這個的輸入比較復雜,不僅需要上一步的merge文件,還需要每個樣本的mapping結果的bam文件,最后還需要對每一個bam文件對應的樣本按順序起一個名字作為標簽,標簽之間記得用逗號。
~/software/cufflinks-2.2.1/cuffdiff
-o diff22rv1/
-labels vap,vcap_neg_control
-p 32
-u merged_asm/merged.gtf ?
vcap/accepted_hits.bam vcapneg/accepted_hits.bam
在這個例子里只有一個case和一個control,所以我們只要兩個標簽,在最后按順序輸入bam文件。
diff的輸出比較多,他會對每個基因,每個轉錄片段,每個編碼序列,和每個基因的不同剪接體進行FPKM,個數和樣本間差異進行分析,最后生成幾組不同的文件,按照不同的分析需求,就可以試著往下分析了。
到現在結果就基本都差不多了,剩下的主要是作圖了,發現新的基因的可變剪接,發現差異表達的基因,對差異表達的基因做富集分析等等。作圖也是非常重要的環節,再好的結果也需要有好的圖表示出來,可變剪接我也沒做過,但是如果做差異表達的話,CummRbund是一個非常兼容cufflinks的作圖工具。
CummRbund是R里的一個包,用來分析cuffdiff的結果非常方便,在安裝好這個包之后,要做的只是把路徑改在cuffdiff生成結果的文件夾里,然后在R里運行這兩行代碼就好了。
library(cummeRbud) ? ? ?#這一行需要在R里加載已經安裝好的cummeRbud包
cuff <- readCufflinks() ? ?#這一行就告訴R把所有cuffdiff生成的結果讀入cuff這個變量里。
下一步就可以作差異表達的基因的熱圖了,這里稍微復雜一點:
#取前100個差異最顯著的基因,或者取多少個隨你便,標準是t檢驗的p值,p值越小差異就越大。
gene.diff <- diffData(genes(cuff))
gene.diff.top <- gene.diff[order(gene.diff$p_value),][1:100,]
#找到這前100個差異基因的ID
myGeneIds <- gene.diff.top$gene_id
# 然后根據基因ID來得到基因的名字
myGenes <- getGenes(cuff, myGeneIds)
# 是畫圖
csHeatmap(myGenes, cluster="both")
作出的圖基本上是這個樣子的:
接下來就可以進行富集分析了,有很多種方法,可以直接把基因的名字導出來后上傳到david來分析,也可以用bioconductor里的Goseq包來分析,詳細的goseq用法的代碼有點長,我以后會寫,如果需要的話可以直接去這里下載我使用Goseq時的代碼。
Cuff系列的分析流程是這篇文章介紹的,它里面也有非常詳細的命令和例子,可以去這里看看。Differential
gene and transcript expression analysis of RNA-seq experiments with
TopHat and Cufflinks