2.1.RNA-seq Analysis

本章为RNA-seq数据处理的说明教程,分为Prepare Data Matrix和Data Analysis两大部分。

  • Part I.Prepare Data Matrix:完成样本的Reads Processing、Remove RNA and Mapping工作,得到Mapped reads(bam)并绘制质量控制相关图,计算RNA-seq reads count matrix。

  • Part II.Data analysis:完成differential expression分析和differential splicing分析(选做)。

    • 利用DESeq2和edgeR进行差异表达分析

    • 对差异表达基因进行通路注释并作图

    • 利用rMATS计算splicing events

    • 对差异剪接基因进行通路注释并作图

Part I.Prepare Data Matrix

0)数据说明

SHAPE-MaP测序结果中不加NAI的样本可以作为RNA-seq样本,这里我们以WT中未受外部刺激的三个样本(CD1_1,CD1_2,CD1_3)为例,路径为/data/TA_QUIZ_RNA_regulation/data/riboshape_liulab_batch4/SHAPE-MaP/WT/control/nouvb/

P-cluster上使用队列提交任务的方法可参考2.0.Programming Tools中的2)使用Cluster队列提交任务部分。

1)Mapping

这里我们通过脚本进行样本的批量处理,分为fastqc,trimmed,remove_rRNA,mapping_expression,read_counts,Count_matrix 6个脚本,每个脚本路径我们在下面详细说明。

1.1) QC of raw data

这步操作主要是检查数据的质量。 参考脚本:/data/TA_QUIZ_RNA_regulation/script/PartI.RNA-seq_analysis/1.fastqc.sh

Input :

Software/Parameters:

fastqc

Output :

  • \*.html:质控报告解读的网页文件。

  • \*.zip:网页文件中画图的数值及图片。

因此fastqc结果仅看html即可。

1.2) Cut adaptor & trim long read

这里使用fastp默认参数,对数据自动进行全方位质控。 参考脚本:/data/TA_QUIZ_RNA_regulation/script/PartI.RNA-seq_analysis/2.trimmed.sh

Input :

Software/Parameters:

fastp

usage: fastp -i <in1> -o <out1> [-I <in1> -O <out2>] [options...]

Output : eg:

  • CD1_1.clean.1.fastq.gz:fastp质控后数据。

  • CD1_1.html/CD1_1.json:质控结果报告文件。

1.3) Clean rRNA reads

使用bowtie将上一步中得到的fastp质控后的*.clean.[1/2].fastq.gz文件比对到rRNA index上,除去这部分比对到rRNA index的部分,从而得到不含rRNA reads的文件.fastq文件。 参考脚本:/data/TA_QUIZ_RNA_regulation/script/PartI.RNA-seq_analysis/3.remove_rRNA.sh

Input :

  • 1b)操作结束后的\*.clean.[1/2].fastq.gz

Software/Parameters :

bowtie可以Clean rRNA reads得到不含rRNA reads的.fastq文件。

reference :

