关于单细胞TPM、Count数据的处理

今天正好看了一个很优秀的帖子答读者问(6):单细胞TPM矩阵如何分析?,就着github写一点总结,方便以后自己处理TPM数据的时候用。

1.10X和smart-seq2的区别和联系

想要了解单细胞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的原理,所以对高转录本会有额外的偏好。

 2.UMI,COUNT,TPM,FPKM...

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

part4:2023.12.29更新。

首先明确一点,10X流程得到的结果并不需要对基因的长度进行矫正,所以也就不存在真正的“TPM”,我个人理解在10X流程中的矫正只存在“类TPM”矫正,那么不矫正基因长度的“类TPM”实际上就是“CPM”。这种“CPM”实际上就是Seurat常常在用NormalizeData()做的事。但还有一个不同,常规的“CPM”缩放因子应该是10^6,而NormalizeData()使用的是10^4,具体原因参考帖子。以及单纯的“CPM”矫正不带log处理,这个要视后面的需求而定

### 将 GEO 数据库中的 Count 数据转换为 TPM #### 工作流程概述 为了将 GEO 数据库中的 Count 数据转换为 TPM (Transcripts Per Million),需要完成以下几个核心操作:获取基因长度信息、合并计数数据与基因长度矩阵以及应用标准化公式。 --- #### 1. 准备阶段 在开始之前,需设置工作环境并加载必要的 R 包。以下是常用工具包及其功能说明: - `edgeR` 或 `DESeq2`: 处理 RNA-seq 计数数据。 - `tximport`: 提供从文件导入转录本级别的表达量的功能。 - `dplyr`: 方便处理整理数据框。 代码如下: ```r library(edgeR) library(tximport) library(dplyr) ``` --- #### 2. 获取 Counts 数据 假设已经下载了 GEO 数据库中的 counts 文件(通常是一个表格),可以使用以下命令将其读入内存中: ```r counts <- read.table("GSEXXXXXX_counts.txt", header=TRUE, row.names=1, sep="\t") ``` 此步骤会创建一个名为 `counts` 的对象,其中每一行为基因 ID,每列为样本对应的 reads count 值[^3]。 --- #### 3. 下载基因长度信息 TPM 的计算依赖于基因的长度信息。可以通过外部资源(如 GENCODE 或 RefSeq)或者直接利用 GEO 中附带的相关元数据来提取这些值。如果已知基因长度存储在一个单独的 CSV/TXT 文件里,则可通过下面的方式加载它: ```r gene_lengths <- read.table("gene_length_info.txt", header=TRUE, row.names=1, sep="\t") ``` 确保该表的第一列包含唯一的基因标识符,并且第二列表达的是对应基因的实际碱基对数目。 --- #### 4. 合并 Counts Gene Lengths 为了让后续计算更加简便,应先将上述两部分结合起来形成一个新的数据结构——即扩展后的矩阵形式,在这里我们采用 dplyr 来实现这一目标: ```r merged_data <- inner_join(as.data.frame(t(counts)), gene_lengths, by="row.names") rownames(merged_data) <- merged_data$Row.names merged_data$Row.names <- NULL ``` 此时得到的新变量 `merged_data` 应当具有这样的布局:行代表各个基因;除了最后的一列记录着它们各自的物理尺寸外,其余各列则分别表示不同样品下的原始测序覆盖度统计结果。 --- #### 5. 定义 TPM 转换函数 基于定义好的数学模型,编写一段简单的脚本来执行批量转化过程: ```r convert_to_tpm <- function(count_matrix){ effective_count_per_kb <- sweep(count_matrix[, -ncol(count_matrix)], MARGIN=1, FUN="/", STATS=count_matrix[, ncol(count_matrix)] / 1e3) tpm_values <- sweep(effective_count_per_kb , MARGIN=2 , FUN="/",STATS=(apply(effective_count_per_kb ,2,sum)/1e6)) return(tpm_values) } tpms <- convert_to_tpm(merged_data) ``` 这段逻辑首先调整每个基因单位千碱基数目的相对丰度比例关系,接着再除以整个实验体系内的总有效映射片段数量从而获得最终标准化后的 TPM 数组。 --- #### 6. 输出结果至文件 一旦完成了全部数值变换之后,就可以把所得成果导出到本地磁盘上以便进一步分析或分享给其他研究者们查看啦! ```r write.csv(as.data.frame(t(tpms)), file="GSEXXXXXX_TPM_expression.csv", quote=FALSE) ``` 这样就成功实现了从 raw counts 到 TPM 表达谱之间的转变全过程[^2]。 --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

18kkk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值