RNA_seq(1)植物转录组差异基因分析简单练习

RNA_seq植物实战

Author : yujia

目录:

  1. 概述
  2. salmon工具完成索引建立和生物学定量
  3. subread工具完成序列比对和定量
  4. DESeq2差异基因分析
  5. 总结

一、 概述

  • 练习数据:数据来源于拟南芥,共16个样本,处理分为4组(0day,1day,2day,3day)
  • 练习目的:熟悉两套RNA-seq差异基因表达分析的流程(salmon流程和subread流程)
  • 数据存放地址:/public/study/mRNAseq/tair/
  • 软件调用地址:/usr/local/bin/miniconda3/bin/
  • 实战项目来源地址:Jimmy学长的生信菜鸟团博客:http://www.bio-info-trainee.com/2809.html (一个植物转录组项目的实践)

二、salmon工具完成索引建立和生物学定量

  salmon是一款不通过序列比对就可以快速完成生物学定量的RNA-seq数据分析工具。它的使用流程包括两步:1.建立索引 2.对reads进行生物学定量(quantification)。所以,如果我们使用salmon工具来做生物学定量的话,会非常的快速简洁。以下是代码流程:

First step:使用salmon < index >选项对转录组建立索引

利用salmon建立索引的基本语法是:

salmon index -t athal.fa.gz -i athal_index
#index 代表建立索引
#-t .fa文件的路径
#-i 索引存放路径

所以我们的代码如下:

/usr/local/bin/miniconda3/bin/salmon index -t /public/study/mRNAseq/tair/Arabidopsis_thaliana.TAIR10.28.cdna.all.fa.gz -i /trainee/home/yjxiang/practice/index_file

执行后,会得到如下文件:

-rw-rw-r-- 1 yjxiang yjxiang  14K Aug 13 14:40 duplicate_clusters.tsv
-rw-rw-r-- 1 yjxiang yjxiang 751M Aug 13 14:40 hash.bin
-rw-rw-r-- 1 yjxiang yjxiang  357 Aug 13 14:40 header.json
-rw-rw-r-- 1 yjxiang yjxiang  115 Aug 13 14:40 indexing.log
-rw-rw-r-- 1 yjxiang yjxiang  412 Aug 13 14:40 quasi_index.log
-rw-rw-r-- 1 yjxiang yjxiang  116 Aug 13 14:40 refInfo.json
-rw-rw-r-- 1 yjxiang yjxiang 7.8M Aug 13 14:40 rsd.bin
-rw-rw-r-- 1 yjxiang yjxiang 247M Aug 13 14:40 sa.bin
-rw-rw-r-- 1 yjxiang yjxiang  63M Aug 13 14:40 txpInfo.bin
-rw-rw-r-- 1 yjxiang yjxiang   96 Aug 13 14:40 versionInfo.json

Second step:使用salmon < quant >选项完成生物学定量

salmon中进行生物学定量的基本语法是:

salmon quant -i athal_index -l A -1 samp_1.fastq.gz -2 samp_2.fastq.gz -p 8 -o quants/sample_quant
# quant是salmon中进行生物学定量的选项
# -i The -i argument tells salmon where to find the index
# -l A tells salmon that it should automatically determine the library type of the sequencing reads
#The -1 and -2 arguments tell salmon where to find the left and right reads for this sample
# -p 8 argument tells salmon to make use of 8 threads 
# -o argument specifies the directory where salmon’s quantification results sould be written

由于我们一共有16个样本,要一一进行生物学定量,因此编写一个bash脚本完成批量处理:

#脚本地址存储在/trainee/home/yjxiang/practice

#!/bin/bash
index=/trainee/home/yjxiang/practice/index_file
for fn in ERR1698{194..209};
do
samp=`basename ${fn}`
echo "Processing sample ${samp}"
/usr/local/bin/miniconda3/bin/salmon quant -i $index -l A \
        -1 ${samp}_1.fastq.gz \
        -2 ${samp}_2.fastq.gz \
        -p 6 -o /trainee/home/yjxiang/practice/quants/${samp}_quant
done 

运行脚本之后,得到如下结果:

