转录组入门(5): 序列比对

简介: 欢迎来GitHub上fork,一起进步: https://github.com/xuzhougeng比对软件很多,首先大家去收集一下,因为我们是带大家入门,请统一用hisat2,并且搞懂它的用法。

欢迎来GitHub上fork,一起进步: https://github.com/xuzhougeng

比对软件很多,首先大家去收集一下,因为我们是带大家入门,请统一用hisat2,并且搞懂它的用法。
直接去hisat2的主页下载index文件即可,然后把fastq格式的reads比对上去得到sam文件。
接着用samtools把它转为bam文件,并且排序(注意N和P两种排序区别)索引好,载入IGV,再截图几个基因看看!
顺便对bam文件进行简单QC,参考直播我的基因组系列。

前面四篇基本都算是准备工作,从这一篇开始才算进入了RNA-Seq数据分析的核心部分。

比对

比对还是不比对

在比对之前,我们得了解比对的目的是什么?RNA-Seq数据比对和DNA-Seq数据比对有什么差异?
RNA-Seq数据分析分为很多种,比如说找差异表达基因或寻找新的可变剪切。如果找差异表达基因单纯只需要确定不同的read计数就行的话,我们可以用bowtie, bwa这类比对工具,或者是salmon这类align-free工具,并且后者的速度更快。

但是如果你需要找到新的isoform,或者RNA的可变剪切,看看外显子使用差异的话,你就需要TopHat, HISAT2或者是STAR这类工具用于找到剪切位点。因为RNA-Seq不同于DNA-Seq,DNA在转录成mRNA的时候会把内含子部分去掉。所以mRNA反转的cDNA如果比对不到参考序列,会被分开,重新比对一次,判断中间是否有内含子。


img_59b04ea771c4a0e9d3735d3ebb881eda.jpe

工具抉择

在2016年的一篇综述A survey of best practices for RNA-seq data analysis,提到目前有三种RNA数据分析的策略。那个时候的工具也主要用的是TopHat,STARBowtie.其中TopHat目前已经被它的作者推荐改用HISAT进行替代。

img_095f972737fbe20838858e1fdc74c8ab.jpe

最近的Nature Communication发表了一篇题为的 Gaining comprehensive biological insight into the transcriptome by performing a broad-spectrum RNA-seq analysis的文章--被称之为史上最全RNA-Seq数据分析流程,也是我一直以来想做的事情,只不过他们做的超乎我的想象。文章中在基于参考基因组的转录本分析中所用的工具,是TopHat,HISAT2和STAR, 结论就是HISAT2 找到junction正确率最高,但是在总数上却比TopHat和STAR少。从这里可以看出HISAT2的二类错误( 纳伪)比较少,但是一类错误( 弃真)就高起来。
唯一比对而言,STAR是三者最佳的,主要是因为它不会像TopHat和HISAT2一样在PE比对不上的情况还强行把SE也比对到基因组上。而且在处理较长的read和较短read的不同情况,STAR的稳定性也是最佳的。
速度而言,HISAT2比STAR和TopHat2平均快上2.5~100倍。
img_63c8d928d1fe871754ebfcf6e471f283.jpe

如果学习RNA-Seq数据分析,上面提到的两篇文献是必须要看上3遍以上的,而且建议每隔一段时间回顾一下。但是如果就比对工具而言,基本上就是HISAT2和STAR选一个就行。

下载index

首先,问自己一个问题,为什么比对的时候需要用到index?这里强烈建议大家去看Jimmy写的bowtie算法原理探究bowtie算法原理探究。但是只是建议,你不需要真的去看,反正你也看不懂。

高通量测序遇到的第一个问题就是,成千上万甚至上几亿条read如果在合理的时间内比对到参考基因组上,并且保证错误率在接受范围内。为了提高比对速度,就需要根据参考基因组序列,经过BWT算法转换成index,而我们比对的序列其实是index的一个子集。当然转录组比对还要考虑到可变剪切的情况,所以更加复杂。

因此我门不是直接把read回贴到基因组上,而是把read和index进行比较。人类的index一般都是有现成的,我建议大家下载现成的,我曾经尝试过用服务器自己创建index,花的时间让我怀疑人生。

