RNA-seq生物信息学转录组

RNA-seq数据分析

2018-11-16  本文已影响45人  7cbd6af5e9aa

话休絮烦

主要流程:

image

原始数据:ftp://ftp.ccb.jhu.edu/pub/RNAseq_protocol,后续都是对此数据进行分析的。

这个protocol首先从原始RAN-seq数据入手,输出:基因list,转录本,每个样本的表达量,能够表现差异表达基因的表格,显著性的计算。

  1. 使用HISAT将读段 reads 匹配到参考基因组上,使用者可以提供注释文件,但HISAT依旧会检测注释文件没有列出来的剪切位点;

  2. 比对上的reads将会被呈递给StringTie进行转录本组装,StringTie单独的对每个样本进行组装,在组装的过程中顺带估算每个基因及isoform的表达水平。

  3. 所有的转录本都被呈递给StringTie的merge函数进行merge,这一步是必须的,因为有些样本的转录本可能仅仅被部分reads覆盖,无法被第二步的StringTie组装出来。merge步骤可以创建出所有样本里面都有的转录本,方便下一步的对比。

4. merge的数据再一次被呈递给StringTie,StringTie可以利用merge的数据重新估算转录本的丰度,还能额外的提供转录本reads数量的数据给下一步的ballgown

  1. 最后一步:Ballgown从上一步获得所有转录本及其丰度,根据实验条件进行分类统计。

前期准备:软件安装

在按着paper操作之前建议先将软件bing/google一下,了解相关的安装等操作。可以自行将conda,R,以及相关的R的包搜索一下。

安装软件,我是用conda进行安装的:

$ conda install hisat2$ conda install stringtie$ conda install samtools

安装自己的R:

