关于单细胞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处理,这个要视后面的需求而定

<think>好的,我需要帮助用户了解如何读入分析单细胞数据的CSV文件。首先,用户可能对单细胞分析流程不太熟悉,所以应该从基础步骤开始,分阶段讲解。要确保使用正确的中文术语,同时注意代码示例的准确性。 首先,确认用户提到的CSV文件格式。单细胞数据通常以基因表达矩阵的形式存在,行是基因,列是细胞,每个值代表表达量。可能需要提醒用户检查数据格式是否符合这种结构,比如是否有行名列名。 接下来,读入CSV文件。使用Python的话,pandas库的read_csv函数是标准方法。需要提到正确的参数,比如index_col=0来处理行名,避免第一列被误认为数据。R语言中则用read.csv或data.table的fread,处理文件更高效。这里需要对比两种语言的代码,帮助用户根据自己熟悉的工具选择。 然后是数据处理,这是关键步骤。包括过滤低质量细胞基因,处理缺失值,标准化归一化。需要解释每一步的目的,比如过滤低表达基因(如至少3个细胞表达该基因)低质量的细胞(如少于200个基因表达的细胞)。标准化方法如log转换或z-score,以及归一化到文库大小。在Python中,scanpy提供了这些功能,R则常用Seurat包。 预处理之后是基础分析步骤:降维(PCA、t-SNE、UMAP)、聚类(如Louvain、Leiden算法)、可视化。需要提到这些步骤如何帮助理解数据结构细胞异质性。代码示例需要展示如何调用这些方法,比如scanpy的pp.pcatl.umap,以及Seurat中的RunPCAFindNeighbors等函数。 最后是高级分析,比如差异表达分析、细胞类型注释轨迹推断。这部分可以简要说明,让用户知道后续可能的方向。同时,提醒用户注意数据质量控制,避免低质量数据影响结果,建议参考官方文档教程。 在整理结构时,按照读入数据、预处理、基础分析、高级分析的顺序,每个步骤给出代码示例解释。确保使用正确的LaTeX格式,比如变量用$...$,独立公式用$$...$$,但当前问题中可能涉及较少数学公式,主要注意代码块的正确展示。同时,保持语言口语化,避免使用专业术语过多,必要时进行解释。 需要检查是否有遗漏的关键点,比如数据转置(如果CSV的行列与预期相反)、数据稀疏性问题(比如使用稀疏矩阵存储),或者是否需要提到特定的单细胞分析工具如ScanpySeurat的最佳实践。此外,可能需要提醒用户安装必要的库,并提供安装命令,如pip install scanpy或BiocManager::install("Seurat")。 最后,确保回答结构清晰,逐步引导用户完成整个流程,并强调数据质量的重要性。如果有常见的错误或注意事项,也应该提及,例如确保基因细胞的标识正确,避免数据导入时的行列错位。</think>以下是单细胞数据CSV文件读入及分析的分步指南,结合代码示例关键注意事项: --- ### **一、数据读入** #### 1. 确认CSV格式 - 单细胞数据通常为 **基因表达矩阵**: - 行:基因(Gene)标识(如ENSG00000187634) - 列:细胞(Cell)标识(如AAACCTGCACCCATTC-1) - 值:基因在每个细胞中的表达量(UMI计数或TPM值) #### 2. 使用Python读入(推荐Scanpy) ```python import pandas as pd import scanpy as sc # 读入CSV文件(假设行为基因,列为细胞) adata = sc.read_csv("single_cell_data.csv").T # 转置为细胞×基因矩阵 # 或通过pandas读取后转换 df = pd.read_csv("single_cell_data.csv", index_col=0) adata = sc.AnnData(df.T) ``` #### 3. 使用R读入(推荐Seurat) ```r library(Seurat) library(data.table) # 读入CSV文件 count_matrix <- fread("single_cell_data.csv", header=T) count_matrix <- as.data.frame(count_matrix) rownames(count_matrix) <- count_matrix[,1] count_matrix <- count_matrix[,-1] # 创建Seurat对象 seurat_obj <- CreateSeuratObject(counts = count_matrix) ``` --- ### **二、数据处理** #### 1. 过滤低质量细胞基因 ```python # Python (Scanpy) sc.pp.filter_cells(adata, min_genes=200) # 保留表达≥200个基因的细胞 sc.pp.filter_genes(adata, min_cells=3) # 保留在≥3个细胞中表达的基因 ``` ```r # R (Seurat) seurat_obj <- subset(seurat_obj, subset = nFeature_RNA > 200) seurat_obj <- subset(seurat_obj, features = rownames(seurat_obj)[Matrix::rowSums(seurat_obj) >= 3]) ``` #### 2. 标准化与归一化 ```python # 文库大小归一化(总计数标准化) sc.pp.normalize_total(adata, target_sum=1e4) # Log转换 sc.pp.log1p(adata) ``` ```r # R (Seurat) seurat_obj <- NormalizeData(seurat_obj, normalization.method = "LogNormalize", scale.factor = 10000) ``` --- ### **三、基础分析流程** #### 1. 降维(PCA → UMAP/t-SNE) ```python # Python sc.pp.highly_variable_genes(adata) sc.pp.pca(adata) sc.pp.neighbors(adata) sc.tl.umap(adata) ``` ```r # R seurat_obj <- FindVariableFeatures(seurat_obj) seurat_obj <- ScaleData(seurat_obj) seurat_obj <- RunPCA(seurat_obj) seurat_obj <- RunUMAP(seurat_obj, dims=1:30) ``` #### 2. 细胞聚类 ```python # Leiden聚类 sc.tl.leiden(adata, resolution=0.5) ``` ```r # R seurat_obj <- FindNeighbors(seurat_obj, dims=1:30) seurat_obj <- FindClusters(seurat_obj, resolution=0.5) ``` #### 3. 可视化 ```python sc.pl.umap(adata, color='leiden') ``` ```r DimPlot(seurat_obj, reduction = "umap", label=TRUE) ``` --- ### **四、高级分析方向** 1. **差异表达分析**:寻找不同细胞群的标记基因 - Python:`sc.tl.rank_genes_groups(adata, 'leiden')` - R:`FindAllMarkers(seurat_obj)` 2. **细胞类型注释**:通过已知标记基因(如CD3E→T细胞)手动注释,或使用自动工具(如SingleR) 3. **轨迹推断**:使用Monocle(R/Python)或Scanpy的PAGA分析细胞分化路径 --- ### **关键注意事项** 1. **数据质量**:检查线粒体基因比例(高比例提示死细胞) 2. **稀疏性处理**:对零值过多的数据可使用稀疏矩阵存储 3. **版本控制**:确保工具版本一致(如Scanpy≥1.9,Seurat≥4.0) 建议参考官方文档: - Scanpy教程:https://scanpy-tutorials.readthedocs.io - Seurat指南:https://satijalab.org/seurat/articles/pbmc3k_tutorial.html
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

18kkk

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

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

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

打赏作者

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

抵扣说明:

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

余额充值