转录组入门(6): reads计数
点击此处查看最新的网赚项目教程
要求
实现这个功能的软件也很多,还是烦请大家先自己搜索几个教程,入门请统一用htseq-count,对每个样本都会输出一个表达量文件。
需要用脚本合并所有的样本为表达矩阵。参考:生信编程直播第四题:多个同样的行列式文件合并起来
对这个表达矩阵可以自己简单在excel或者R里面摸索,求平均值,方差。
看看一些生物学意义特殊的基因表现如何,比如GAPDH,β-ACTIN等等。
理论基础
在上篇的比对中,我们需要纠结是否真的需要比对,如果你只需要知道已知基因的表达情况,那么可以选择alignment-free工具(例如salmon, sailfish),如果你需要找到noval isoforms,那么就需要alignment-based工具(如HISAT2, STAR)。到了这一篇的基因(转录本)定量,需要考虑的因素就更加多了,以至于我不知道如何说清才能理清逻辑。
定量分为三个水平
在基因水平上,常用的软件为HTSeq-count,featureCounts,BEDTools, Qualimap, Rsubread, GenomicRanges等。以常用的HTSeq-count为例,这些工具要解决的问题就是根据read和基因位置的overlap判断这个read到底是谁家的孩子。值得注意的是不同工具对multimapping reads处理方式也是不同的,例如HTSeq-count就直接当它们不存在。而Qualimpa则是一人一份,平均分配。
对每个基因计数之后得到的count matrix再后续的分析中,要注意标准化的问题。如果你要比较同一个样本(within-sample)不同基因之间的表达情况,你就需要考虑到转录本长度,因为转录本越长,那么检测的片段也会更多,直接比较等于让小孩和大人进行赛跑。如果你是比较不同样本(across sample)同一个基因的表达情况,虽然不必在意转录本长度,但是你要考虑到测序深度(sequence depth),毕竟测序深度越高,检测到的概率越大。除了这两个因素外,你还需要考虑GC%所导致的偏差,以及测序仪器的系统偏差。目前对read count标准化的算法有RPKM(SE), FPKM(PE),TPM, TMM等,不同算法之间的差异与换算方法已经有文章进行整理和吐槽了。但是,有一些下游分析的软件会要求是输入的count matrix是原始数据,未经标准化,比如说DESeq2,这个时候你需要注意你上一步所用软件会不会进行标准化。
在转录本水平上,一般常用工具为Cufflinks和它的继任者StringTie, eXpress。这些软件要处理的难题就时转录本亚型(isoforms)之间通常是有重叠的,当二代测序读长低于转录本长度时,如何进行区分?这些工具大多采用的都是expectation maximization(EM)。好在我们有三代测序。
上述软件都是alignment-based,目前许多alignment-free软件,如kallisto, silfish, salmon,能够省去比对这一步,直接得到read count,在运行效率上更高。不过最近一篇文献[1]指出这类方法在估计丰度时存在样本特异性和读长偏差。
在外显子使用水平上,其实和基因水平的统计类似。但是值得注意的是为了更好的计数,我们需要提供无重叠的外显子区域的gtf文件[2]。用于分析差异外显子使用的DEXSeq提供了一个Python脚本(dexseq_prepare_annotation.py)执行这个任务。
小结
计数分为三个水平: gene-level, transcript-level, exon-usage-level
标准化方法: FPKM RPKM TMM TPM
输出表达矩阵
在RNA-Seq分析中,每一个基因就是一个feature(特征?),而基因被认为是它的所有外显子的和集。在可变剪切分析中,可以单独把每个外显子当作一个feature。而在ChIP-Seq分析中,feature则是预先定义的结合域。但是确定一个read到底属于哪一个feature有时会非常棘手。因此HTSeq提供了三种模式,示意图见前一幅图
基本用法非常的简单:
# 安装
conda install htseq
# 使用
# htseq-count [options]
htseq-count -r pos -f bam RNA-Seq/aligned/SRR3589957_sorted.bam reference/gencode.v26lift37.annotation.sorted.gtf > SRR3589957.count
用一个循环处理多个BAM文件(在/mnt/f/Data目录下)
mkdir -p RNA-Seq/matrix/
for i in `seq 56 58`
do
htseq-count -s no -r pos -f bam RNA-Seq/aligned/SRR35899${i}_sorted.bam reference/gencode.v26lift37.annotation.sorted.gtf > RNA-Seq/matrix/SRR35899${i}.count 2> RNA-Seq/matrix/SRR35899${i}.log
done
运行的时间会比较久,所以可以去了解不同参数的用法了,其中比较常用的为:
gene_id “ENSG00000223972.5_2”; transcript_id “ENST00000456328.2_1”; gene_type “transcribed_unprocessed_pseudogene”; gene_name “DDX11L1”; transcript_type “processed_transcript”; transcript_name “DDX11L1-002”; exon_number 2; exon_id “ENSE00003582793.1_1”; level 2;…
Jimmy的伏笔
我们这次分析是人类mRNA-Seq测序的结果,但是我们其实只下载了3个sra文件。一般而言RNA-Seq数据分析都至少要有2个重复,所以必须要有4个sra文件才行。我在仔细读完文章的方法这一段以后,发现他们有一批数据用的是其他课题组的: For 293 cells, the mRNA-seq results of the control samples include (1) those from the doxycycline-treated parental Flp-In T-REx 293 cells by us and (2) those from the doxycycline-treated control Flp-In T-REx 293 cells performed by another group unrelated to us (sample GSM1095127 in GSE44976)。 然后和Jimmy交流之后,他也承认自己只分析了小鼠的数据,而没有分析人类的数据。所以我们需要根据文章提供的线索下载另外一份数据,才能进行下一步的分析。
这个时候就有一个经常被问到的问题:不同来源的RNA-Seq数据能够直接比较吗?甚至说如果不同来源的RNA-seq数据的构建文库都不一样该如何比较?不同来源的RNA-Seq结果之间比较需要考虑 批次效应(batch effect) 的影响。
处理批次效应,根据我搜索的结果,是不能使用FPKM/RPKM,关于这个标准化的吐槽,我在biostars上找到了如下观点:
有人建议使用一个Bioconductor包 我没有具体了解,有生之年去了解补充。
还有人引用了一篇文献 IVT-seq reveals extreme bias in RNA-sequencing 证明不同文库的RNA-Seq结果会存在很大差异。
结论: 可以问下原作者他们是如何处理数据的,居然有一个居然没有重复的分析也能过审。改用小鼠数据进行分析。或者使用无重复的分析方法,或者模拟一份数据出来,先把流程走完。
合并表达矩阵
HTSeq-count输出结果是一个个独立的文件,后续分析需要把多个文件合并成一个行为基因名,列为样本名,中间为count的行列式文件。肯定是不会用Excel手动处理(虽然可以写一个VBA脚本,但是数据量过大不好处理了),这里使用的Python写一个脚本。
基本逻辑:
读取文件
建立一个字典,如果key不在字典中,新增key和value,如果key在字典中,追加value。
输出
#!/usr/bin/python3
import sys
mydict = {}
for file in sys.argv[1:]:
for line in open(file, 'r'):
key,value = line.strip().split('t')
if key in mydict:
mydict[key] = mydict[key] + 't' + value
else:
mydict[key] = value
for key,value in mydict.items():
print(key + 't' + value +'n')
这几行代码写了2个番茄钟,但是debug花了我一个番茄钟。问题出在str和list两种数据格式的混乱使用。还有一个bug: 由于词典是无序的,所以原本代表样本来源的第一行,会跑到其他行。
在论坛上找到一个更加简洁的代码(要求基因名顺序排列),用到paste, awk, printf这三个shell命令。
paste *.txt | awk '{printf $1 "t";for(i=2;i<=NF;i+=2) printf $i"t";printf $i}'
保存为countCombiner.py,输入文件为count, 输出为标准输出,需要重定向。
简单分析
这一步需要用到R语言或者是Excel读取数据。
1.导入数据
options(stringsAsFactors = FALSE)# import data if sample are smallcontrol <- read.table("F:/Data/RNA-Seq/matrix/SRR3589956.count",
sep="t", col.names = c("gene_id","control"))
rep1 <- read.table("F:/Data/RNA-Seq/matrix/SRR3589957.count",
sep="t", col.names = c("gene_id","rep1"))
rep2 <- read.table("F:/Data/RNA-Seq/matrix/SRR3589958.count",
sep="t",col.names = c("gene_id","rep2"))
2.数据整合。gencode的注释文件中的gene_id(如ENSG00000105298.13_3)在EBI是不能搜索到的,所以我就只保留ENSG00000105298这部分。
# merge data and delete the unuseful row
raw_count <- merge(merge(control, rep1, by="gene_id"), rep2, by="gene_id")
raw_count_filt <- raw_count[-1:-5,]
ENSEMBL <- gsub("(.*?)\.\d*?_\d", "\1", raw_count_filt$gene_id)
row.names(raw_count_filt) <- ENSEMBL
3.总体情况, 大部分基因都为0,所以可以删掉节省体积。
summary(raw_count_filt)
control rep1 rep2
Min. : 0.0 Min. : 0.0 Min. : 0.0
1st Qu.: 0.0 1st Qu.: 0.0 1st Qu.: 0.0
Median : 0.0 Median : 0.0 Median : 0.0
Mean : 356.1 Mean : 370.3 Mean : 316.6
3rd Qu.: 15.0 3rd Qu.: 15.0 3rd Qu.: 10.0
Max. :161867.0 Max. :121902.0 Max. :105565.0
4.看几个具体基因
在EBI上搜索GAPDH找到ID为ENSG00000111640。
GAPDH <- raw_count_filt[rownames(raw_count_filt)=="ENSG00000111640",]
gene_id control rep1 rep2
ENSG00000111640 ENSG00000111640.14_2 41857 53902 55302
文章研究的AKAP95(ENSG00000105127)的表达量在KD中都降低了
> AKAP95 AKAP95
gene_id control rep1 rep2
ENSG00000105127 ENSG00000105127.8_2 1168 539 506
下面的差异基因表达,让我想想,该如何收拾Jimmy挖的坑。
参考文献
[1] Gaining comprehensive biological insight into the transcriptome by performing a broad-spectrum RNA-seq analysis
[2] Detecting differential usage of exons from RNA-seq data
[3] RNA-seq Data Analysis-A Practical Approach(2015)
———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: qs62318888
主题授权提示:请在后台主题设置-主题授权-激活主题的正版授权,授权购买:RiTheme官网