drwxrwxr-x 5 yjxiang yjxiang 4.0K Aug 13 15:28 ERR1698194_quant
drwxrwxr-x 5 yjxiang yjxiang 4.0K Aug 13 15:38 ERR1698195_quant
drwxrwxr-x 5 yjxiang yjxiang 4.0K Aug 13 15:39 ERR1698196_quant
drwxrwxr-x 5 yjxiang yjxiang 4.0K Aug 13 15:39 ERR1698197_quant
drwxrwxr-x 5 yjxiang yjxiang 4.0K Aug 13 15:40 ERR1698198_quant
drwxrwxr-x 5 yjxiang yjxiang 4.0K Aug 13 15:40 ERR1698199_quant
drwxrwxr-x 5 yjxiang yjxiang 4.0K Aug 13 15:41 ERR1698200_quant
drwxrwxr-x 5 yjxiang yjxiang 4.0K Aug 13 15:42 ERR1698201_quant
drwxrwxr-x 5 yjxiang yjxiang 4.0K Aug 13 15:43 ERR1698202_quant
drwxrwxr-x 5 yjxiang yjxiang 4.0K Aug 13 15:43 ERR1698203_quant
drwxrwxr-x 5 yjxiang yjxiang 4.0K Aug 13 15:44 ERR1698204_quant
drwxrwxr-x 5 yjxiang yjxiang 4.0K Aug 13 15:44 ERR1698205_quant
drwxrwxr-x 5 yjxiang yjxiang 4.0K Aug 13 15:45 ERR1698206_quant
drwxrwxr-x 5 yjxiang yjxiang 4.0K Aug 13 15:46 ERR1698207_quant
drwxrwxr-x 5 yjxiang yjxiang 4.0K Aug 13 15:46 ERR1698208_quant
drwxrwxr-x 5 yjxiang yjxiang 4.0K Aug 13 15:47 ERR1698209_quant

每个文件夹里都有对应样本的quant结果,以样本ERR1698209为例,文件夹里含有这些文件,quant.sf 文件就是我们得到的定量结果:

drwxrwxr-x 2 yjxiang yjxiang 4.0K Aug 13 15:47 aux_info
-rw-rw-r-- 1 yjxiang yjxiang  307 Aug 13 15:47 cmd_info.json
-rw-rw-r-- 1 yjxiang yjxiang  551 Aug 13 15:47 lib_format_counts.json
drwxrwxr-x 2 yjxiang yjxiang 4.0K Aug 13 15:47 libParams
drwxrwxr-x 2 yjxiang yjxiang 4.0K Aug 13 15:00 logs
-rw-rw-r-- 1 yjxiang yjxiang 1.8M Aug 13 15:47 quant.sf

查看一下quant.sf,常见的TPM值、Numreads都在里面:

$ head -n 5 quant.sf
Name    Length  EffectiveLength TPM     NumReads
ATMG00010.1     462     301.089 0.000000        0.000000
ATMG00030.1     324     166.891 0.000000        0.000000
ATMG00040.1     948     786.477 0.000000        0.000000
ATMG00050.1     396     236.034 0.000000        0.000000

salmon流程到此就结束了,根据得到的quant文件,我们可以在后续利用DESeq2, edgeR, limma等包进行下游的差异基因分析。现在我们来看subread工具如何完成RNA-seq数据的生物学定量。

三、subread工具完成序列比对和生物学定量

subread是一个能快速进行序列比对和转录组定量的工具,我们使用它进行转录组定量一共需要三个步骤:1.建立索引 2.序列比对 3.使用featureCounts进行定量 。代码流程如下:

First step:对基因组建立索引

subread建立索引的基本语法如下:

#Build an index for the reference genome (you may provide a single FASTA file including all the reference sequences):
subread-buildindex -o my_index chr1.fa chr2.fa ...

所以我们的代码如下:

#先解压基因组文件到我的个人目录里
#gunzip -c /public/study/mRNAseq/tair/Arabidopsis_thaliana.TAIR10.28.dna.genome.fa.gz > /trainee/home/yjxiang/practice/raw_data/Arabidopsis_thaliana.TAIR10.28.dna.genome.fa

#然后使用subread软件的subread-buildindex完成索引的建立
/trainee/home/yjxiang/tools/subread-1.6.2-source/bin/subread-buildindex -o /trainee/home/yjxiang/practice/subread_workflow/Ara_genome_index_file /trainee/home/yjxiang/practice/raw_data/Arabidopsis_thaliana.TAIR10.28.dna.genome.fa

运行代码后,得到的索引文件如下:

-rw-rw-r-- 1 yjxiang yjxiang  29M Aug 16 12:29 Ara_genome_index_file.00.b.array
-rw-rw-r-- 1 yjxiang yjxiang 231M Aug 16 12:29 Ara_genome_index_file.00.b.tab
-rw-rw-r-- 1 yjxiang yjxiang  629 Aug 16 12:29 Ara_genome_index_file.files
-rw-rw-r-- 1 yjxiang yjxiang 363K Aug 16 12:29 Ara_genome_index_file.log
-rw-rw-r-- 1 yjxiang yjxiang   76 Aug 16 12:29 Ara_genome_index_file.reads

Second step:序列比对

我们使用subread里集成的subjunc来完成序列比对,关于subjunc的官方说明如下:

The Subjunc aligner is an RNA-seq read aligner, specialized in detecting exon-exon junctions and performing full alignments for the reads (exon-spanning reads in particular).

subjunc的使用基本语法:

#Report uniquely mapped reads only (by default). Mapping output includes BAM files and exon-exon junctions discovered from the data. 
subjunc -T 5 -i my_index -r reads1.txt -o subjunc_results.bam
#Report up to three alignments for each multi-mapping read:
subjunc --multiMapping -B 3 -T 5 -i my_index -r reads1.txt -o subjunc_results.bam
#Detect indel of up to 16bp:
subjunc -I 16 -i my_index -r reads1.txt -o subjunc_results.bam
#Map paired-end reads and discover exon-exon junctions:
subjunc -d 50 -D 600 -i my_index -r reads1.txt -R reads2.txt -o subjunc_results.bam

由于样本量较多,所以我们也写一个脚本,来完成这个序列比对任务:

#bash脚本批量完成:
#! /bin/bash
subjunc="/trainee/home/yjxiang/tools/subread-1.6.2-source/bin/subjunc"; 
index='/trainee/home/yjxiang/practice/subread_workflow/index_file/Ara_genome_index_file';
for fn in ERR1698{194..209};
do
    sample=`basename ${fn}`
    echo "Processing sample ${sampe}" 
    $subjunc -i $index \
        -r ${sample}_1.fastq.gz \
        -R ${sample}_2.fastq.gz \
        -T 5 -o /trainee/home/yjxiang/practice/subread_workflow/mapping_out/${sample}_subjunc.bam
done

序列比对完成之后,我们会得到如下文件(截取部分):

-rw-rw-r-- 1 yjxiang yjxiang 799M Aug 16 12:57 ERR1698194_subjunc.bam
-rw-rw-r-- 1 yjxiang yjxiang 1.1M Aug 16 12:57 ERR1698194_subjunc.bam.indel.vcf
-rw-rw-r-- 1 yjxiang yjxiang 2.6M Aug 16 12:57 ERR1698194_subjunc.bam.junction.bed
-rw-rw-r-- 1 yjxiang yjxiang 1.1G Aug 16 13:01 ERR1698195_subjunc.bam
-rw-rw-r-- 1 yjxiang yjxiang 1.4M Aug 16 13:01 ERR1698195_subjunc.bam.indel.vcf
-rw-rw-r-- 1 yjxiang yjxiang 3.6M Aug 16 13:01 ERR1698195_subjunc.bam.junction.bed

.bam就是我们比对得到的文件,可以发现,目录下还有.vcf和.bed文件,那是因为subjunc可以检测indel和exon-exon junction
现在我们就可以开始做生物学定量了。

Third step:featureCounts完成生物学定量

featureCounts是一款可以进行生物学定量的软件,它集成在subread的package里了,官方关于它的说明如下:

featureCounts is a highly efficient general-purpose read summarization program that counts mapped reads for genomic features such as genes, exons, promoter, gene bodies, genomic bins and chromosomal locations. It can be used to count both RNA-seq and genomic DNA-seq reads.

我们就使用它来完成定量操作。需要注意的是:使用featureCounts,我们需要提供gtf格式的注释或者SAF格式的注释,大概像这样:

GeneID Chr Start End Strand
497097 chr1 3204563 3207049 -
497097 chr1 3411783 3411982 -
497097 chr1 3660633 3661579 -

它的基本语法如下,以双端测序数据为例(具体详情可见官网):

#Summarize paired-end reads and count fragments (instead of reads):
featureCounts -p -t exon -g gene_id -a annotation.gtf -o counts.txt mapping_results_PE.bam

所以,我们的代码如下:

gff3='/public/study/mRNAseq/tair/Arabidopsis_thaliana.TAIR10.28.gff3.gz'
gtf='/public/study/mRNAseq/tair/Arabidopsis_thaliana.TAIR10.28.gtf.gz'
featureCounts='/trainee/home/yjxiang/tools/subread-1.6.2-source/bin/featureCounts'