img_9c55e1f14fb61efe7da391613f6ec02f.jpe
cd referece && mkdir index && cd index
wget ftp://ftp.ccb.jhu.edu/pub/infphilo/hisat2/data/hg19.tar.gz
tar -zxvf hg19.tar.gz

觉得电脑配置还行的,或者是没有现成index的,可以通过HISAT2的方法进行创建

# 其实hisat2-buld在运行的时候也会自己寻找exons和splice_sites,但是先做的目的是为了提高运行效率
extract_exons.py gencode.v26lift37.annotation.sorted.gtf > hg19.exons.gtf &
extract_splice_sites.py gencode.v26lift37.annotation.gtf > hg19.splice_sites.gtf &
# 建立index, 必须选项是基因组所在文件路径和输出的前缀
hisat2-build --ss hg19.splice_sites.gtf --exon hg19.exons.gtf genome/hg19/hg19.fa hg19

我的是i7-7700处理器,内存是64G,运行的资源效率如下:


img_cf0d75edae28af0681290be8a3bd27ac.jpe

正式比对

hisat2基本用法就是hisat2 [options]* -x <hisat2-idx> {-1 <m1> -2 <m2> | -U <r> } [-S <hit>],基本就是提供index的位置,PE数据或者是SE数据存放位置。然而其他可选参数却是进阶的一大名堂。新手就用默认参数呗。

因为RNA-Seq数据是从 SRR3589957 ~ SRR3589962,6个样本的PE数据,也就是有6次循环,可以写脚本,也可以直接在命令行里运行
如下命令运行所在目录为/mnt/f/Data/,我的参考基因组的index数据存放在/mnt/f/Data/reference/index/hg19/,而RNA-seq数据存放在/mnt/f/Data/RNA-Seq下。比对结果会存放在/mnt/f/Data/RNA-Seq/aligned

mkdir -p RNA-Seq/aligned
for i in `seq 57 62`
do
    hisat2 -t -x reference/index/hg19/genome -1 RNA-Seq/SRR35899${i}_1.fastq.gz -2 SRR35899${i}_2.fastq.gz -S RNA-Seq/aligned/SRR35899${i}.sam &
done

&会把任务丢到后台,所以会同时执行这3个比对程序,如果CPU和内存承受不住,去掉&一个个来。比对这一步是非常消耗内存资源的,这是比对工具要将索引数据放入内存引起的。我有64G内存,理论上可以同时处理20个PE数据。在我的电脑配置下,大致花了2个小时同时才完成这一步.

img_d19697402fe6db3b22c2c92f4a996388.jpe

基本参数说明

在数据比对的时候,可以安静一下读读HISAT2的额外选项,主要分为如下几块

  • 主要参数,一定要填写的内容
  • 输入选项, 对结果影响不大
  • 比对选项,主要是--n-ceil决定模糊字符的数量
  • 得分选项, 当一个read比对到不同部位时,确定那个才是最优的。基于mismatch, soft-cliping, gap得分。
  • 可变剪切比对选项, 你要决定exon,intron的长度,GT/AG的得分,还可以提供已知的可变剪切和外显子gtf文件,
  • 报告选项,确定要找多少的位置
  • PE选项, 与gap有关的参数
  • 输出选项,建议加上-t记录时间,其他就是压缩格式,不影响比对
  • SAM选项, 主要是决定SAM的header应该添加哪些内容
  • 性能选项和其他选项不考虑

: soft clipping 指的是比对的read只有部分匹配到参考序列上,还有部分没有匹配上。也就是一个100bp的read,就匹配上前面20 bp或者是后面20bp,或者是后面20bp比对的效果不太好。

因此影响比对结果就是比对选项得分选项可变剪切选项PE选项,在有生之年我应该会写一片文章介绍这些选项对结果的影响。

HISAT2输出结果

比对之后会输出如下结果,解读一下就是全部数据都是100%的,96.68%的配对数据一次都没有比对,1.23%的数据比是唯一比对,2.09%是多个比对。然后96.68%一次都没有比对的数据,如果不按照顺序来,有0.05%的比对。之后把剩下的部分用单端数据进行比对的话,95.20%数据没比对上,3.60%的数据比对一次,1.20%比对超过一次。零零总总的加起来是8%的比对!!!