bowtie -n 0 -y -a --norc --best --strata -S -p 4 -l 15 \
--un  ~/*.rm_rRNA.fq \
 ~/Arabidopsis_thaliana.TAIR10.34.rRNA \
-1  ~/*.clean.1.fastq.gz \
-2  ~/*.clean.2.fastq.gz \
 ~/*.aligned_rRNA.txt

Output

  • *rm_rRNA_[1/2].fq:不含rRNA reads的.fastq文件,位于fastq文件夹。

  • *aligned_rRNA.txt:map到rRNA index上。

fastqctrimmedremove_rRNA,差异表达分析与差异剪接分析使用的数据与方法完全一致。在Mapping过程中有部分参数选择不同,差异表达分析比差异剪接分析多调用一个--outFilterType BySJout参数。下面仅介绍differential expression的mapping过程。

1.4) Mapping

1.4a) Generating genome index

这里我们采用的参考基因组序列文件Arabidopsis_thaliana.TAIR10.dna.toplevel.fa与参考基因组注释文件Arabidopsis_thaliana.TAIR10.34.gtf(文件路径见数据介绍部分)来构建genome index。 参考脚本:/data/TA_QUIZ_RNA_regulation/script/PartI.RNA-seq_analysis/generate_STAR_genome_index.sh

Software/Parameters:

STAR

reference :

STAR \
--runMode genomeGenerate \
--runThreadN 4 \
--genomeDir genomedir \
--genomeFastaFiles Arabidopsis_thaliana.TAIR10.dna.toplevel.fa \
--sjdbGTFfile Arabidopsis_thaliana.TAIR10.34.gtf

output: /path/to/genomeDirgenome index

1.4b) Running mapping jobs

我们使用STAR软件对1.b)操作后得到的*rm_rRNA_[1/2].fq进行比对。 参考脚本:/data/TA_QUIZ_RNA_regulation/script/PartI.RNA-seq_analysis/1.1.differential_expression/4.mapping_expression.sh

Software/Parameters :

STAR

reference:

STAR \
--runThreadN 8 \
--limitBAMsortRAM 20000000000 \
--outFilterType BySJout \
--outFilterMismatchNmax 10  \
--genomeDir genomedir \
--readFilesIn .rm_rRNA_1.fq.gz \
.rm_rRNA_2.fq.gz \
--readFilesCommand 'zcat' \
--outFileNamePrefix  name_prefix \
--outSAMtype BAM Unsorted \
--quantMode TranscriptomeSAM GeneCounts \
--outSAMattributes All  \
--outSAMstrandField intronMotif \
--outBAMcompression 6 \
--outReadsUnmapped Fastx

output :

  • .Aligned.out.sorted :比对结果文件。

  • .toTranscriptome.out.sorted:比对到转录本上的reads组成的文件。

1.4c) samtools sort &index

为了防止STARsort过程中,内存溢出错误,这里我们设置limitBAMsortRAM 20000000000;outSAMtype BAM Unsorted。不在STAR过程中进行排序,而是利用samtools单独进行排序。 这里我们使用samtools sort -T按TAG值排序,随后使用samtools index对排序后的序列建立索引。输出为bai文件。

output :

  • .Aligned.sortedByCoord.out.bam

  • .Aligned.toTranscriptome.out.sorted.bam

  • .Aligned.sortedByCoord.out.bam.bai

  • .Aligned.toTranscriptome.out.sorted.bam.bai

注:differential_expressiondifferential_splicingmapping过程仅在--outFilterType BySJout命令选择上不同。

1.5) Get read counts

这里我们使用mapping后并且经过samtools排序索引后的比对结果文件作为输入。使用featureCounts软件来计算reads数。 参考脚本:/data/TA_QUIZ_RNA_regulation/script/PartI.RNA-seq_analysis/1.1.differential_expression/5.read_counts.sh

input :

  • .Aligned.sortedByCoord.out.bam

Software/Parameters :

featureCounts

由于数据采用的建库方法是非链特异性建库方法,因此这里使用-s 0模式。读者也可以使用RSeQCinfer_experiment.py自行判断一下数据是否是非链特性数据。 我们分别选用不同feature-type模式CDS/exon来分别计算.featurecounts.txt.featurecounts.all.txt

output :

  • .featurecounts.all.txt:统计exon,用于差异表达分析。

  • .featurecounts.txt:统计CDS,用于差异翻译分析(与Riboseq数据统计方法统一)。

1.6) Merge count matrix

参考脚本:/data/TA_QUIZ_RNA_regulation/script/PartI.RNA-seq_analysis/1.1.differential_expression/6.1.Count_matrix.sh

这里使用python脚本,将1e)中的计算的.featurecounts.all.txt整理成counts matrix。提取其中的Geneid(第一行)、counts(最后一行)等信息,将['CD1_1','CD1_2','CD1_3']3个样本的信息整合在一起,得到count_all.txtcount_all.txt的每行为一个基因,每列为一个样本,矩阵中间的数据为表达值。

这里建议使用 pythonpandas包来提取文件信息。

示例:

Part II.Data analysis

0)数据说明

在这里我们给出了6个样本的bam和count_matrix结果。差异表达主要利用6个样本的count_matrix文件,差异剪接分析主要利用6个样本的bam文件。

  • 6个样本Bam文件:/data/TA_QUIZ_RNA_regulation/result/PartI.RNA-seq_analysis/differential_splicing/3.mapping_splicing/control

  • 6个样本的count_matrix:/data/TA_QUIZ_RNA_regulation/result/PartI.RNA-seq_analysis/differential_expression/exp_count_matrix/count_all.txt

1) Differential expression

这里分别使用edgeRDESeq2来进行差异表达分析。

1.1) Using DESeq2

参考脚本:/data/TA_QUIZ_RNA_regulation/script/PartI.RNA-seq_analysis/1.1.differential_expression/6.2.DESeq2.R

input:

  • count_all.txt:2.b)中产生的表达矩阵。

提取其中的WT进行分析。

总的来说分为三步:构建dds矩阵,标准化,以及进行差异分析

1.1a) 构建dds矩阵

 dds <- DESeqDataSetFromMatrix(countData = cts, colData = coldata, design= ~ batch + condition) 
 #~在R里面用于构建公式对象,~左边为因变量,右边为自变量。

countData :表达矩阵,通过read count计算后并融合生成的矩阵,行为各个基因,列为各个样本,中间为计算reads或fragment得到的整数。 colData :样本信息矩阵,一个数据框,第一列是样本名称,第二列是样本的处理情况,即condition,condition的类型是一个factor。 design:差异比较矩阵,差异比较矩阵就是告诉差异分析函数是要从要分析哪些变量间的差异,简单来说就是说明哪些是对照,哪些是处理。

1.1b) 标准化DESeq()

对原始dds进行normalizeDESeq包含三步,estimation of size factors(estimateSizeFactors)estimation of dispersion(estimateDispersons)Negative Binomial GLM fitting and Wald statistics(nbinomWaldTest),可以分布运行,也可用一步到位,最后返回 results可用的DESeqDataSet对象。

分步:

(1) 归一化系数sizeFactor

dds <- estimateSizeFactors(dds)

(2) 估计基因的离散程度estimateDispersions

dds<- estimateDispersions(dds)

(3) 统计检验,差异分析

dds <- nbinomWaldTest(dds)

或者一步就位:

dds <- DESeq(dds)

DESeq2假定基因的表达量符合负二项分布,有两个关键参数,总体均值和离散程度α值。α值衡量均值和方差之间的关系。

1.1c) 获得分析结果,差异分析

# 获取分析结果
res<-results(dds)
# 对结果按照padj值大小排序
res <- res[order(res$padj),]
# 筛选出其中 padj<0.05 & log2FoldChange绝对值大于1的基因。
diff_gene_deseq_col0 <- subset(res,padj<0.05&(log2FoldChange>1|log2FoldChange< -1))
  • 1)默认使用样本信息的最后一个因子与第一个因子进行比较。

  • 2)返回一个数据库res,包含6列,baseMean、log2FC、lfcSE、stat、pvalue、padj。

  • 3)baseMean表示所有样本经过归一化系数矫正的read counts=(counts/sizeFactor)的均值。

  • 4)log2Foldchange表示该基因的表达发生了多大的变化,是估计的效应大小effect size。变化倍数=2^log2Foldchange。DESeq2在差异分析的过程中已经考虑了样本本身的差异,其最终提供的log2FC只包含了分组间的差异

  • 5) lfcSE 是对log2Foldchange估计的标准误差估计,效应大小估计具有不确定性。

  • 6)stat是Wald统计量,是由log2Foldchange/标准差所得。

  • 7)pvalue和padj分别代表原始p值及经过校正后的p值。

output:

  • wt_gene_list.txt:差异表达的基因列表。

  • wt_rawdata.csv:DESeq2产生的原始结果文件。

results:

1.2) Using edgeR

参考脚本:/data/TA_QUIZ_RNA_regulation/script/PartI.RNA-seq_analysis/1.1.differential_expression/6.3.edgeR.R

input :

  • count_all.txt:2.b)中产生的表达矩阵。 提取其中的WT进行分析。

DESeq2分析一致,edgeR分析也分大致分三步

1.2a) 构建DGEList 对象

dgListGroups <- c(rep("Control",3),rep("Treat",3))
dgList <- DGEList(counts=countData_col0, genes=rownames(countData_col0),group=factor(dgListGroups))
  • countData :表达矩阵

  • group :分组信息数据

  • genes :基因名称

1.2b) 过滤掉low counts数据

可以在构建DGEList之前就已经构建完毕,或者可以根据以下方法进行构建。

# 筛掉raw_count在6个样本中总数少于100的基因。
col0_raw_count <- col0_raw_count[rowSums(col0_raw_count)>100,]

1.2c) 使用TMM算法对DGEList标准化

dgList <- calcNormFactors(dgList, method="TMM")
countsPerMillion <- cpm(dgList, normalized.lib.sizes=TRUE)

design.mat <- model.matrix(~0 + dgList$sample$group)
colnames(design.mat) <- levels(dgList$sample$group)

# 估计common离散度
d2 <- estimateGLMCommonDisp(dgList, design=design.mat)
# 估计trended离散度
d2 <- estimateGLMTrendedDisp(d2, design=design.mat)
# 估计tagwise离散度
d2 <- estimateGLMTagwiseDisp(d2, design=design.mat)

# glmFit 和 glmLRT 函数是配对使用的,用于 likelihood ratio test (似然比检验)
fit <- glmFit(d2, design.mat)
lrt <- glmLRT(fit,contrast=c(-1,1))

# 计算差异基因得到结果
edgeR_result <- topTags(lrt,n=nrow(dgList))

results:

每列依次是geneslogFClogCPMLRPValueFDR。可根据logFCFDR的值对结果进行筛选。

最终的结果如下:

5.DESeq2/
├── wt
    ├── wt_gene_list.txt
    └── wt_rawdata.csv

6.edgeR/
├── wt
    └── wt_rawdata.csv

1.3) Function analysis

通过差异表达分析得到的gene_list,可以在KEGG、GO等基因注释数据库中进行功能分析。这里不做详细讨论,大家自行分析。

2) Differential splicing

2.1) Using rMATS

这里我们使用mapping后并且经过samtools排序索引后的比对结果文件进行后续分析,6个数据路径为/data/TA_QUIZ_RNA_regulation/result/PartI.RNA-seq_analysis/differential_splicing/3.mapping_splicing/control。注意差异表达和差异分析的mapping`不同。

使用rMATS来计算splicing event,参考脚本:/data/TA_QUIZ_RNA_regulation/script/PartI.RNA-seq_analysis/1.2.differential_splicing/5.rMATS.sh。

input:

  • wt.noUVB.txt

  • wt.UVB.txt

mapping后的bam文件路径,文件内以逗号分隔重复样本的bam文件名。

eg:wt.noUVB.txt: ~/CD1_1Aligned.sortedByCoord.out.bam,~/CD1_2Aligned.sortedByCoord.out.bam,~/CD1_3Aligned.sortedByCoord.out.bam

Software/Parameters:

rmats.py

reference:

python rmats.py \
--b1 ~/wt.noUVB.txt \
--b2 ~/wt.UVB.txt \
--gtf ~/Arabidopsis_thaliana.TAIR10.34.gtf \
--od ~/wt.UVB-vs-noUVB \
-t paired \
--readLength 151 \ 
--cstat 0.0001 \
--tmp wt.UVB-vs-noUVB/tmp \
--nthread 4 \
--variable-read-length

output: rMATS的结果文件是以各个可变剪切事件的分布。 XX 指代SE\RI\MXE\A5SS\A3SS 五项可变剪切时间。

  • 1) fromGTF.XX.txt 系列: 直接从GTF文件和数据文件读出的结果。

  • 2) fromGTF.novelEvents.XX.txt : 从数据文件发现的新的可变剪切事件。

  • 3) XX.MATS.JC.txt 和XX.MATS.JECE.txt,是JC.raw.input.XX.txt 和 JCEC.raw.input.XX.txt 经过统计模型分析后的结果,多了P值和FDR值。

  • 4) JC和JCEC的区别在于前者考虑跨越剪切位点的reads,而后者不仅考虑前者的reads还考虑到只比对到第一张图的条纹区(没有跨越剪切位点的reads)。

XX.MATS.JC.txt中包含的信息比较多,以SE.MATS.JC.txt为例:

  • 5) 1-5列分别为:ID、GeneID、geneSymbol、chr、strand。

  • 6) 6-11列分别为外显子位置信息:分别为exonStart_0base,exonEnd,upstreamES,upstreamEE,downstreamES,downstreamEE。

  • 7) 13-16列 展示两组样品在IJC(inclusion junction) 和SJC(skipping junction counts)下的counts数,重复样本的结果以逗号分隔:列名分别为IJC_SAMPLE_1,SJC_SAMPLE_1,IJC_SAMPLE_2,SJC_SAMPLE_2。

  • 8) lncFormLen和SkipFormLen分别是inclusion form和skipping form的有效长度值,虽然有计算公式,还是要根据reads跨越时的具体情况来定。

  • 9) IncLevel 可被认作为exon inclusion level(φ),是exon inclusion isoform在总(Exon inclusion isoform +exon skipping isoform 所占比例)。

  • 10) IncLevelDifference则是指两组样本IncLevel的差异,如果一组内多个样本,那么则是各自组的均值之间差值。

2.2) Process splicing events

上述通过rmats.py计算出来的数据是未经过过滤筛选的。下面我们将对rMATS脚本进行过滤,使用位于/data/TA_QUIZ_RNA_regulation/script/PartI.RNA-seq_analysis/1.2.differential_splicing路径下的splice_sig_psi.py脚本。

过滤指标p value <0.05 & psi>0.1

input :

  • ~/wt.UVB-vs-noUVB:rMATS结果的输出文件夹路径。

reference:

# p value<0.05 & psi>0.1
python splice_sig_psi.py PValue 0.05 0.1 wt.UVB-vs-noUVB wt.UVB-vs-noUVB_filtered_psi_0.1

output:

  • wt.UVB-vs-noUVB_filtered_psi_0.1

2.3) Function analysis

从,wt.UVB-vs-noUVB_filtered_psi_0.1中提取过滤后的不同剪接事件的差异剪接基因的xx_gene_list。从服务器上下载下来。到DAVID Functional Annotation Tool网站上进行分析。

2.3a) DAVID Functional Annotation Tool

点击shortcut to DAVID Tool->Function annotation clustering 左侧出现Upload Gene List界面。

按照提示步骤提交文件即可,注:Step2选择TAIR_ID拟南芥基因ID,最后Submit list得到功能注释结果。

2.3b) splicing events画图

使用rmats2sashimiplot软件对差异剪接事件进行可视化处理。 参考脚本:/data/TA_QUIZ_RNA_regulation/script/PartI.RNA-seq_analysis/1.2.differential_splicing/7.1.rmats2sashimiplot-wt.UVB-vs-noUVB.all.sh。

input:

  • ~/wt.UVB-vs-noUVB_filtered_psi_0.1/${event}.MATS.JCEC.txt:3.c)经过过滤的rMATS结果输出文件夹中各种剪接事件的结果文件。

  • ~/*Aligned.sortedByCoord.out.bam:1.c.2)中sort后的mapped reads的bam文件。

Software/Parameters:

rmats2sashimiplot

reference:

rmats2sashimiplot \
--b1 CD1_1.Aligned.sortedByCoord.out.bam,CD1_2.Aligned.sortedByCoord.out.bam,CD1_3.Aligned.sortedByCoord.out.bam \
--b2 CD0_1.Aligned.sortedByCoord.out.bam,CD0_2.Aligned.sortedByCoord.out.bam,CD0_3.Aligned.sortedByCoord.out.bam \
--l1 Control_wt_noUVB \
--l2 Treat_wt_UVB\
--exon_s 1 \
--intron_s 2 \
--min-counts 0 \
-t $event \
-e $inputDir/${event}.MATS.JCEC.txt \
-o wt.UVB-vs-noUVB_sashimiplot_all/$event

其中$event 代表着{SE,A5SS,A3SS,MXE,RI}不同剪接事件。

output: wt.UVB-vs-noUVB_sashimiplot_all

其中每个文件为画图结果,开头ID与{event}.MATS.JCEC.all.sashimiplot.txt文件第一列ID相对应。

Last updated