nohup $featureCounts -T 5 -p -t exon -g gene_id -a $gtf -o  /trainee/home/yjxiang/practice/subread_workflow/counts_out/counts_id.txt /trainee/home/yjxiang/practice/subread_workflow/mapping_out/*.bam &

代码运行后,就可以查看我们的定量结果了:
featureCounts会输出两份文件,一个是summary,一个是count reads的结果.counts_id.txt是我们后续用作差异基因分析的文件。

-rw-rw-r-- 1 yjxiang yjxiang 6.3M Aug 16 13:52 counts_id.txt
-rw-rw-r-- 1 yjxiang yjxiang 2.3K Aug 16 13:52 counts_id.txt.summary

四、DESeq2差异基因分析

获得reads counts之后,我们就可以开展差异基因分析了。我们以subread中的featureCounts工具得到的counts_id.txt为例,来进行后续的差异基因分析。
目前常见的差异基因分析工具有DESeq2、limma包等等,此处以DESeq2为工具来进行差异基因的筛选。

First step:获取表达矩阵和分组信息

进行差异基因分析之前,首先要获取表达矩阵和分组信息。我们的表达矩阵是刚才用featureCounts定量得到的counts_id.txt ,经过格式处理之后,是这样(部分截取):
<img src="C:\Users\admin\Desktop\表达矩阵.png" width="600" hegiht="400" align=center />
第一列是基因ID,之后的列都是样本ID
每一行代表不同的基因在不同样本中的表达量.


我们选day0和day1做比较,
为了方便,分组矩阵的制作我在R里面完成,输入如下代码:

us_count<-read.csv("C:\\Users\\admin\\Desktop\\RNA_seq_Ara_counts_day1_day0.csv",head=T,row.names=1) #输入表达矩阵数据路径
us_count<-round(us_count,digits=0) #将输入数据取整

#准备
us_count<-as.matrix(us_count) #将数据转换为矩阵格式
condition<-factor(c("day0","day0","day0","day0","day1","day1","day1","day1")) ## 设置分组信息,建立环境(8个样本,2组处理)
coldata<-data.frame(row.names=colnames(us_count),condition)  

coldata #展示coldata内容
condition  #展示环境

上面的代码运行之后,我们的分组信息就是这样哒:
<img src="C:\Users\admin\Desktop\分组信息.png" width="600" hegiht="400" align=center />

现在,就可以正式使用DESeq2做差异基因分析了,总共其实只有三步:

  • 构建dds矩阵
  • 对dds矩阵进行标准化
  • 提取结果并绘制火山图

代码如下:

library(DESeq2) #使用library函数加载DEseq2包
##构建dds矩阵 
dds<-DESeqDataSetFromMatrix(us_count,coldata,design=~condition)
head(dds) #查看构建好的矩阵

##进行差异分析
dds<-DESeq(dds) #对原始的dds进行标准化
resultsNames(dds)  #查看结果名称
res<-results(dds) #用results函数提取结果,并赋值给res变量
summary(res) #查看结果
plotMA(res,ylim=c(-2,2)) 
mcols(res,use.names=TRUE)

plot(res$log2FoldChange,res$pvalue) #绘制火山图

#提取差异基因
res <- res[order(res$padj),]
resdata <-merge(as.data.frame(res),as.data.frame(counts(dds,normalize=TRUE)),by="row.names",sort=FALSE)
deseq_res<-data.frame(resdata)
up_diff_result<-subset(deseq_res,padj < 0.05 & (log2FoldChange > 1)) #提取上调差异表达基因
down_diff_result<-subset(deseq_res,padj < 0.05 & (log2FoldChange < -1)) #提取下调差异表达基因

write.csv(up_diff_result,"C:\\Users\\admin\\Desktop\\上调_day0_VS_day1_diff_results.csv") #输出上调基因
write.csv(down_diff_result,"C:\\Users\\admin\\Desktop\\下调_day0_VS_day1_diff_results.csv") #输出下调基因

至此,差异基因就成功提取了,看看火山图:
<img src="C:\Users\admin\Desktop\火山图.png" width="600" hegiht="400" align=center />

五、 总结

自己之前处理线虫数据主要是用的RSEM(加bowtie2)来做RNA-seq的序列比对和生物学定量,但是没有接触过salmon和subread。这次使用这两个工具完成了植物的RNA-seq实战,对这些工具有了更深的理解,以后自己如果要开发相关软件,也要多用用,比较工具之间的优劣。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容