img_3c9aeb1faf0c582c6a169cfdfd531756.jpe

这个总体比对率让我开始怀疑人生,怎么可能呀,我翻了翻输出记录,发现有几个结果的比对率超过90%呀。我思索了片刻,惊醒这个实验好像是用人类和小鼠都做了一遍。于是又去GEO上查了一下记录,恍然大悟,差点翻车。

Samples 9-15 are mRNA-seq to determine effect of AKAP95 knockdown in human 293 cells (9-11) or mouse ES cells (12-15).

img_4f1693b777d072b4c4cbea61b4de3cbd.jpe

同时我反思了一下出错的原因,我默认这个实验是KO和非KO各3个重复,其实文章的实验设计并不是如此,可见理解实验设计很重要,于是我把数据下载这一部分进行了完善。

mkdir -p RNA-Seq/aligned
for i in `seq 56 58`
do
    hisat2 -t -x reference/index/hg19/genome -1 RNA-Seq/SRR35899${i}_1.fastq.gz -2 SRR35899${i}_2.fastq.gz -S RNA-Seq/SRR35899${i}.sam &
done

如上是修改后的代码

SAMtools三板斧

SAM(sequence Alignment/mapping)数据格式是目前高通量测序中存放比对数据的标准格式,当然他可以用于存放未比对的数据。所以,SAM的格式说明

而目前处理SAM格式的工具主要是SAMTools,这是Heng Li大神写的.除了C语言版本,还有Java的Picard,Python的Pysam,Common lisp的cl-sam等其他版本。SAMTools的主要功能如下:

  • view: BAM-SAM/SAM-BAM 转换和提取部分比对
  • sort: 比对排序
  • merge: 聚合多个排序比对
  • index: 索引排序比对
  • faidx: 建立FASTA索引,提取部分序列
  • tview: 文本格式查看序列
  • pileup: 产生基于位置的结果和 consensus/indel calling

最常用的三板斧就是格式转换,排序,索引。而进阶教程就是看文档提高。

for i in `seq 56 58`
do
    samtools view -S SRR35899${i}.sam -b > SRR35899${i}.bam
    samtools sort SRR35899${i}.bam -o SRR35899${i}_sorted.bam
    samtools index SRR35899${i}_sorted.bam
done

  • -S是最新版samtools为了兼容以前版本写的,所以可以省去
  • 0.1.19版本和最新版有比较大差别,请注意版本

Jimmy说样我们仔细判断sam排序两种方式的不同,因此我截取前面100行数据,分别排序然后查看结果。

head -1000 SRR3589957.sam > test.sam
samtools view -b  test.sam > test.bam
samtools view test.bam | head
img_493db8769d87dc9719782b261458dba8.jpe

默认排序是根据染色体位置

samtools sort test.bam default
samtools view default.bam | head
img_0a08f1faa406cb6028fbaa1599c3a9c7.jpe

Sort alignments by leftmost coordinates, or by read name when -n is used

samtools sort -n test.bam sort_left
samtools view sort_left.bam | head
img_74cfe464e159b7db1b870f7783a56f7d.jpe

也就说说默认按照染色体位置进行排序,而-n参数则是根据read名进行排序。当然还有一个-t 根据TAG进行排序。

说说samtools view

三板斧的view是一个非常实用的子命令,除了之前的格式转换以外,还能进行数据提取和提取。
比如说提取1号染色体1234-123456区域的比对read

samtools view SRR3589957_sorted.bam chr1:1234-123456 | head

img_74cfe464e159b7db1b870f7783a56f7d.jpe

在比如搭配 flag(0.1.19版本没有)和 flagstat,使用 -f-F参数提取不同匹配情况的read。
flag是一种描述read比对情况的标记,一种12种,可以搭配使用。

0x1    PAIRED    paired-end (or multiple-segment) sequencing technology
0x2    PROPER_PAIR    each segment properly aligned according to the aligner
0x4    UNMAP    segment unmapped
0x8    MUNMAP    next segment in the template unmapped
0x10    REVERSE    SEQ is reverse complemented
0x20    MREVERSE    SEQ of the next segment in the template is reverse complemented
0x40    READ1    the first segment in the template
0x80    READ2    the last segment in the template
0x100    SECONDARY    secondary alignment
0x200    QCFAIL    not passing quality controls
0x400    DUP    PCR or optical duplicate
0x800    SUPPLEMENTARY    supplementary alignment

