今天正好看了一个很优秀的帖子答读者问(6):单细胞TPM矩阵如何分析?,就着github写一点总结,方便以后自己处理TPM数据的时候用。
想要了解单细胞TPM的数据处理,对10X和smartseq2进行总结也很有必要。下面这个图出自张泽民 Direct Comparative Analyses of 10X Genomics Chromium and Smart-seq2的文章。可以直接的看到,10X基于droplet的方法进行测序,smartseq2基于96孔板,二者都属于二代测序,也就是边扩增边测序。
其它文献也有总结:10X依赖chromium仪器,smartseq2依赖C1仪器
10X:以10X的3'端测序为例,磁珠上有很多短序列(它们的cellular barcode是一样的,UMI各不相同),在PolyT结合mRNA的3'端PolyA之后,尽管转录本有长有短,但因为测序序列长度有所限制,这些转录本分子会在靠近3'端的地方随机打断(只留下最靠边的序列),所以10X的又叫做3'测序,UMI-based,测序深度较低,每个细胞只有一部分基因可以被探测到,但UMI的计数被认为是基因表达水平的直接体现。
然后两边连上接头进行后续的测序步骤...
所以表达定量的多少和基因长度关系不大。另外,UMI的作用是消除PCR的扩增影响,只要是来源于一个转录本,不管扩增多少次,最后定量值只会加1。
传统二代测序/bulk测序:一个完整的转录本分子会被随机打断,转录本越长,片段会越多,而这些片段最终都会被测序。因为这个偏好,标准化的时候才需要考虑转录本长度的影响。
smartseq2:基于96孔板,捕获full transcripts without UMI.结果和传统二代Bulk转录组的结果更为相似。把一个一个的细胞丢进孔里,在每一个孔里完成一个单独的pcr,测出来的东西全部都是这个细胞的,所以测序深度更深。由于pcr的原理,所以对高转录本会有额外的偏好。
TPM FPKM都是为了消除测序深度和基因长度影响的方法,区别仅仅是公式略有不同。
10X数据因为有UMI,不需要考虑基因长度的影响,但仍然需要考虑测序深度在不同细胞之间的差异,所以需要用函数LogNormalize(原理参考seurat-NormalizeData()源码解析 - 简书)进行处理,具体方法是用该基因的UMI/该细胞的全部UMI,再乘以10000,在按列LogNormalize后,又可以按行进行scale(原理参考seurat-ScaleData()源码解析 - 简书),以去除极大值极小值基因对数据的影响。
以公众号推文的举例,想实现类TPM很简单,就可以把10X的数据转换为TPM
mat.tpm.like=as.data.frame(test.seu[["RNA"]]@counts) %>% apply(2,function(x){x/sum(x) * 10000})
github上https://github.com/satijalab/seurat/issues/668提到:
可以对TPM手动log化以后再做scaledata,而不再使用NormalizeData,因为二者的这个函数和TPM的计算原理是一致的,没必要二次使用。
github上https://github.com/satijalab/seurat/issues/747提到:
You have to replace your object@data slot with the desired gene expression matrix as follows: pbmc@data = log(x = norm + 1))我个人认为这里的norm就是对应得TPM,这句代码对应得就是所谓手动log化
part2再研究一下smartseq2和10X的数据整合,目标是可以灵活掌握这两种数据方式TPM,COUNT的使用和转化。
part3:上一个还没有研究清楚,但是今天看了10X的官网,自己以前都是称呼count,但实际上read count和UMI count是不一样的哦。10X的单细胞结果是UMI count