日常瞎掰
目前,普通RNA-seq
测序已经成为科研中一件非常稀松平常的事,这也是得益于其物美价廉的基础。虽然已经有不少成熟的RNA-seq
分析流程存在,但并没有形成一个统一的标准答案。毕竟,条条大路通罗马,走哪一条都可以得到想要的结果,这也无伤大雅。就拿我们今天要说的RNA-seq
的标准化方法来说就不止一种,可供选择的方式就有CPM
、TPM
、FPKM
三种。当然,今天我们并不是要讨论哪一种方式更好,而是想跟大家分享一个好用的工具来快速进行标准化。rnanorm
是一个基于python开发的命令行工具,可以很方便地来做以上三种方式的标准化操作。
安装
python包的安装方式,很简单,一行命令即可实现:
pip install rnanorm
使用
- 正常情况
正常情况下,表达矩阵里面的基因名通常使用GTF里面的symobol
、ensembl
原始ID命名,这样最方便的方式就是我们给软件两个参数:原始矩阵和GTF文件即可:
head readcount.txt
FEATURE_ID sampleA1 sampleA2 sampleA3 sampleB1 sampleB2 sampleB3
ENSMUSG00000000001.1 4248 6254 3409 7387 8099 3804
ENSMUSG00000000003.15 0 0 5 0 0 0
ENSMUSG00000000028.15 2239 3068 1801 2581 3081 1466
ENSMUSG00000000031.16 0 0 0 3 0 0
ENSMUSG00000000037.17 57 67 79 1 2 0
ENSMUSG00000000049.11 0 0 0 0 6 0
rnanorm readcount.txt --annotation gencode.vM25.annotation.gtf --gene-id-attr gene_id --tpm-output sample.tpm.txt
示例指定的是TPM
方式,如果想要CPM
、FPKM
的结果可以分别使用参数--cpm-output
、--fpkm-output
来指定。这三个参数并不冲突,可以同时指定,得到三种标准化结果。
- 其他情况
有些时候,我们拿到的矩阵里面基因的名称可能不是原始的ID,如下面所示,虽然知道使用的是ensembl
,但并不是GTF里面原始的ID。因为去除了ID点后面的后缀,所以即使提供了GTF文件,软件也是没法完成矩阵标准化。
TPM
、FPKM
标准化的操作,除了矩阵以外,其实另外还需要每个基因的长度信息,提供GTF文件就是为了获取这个信息。对于提供基因长度,也可以使用软件--gene-lengths
来提供。像下面这样基因ID与GTF中不完全一致的情况,要么把矩阵里面基因ID转化成与GTF一致后再用上面的命令做标准化,要么提供一个基因长度的两列表格使用下面的命令来标准化。
head readcount.txt
FEATURE_ID sampleA1 sampleA2 sampleA3 sampleB1 sampleB2 sampleB3
ENSMUSG00000000001 4248 6254 3409 7387 8099 3804
ENSMUSG00000000003 0 0 5 0 0 0
ENSMUSG00000000028 2239 3068 1801 2581 3081 1466
ENSMUSG00000000031 0 0 0 3 0 0
ENSMUSG00000000037 57 67 79 1 2 0
ENSMUSG00000000049 0 0 0 0 6 0
awk -F '[\t"]' -v OFS="\t" 'BEGIN{print"FEATURE_ID","GENE_LENGTHS"}/^chr/&&$3=="gene"{len=$5-$4+1;print substr($10,1,18),len}' gencode.vM25.annotation.gtf >mm10.genelen.vM25.txt
head mm10.genelen.vM25.txt
FEATURE_ID GENE_LENGTHS
ENSMUSG00000102693 1070
ENSMUSG00000064842 110
ENSMUSG00000051951 465598
ENSMUSG00000102851 480
ENSMUSG00000103377 2819
ENSMUSG00000104017 2233
rnanorm readcount.txt --gene-lengths=mm10.genelen.vM25.txt --tpm-output=readcount.tpm.txt
如果想要的标准化方式是CPM
,可以忽略--annotation
或者--gene-lengths
参数,直接提供原始矩阵即可。
结束语
从上面的示例可以看出使用rnanorm
做标准化还是很方便的,不过有一些注意事项还是需要指出的:表达矩阵的基因那一列的列名必须为FEATURE_ID
;提供GTF文件时,需要使用--gene-id-attr
参数来指定基因ID的属性名,如示例矩阵中基因名为ensembl
,则其在GTF中对应的ID属性为gene_id
,如果是symbol
的话就要换成gene_name
;提供基因长度文件时,两个列名需为FEATURE_ID
、GENE_LENGTHS
。当然,CPM
、TPM
、FPKM
标准化并不难,知道了方法自己完全可以写个函数来计算,但既然有了现成好用的工具,直接使用岂不是更省事省力!为软件作者口头点个赞!
往期回顾
rGREAT | 基因组区间功能富集
利用UCSC预测启动子序列可能结合的转录因子
Vision | scRNA细胞相似性 + 差异signature
HiC | contacts vs distance
hdWGCNA | 单细胞数据共表达网络分析