可以先用flagstat看下总体情况

samtools flagstat SRR3589957_sorted.bam
img_6f89de9853f0e9782c57cf2a065d9b17.jpe

也就是说如果我想用samtools筛选恰好配对的read,就需要用0x10

samtools view -b -f 0x10 SRR3589957_sorted.bam chr1:1234-123456  > flag.bam
samtools flagstat flag.bam

我应该会在有生之年写一篇文章好好介绍samtools。

比对质控(QC)

还是在A survey of best practices for RNA-seq data analysis里面,提到了人类基因组应该有70%~90%的比对率,并且多比对read(multi-mapping reads)数量要少。另外比对在外显子和所比对链(uniformity of read coverage on exons and the mapped strand)的覆盖度要保持一致。

常用工具有

我们就用RSeQC吧,毕竟使用python写的工具,天生的亲切感,而且安装非常方便。

# Python2.7环境下
pip install RSeQC

一共有如下几个文件,根据命名就知道功能是啥了。

先对bam文件进行统计分析, 从结果上看是符合70~90的比对率要求。

bam_stat.py -i SRR3589956_sorted.bam
img_cfa7b374cd07f1ef091993040e7f6035.jpe

基因组覆盖率的QC需要提供bed文件,可以直接RSeQC的网站下载,或者可以用gtf转换

read_distribution.py -i RNA-Seq/aligned/SRR3589956_sorted.bam -r reference/hg19_RefSeq.bed
img_a711cf2dc7b9fbd9136090e035d76301.jpe

IGV查看

载入参考序列,注释和BAM文件,随便看看吧。

img_eb5d0a74c9cb0da843c3abf37ac5e6b0.jpe

最后请允许我给自己的小密圈打个广告,如果你非常支持我的创作,想和我保持联系的话。


img_5bdda857aa92355dddea44820783d45d.png
目录
相关文章
|
3月前
|
数据可视化
单细胞转录组|scATAC-seq 数据整合
单细胞转录组|scATAC-seq 数据整合
69 0
|
5月前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
302 1
|
7月前
|
机器学习/深度学习 人工智能 API
人工智能平台PAI 操作报错合集之DSSM负采样时,输入数据不同,被哈希到同一个桶里,导致生成的embedding相同如何解决
阿里云人工智能平台PAI (Platform for Artificial Intelligence) 是阿里云推出的一套全面、易用的机器学习和深度学习平台,旨在帮助企业、开发者和数据科学家快速构建、训练、部署和管理人工智能模型。在使用阿里云人工智能平台PAI进行操作时,可能会遇到各种类型的错误。以下列举了一些常见的报错情况及其可能的原因和解决方法。
|
算法 数据处理 数据库
生物学经典Blast序列比对算法原理,如何在R语言和Python中实现序列的比对分析?
生物学经典Blast序列比对算法原理,如何在R语言和Python中实现序列的比对分析?
|
7月前
|
C++
【SPSS】两配对样本T检验分析详细操作教程(附案例实战)
【SPSS】两配对样本T检验分析详细操作教程(附案例实战)
720 0
【SPSS】两配对样本T检验分析详细操作教程(附案例实战)
|
7月前
|
安全
基因序列比对的注意点
基因序列比对的注意点
|
7月前
【SPSS】两独立样本的极端反应检验和两配对样本的非参数检验详细操作教程(附案例实战)
【SPSS】两独立样本的极端反应检验和两配对样本的非参数检验详细操作教程(附案例实战)
211 0
|
7月前
|
数据挖掘 C++
【SPSS】单样本K-S检验和两独立样本K-S检验详细操作教程(附案例实战)
【SPSS】单样本K-S检验和两独立样本K-S检验详细操作教程(附案例实战)
891 0
视觉智能平台中,如果你想批量清空人脸样本库里的样本数据
视觉智能平台中,如果你想批量清空人脸样本库里的样本数据
158 5
|
数据可视化 算法 Java
生信教程:多序列比对
生信教程:多序列比对
211 1