$ conda search R`
$ conda install -c r r`
$ export R_LIBS=$HOME/Rlib64`

R包安装:**Ballgown **(ps: 最近的R包安装有改动,按照文档上安装也可以)

$ R
> install.packages("devtools",lib="Rlib64",repos="https://mirrors.tuna.tsinghua.edu.cn/CRAN/")
> source("http://www.bioconductor.org/biocLite.R")
> biocLite(c("alyssafrazee/RSkittleBrewer","ballgown","genefilter","dplyr","devtools"))

数据处理设计

Read alignment with HISAT

总体上来说HISAT利用了BWA和Bowtie的算法,同时解决了mRNA中不存在内含子难以比对的问题,比对上代主流RNA-seq比对工具能快50倍,同时需求更少的内存<8G

参考运行的命令如下:

$ hisat2 -p 8 --dta -x chrX_data/indexes/chrX_tran -1 chrX_data/samples/ERR188044_chrX_1.fastq.gz -2 chrX_data/samples/ERR188044_chrX_2.fastq.gz -S ERR188044_chrX.sam

paper中有每个样本的命令

image

后面具体的命令详见文章中的PROCEDURE。

用Stringtie进行转录本组装量化

RNA-seq的分析依赖于精准的对于基因isoform的重建以及对于基因相对丰度的预测。继承于Cufflinks,StringTie相对于之前开发的工具更为准确,需求内存和耗时也更少。使用者一样可以使用注释文件来帮助StringTie运行,对于低丰度的数据比较有帮助。此时StringTie依旧会对非注释区域进行转录本的组装,所以注释文件在这里是可选选项。命令行如下:

$ samtools sort -@ 8 -o ERR188044_chrX.bam ERR188044_chrX.sam
$ stringtie -p 8 -G chrX_data/genes/chrX.gtf -o ERR188044_chrX.gtf –l ERR188044 ERR188044_chrX.bam

​转录本组装完成后,使用者可以利用gffcompare(StringTie工具包含)工具来得知有多少转录本和注释文件相同,又有多少新的转录本.

#input: gff or gtf format
transcripts.gtf
commandline example:
$ gffcompare -G -r chrX.gtf transcripts.gtf
#-r : reference
#-G :compare all transcripts
#-o :prefix
output file 1: gffcmp.annotated.gtf
# 显示StringTie组装的转录本与注释文件内的转录本的差别
output dile 2: gffcmp.stats
# 根据注释文件显示组装结果的准确性和阳性预测率

用Ballgown进行差异表达

​组装和定量完转录本之后自然需要进行基因表达差异分析,统计建模和可视化。R和Bioconductor提供了一揽子的工具处理这些任务,包括raw data的plot作图,数据的标准化,下游的统计建。此处使用Ballgown包作为承上启下的桥梁。

在R里面使用Ballgown处理需要得到:

而大多数的差异表达分析都会包括下面几个步骤:

Ballgown包可以完成以上的几个步骤并且可以联合R语言的其它操作进行分析

Ballgown使用:

实战示例

准备阶段

实际上本轮操作就是按照文章给的示例数据走了一遍流程:

文章中,为了减少计算时间,方便读者重复,作者截取了一批实验数据中能够匹配到chromosomeX上的数据作为示例数据,chromosomeX是一个基因相对较为丰富的染色体,可以占到基因组的5%左右。

首先是下载数据随后解压:

$nohup wget ftp://ftp.ccb.jhu.edu/pub/RNAseq_protocol/chrX_data.tar.gz 2>download.log &
$tar zxvf chrX_data.tar.gz

数据如下:


image.png

ps:解释一下geuvadis_phenodata.csv,他是每个sample的样本信息,从两地人群中(英格兰岛住民和约鲁巴住民)各取六个样,六个样又分为男女性别各三个(最少的生物学重复)。信息内容如下:


Phenodata.png

ids 代表是样本,sex和population是样本标签。

随后介绍一个骚命令:

HISAT2可以直接从NCBI下载sra格式的文件并作为输入文件格式
下面以ERR188245测序数据为例
$ hisat2 -p 8 --dta -x chrX_data/indexes/chrX_tran --sra-acc ERR188245 –S ERR188245_chrX.sam
可以说是相当的帮人偷懒了

在Hisat2 中的 Index文件可以从https://ccb.jhu.edu/software/hisat2/index.shtml 网站上下载下来。

如果需要建立官网上没有基因组的index,就需要需要使用Hisat2包里面的python脚本:
extract_splice_sites.py和extract_exons.py,从注释文件里面抽取出剪切位点和外显子信息

以后的步骤可以按文章中的一步步进行:

^Align the RNA-seq reads to the genome ● TIMING <20 min

1|   Map the reads for each sample to the reference genome:
$ hisat2 -p 8 --dta -x chrX_data/indexes/chrX_tran -1 chrX_data/samples/ERR188044_chrX_1.fastq.gz -2 chrX_data/samples/ERR188044_chrX_2.fastq.gz -S ERR188044_chrX.sam
2|   Sort and convert the SAM files to BAM:
$ samtools sort -@ 8 -o ERR188044_chrX.bam ERR188044_chrX.sam
samtools 1.8(conda)运行时出现问题,后来用系统的/usr/local/bin/samtools来解决
$ samtools
samtools: error while loading shared libraries: libtinfow.so.5: cannot open shared object file: No such file or directory
ln -s /usr/lib/libncurses.so.5 /lib64/libtinfo.so.5  
ln -s /usr/lib/libncurses.so.5 /usr/lib/libtinfo.so.5

^Assemble and quantify expressed genes and transcripts ● TIMING ~15 min

3|   Assemble transcripts for each sample:
$ stringtie -p 8 -G chrX_data/genes/chrX.gtf -o ERR188044_chrX.gtf -l ERR188044 ERR188044_chrX.bam
4|   Merge transcripts from all samples:
$ stringtie --merge -p 8 -G chrX_data/genes/chrX.gtf -o stringtie_merged.gtf chrX_data/mergelist.txt
5|   Examine how the transcripts compare with the reference annotation (optional):
$ gffcompare -r chrX_data/genes/chrX.gtf -G -o merged stringtie_merged.gtf
the -o option specifies the prefix to use for output files that gffcompare will create.
6|   Estimate transcript abundances and create table counts for Ballgown:
$ stringtie -e -B -p 8 -G assembled_reads/stringtie_merged.gtf -o ballgown/ERR188044/ERR188044_chrX.gtf mapped_reads/ERR188044_chrX.bam

^Run the differential expression analysis protocol ● TIMING ~5 min

7|   Load relevant R packages.
$ R
library(ballgown)
library(RSkittleBrewer)
library(genefilter)
library(dplyr)
library(devtools)
8|   Load the phenotype data for the samples. An example file called geuvadis_phenodata.csv is included with the
data files for this protocol (ChrX_data).
pheno_data = read.csv("chrX_data/geuvadis_phenodata.csv")

9|   Read in the expression data that were calculated by StringTie. To do this, we use the ballgown command with the following three parameters: the directory in which the data are stored (dataDir, which here is named simply ‘Ballgown’), a pattern that appears in the sample names (samplePattern) and the phenotypic information that we loaded in the previous step (pData). Here we present a standardized pipeline that can be used to perform standard differential expression analysis.
bg_chrX = ballgown(dataDir = "ballgown", samplePattern = "ERR", pData=pheno_data)

10| Filter to remove low-abundance genes. Another approach that has been used for gene expression analysis is to apply a variance filter. Here we remove all transcripts with a variance across samples less than one:
bg_chrX_filt = subset(bg_chrX,"rowVars(texpr(bg_chrX)) >1",genomesubset=TRUE)

11| Identify transcripts that show statistically significant differences between groups. As an example, we will look for transcripts that are differentially expressed between sexes, while correcting for any differences in expression due to the population variable. We set the getFC=TRUE parameter so that we can look at the confounder-adjusted fold change between the two groups.
For small sample sizes (n < 4 per group), it is often better to perform regularization. This can be done using the limma package in Bioconductor. The statistical test uses a cumulative upper quartile normalization.
results_transcripts = stattest(bg_chrX_filt, feature="transcript", covariate="sex", adjustvars = c("population"), getFC=TRUE, meas="FPKM")

12| Identify genes that show statistically significant differences between groups. For this we can run the same function that we used to identify differentially expressed transcripts, but here we set feature="gene" in the stattest command:
results_genes = stattest(bg_chrX_filt, feature="gene", covariate="sex", adjustvars = c("population"), getFC=TRUE, meas="FPKM")

13| Add gene names and gene IDs to the results_transcripts data frame:
results_transcripts = data.frame(geneNames=ballgown::geneNames(bg_chrX_filt), geneIDs=ballgown::geneIDs(bg_chrX_filt), transcriptNames=ballgown::transcriptNames(bg_chrX_filt), results_transcripts)

14| Sort the results from the smallest P value to the largest:
results_transcripts = arrange(results_transcripts,pval)
results_genes = arrange(results_genes,pval)

15| Write the results to a csv file that can be shared and distributed:
write.csv(results_transcripts, "chrX_transcript_results.csv", row.names=FALSE)
write.csv(results_genes, "chrX_gene_results.csv", row.names=FALSE)

Table 3 | Differentially expressed transcripts between sexes (q value <5%).

16| Identify transcripts and genes with a q value <0.05:
subset(results_transcripts,results_transcripts$qval<0.05)
subset(results_genes,results_genes$qval<0.05)
As shown in the tables, chromosome X has nine transcripts that are differentially expressed between the sexes (using a q value threshold of 0.05), three of which correspond to isoforms of known genes (XIST, TSIX and PNPLA4).

Table 4 | Differentially expressed genes between sexes (q value <5%).

^Data visualization ● TIMING variable

You can use Ballgown to visualize RNA-seq results in a variety of ways. The plots produced by Ballgown make it easier to view and compare expression data, and some commands can generate publication-ready figures.
17| Make the plots pretty. This step is optional, but if you do run it you will get the plots in the nice colors that we used to generate our figures:
tropical= c('darkorange', 'dodgerblue', 'hotpink', 'limegreen', 'yellow')
palette(tropical)

18| Show the distribution of gene abundances (measured as FPKM values) across samples, colored by sex (Fig. 3).
Ballgown stores a variety of measurements that can be compared and visualized. For this protocol, we will compare the FPKM measurements for the transcripts, but you can also obtain measurements for each splice junction, exon and gene in the data set. The first command below accesses the FPKM data. The plots will be easier to visualize if you first transform the FPKM data; here we use a log2 transformation that adds one to all FPKM values because log2(0) is undefined (second command below). The third command actually creates the plot:
fpkm = texpr(bg_chrX,meas="FPKM")
fpkm = log2(fpkm+1)
tiff(filename="fpkm.tiff")
boxplot(fpkm,col=as.numeric(pheno_data$sex),las=2,ylab='log2(FPKM+1)')
dev.off()

Figure 3 | Distribution of FPKM values across the 12 samples. Samples
from the same sex are shown in the same color: males in blue, and females
in orange.

19| Make plots of individual transcripts across samples. (Fig. 4). The first two commands below show the name of the transcript (NM_012227) and the name of the gene that contains it (GTP binding protein 6, GTPBP6):
ballgown::transcriptNames(bg_chrX)[12]
ballgown::geneNames(bg_chrX)[12]
tiff(filename="fpkm_transcript.tiff")
plot(fpkm[12,] ~ pheno_data$sex, border=c(1,2), main=paste(ballgown::geneNames(bg_chrX)[12],' : ', ballgown::transcriptNames(bg_chrX)[12]), pch=19, xlab="Sex", ylab='log2(FPKM+1)')
points(fpkm[12,] ~ jitter(as.numeric(pheno_data$sex)), col=as.numeric(pheno_data$sex))
dev.off()

Figure 4 | FPKM distributions in males and females for transcript NM_012227
from gene GTPBP6 (GTP binding protein 6), a gene that is known to be more highly expressed in males, displayed as box-and-whiskers plots.

20| Plot the structure and expression levels in a sample of all transcripts that share the same gene locus. For example, in Figure 5 we show all the transcripts from the gene that contains the first transcript, NR_001564, in Table 3. This is the 1,729th transcript in the Ballgown object according to the id column in the table, and we can easily find the gene ID of the transcript by using ballgown::geneIDs(bg_chrX)[1729]. This reveals that NR_001564 is an isoform of the gene XIST, which is known to be much more highly expressed in females than in males. We can see in Table 3 that other isoforms of this gene appear to be differentially expressed as well. We can plot their structure and expression levels by passing the gene name and the Ballgown object to the plotTranscripts function. The plot shows one transcript on each row, colored by its FPKM level. By default, the transcripts at that locus are colored by their expression levels in the first sample, but we can tell the plotTranscripts function which sample we are interested in—here we choose sample ERR188234:
tiff(filename="gene_expression.tiff")
plotTranscripts(ballgown::geneIDs(bg_chrX)[1729], bg_chrX, main=c('Gene XIST in sample ERR188234'), sample=c('ERR188234'))
dev.off()

Figure 5 | Structure and expression levels of five distinct isoforms of the XIST gene in sample ERR188234. Expression levels are shown in varying shades of yellow. The third isoform is expressed at a much higher level than the others, as indicated by the darker color.

21| We can also plot the average expression levels for all transcripts of a gene within different groups using the plotMeans function. We need to specify which gene to plot, which Ballgown object to use and which variable to group by. As an example, plot the second gene in Table 4, MSTRG.56, using the following command.
tiff(filename="plotMeans.tiff")
plotMeans('MSTRG.56', bg_chrX, groupvar="sex",legend=FALSE)
dev.off()

前面的重复命令我只列了一行,大家按照paper上的命令运行即可.
文章转自:RNA-seq数据分析---方法学文章的实战练习

上一篇下一篇

猜你喜欢

热点阅读