【Scanpy】单细胞转录组分析思路之细胞分类

2024-02-02 14:59

本文主要是介绍【Scanpy】单细胞转录组分析思路之细胞分类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文将详细讲述单细胞转录组分析的步骤。

一、文章信息

     题目:ClusterMap for multi-scale clustering analysis of spatial gene expression

     链接:https://doi.org/10.1038/s41467-021-26044-x

     期刊:Nature

二、数据集

     数据集:小鼠初级视觉皮层V1_1020

     转录组技术:STARmap

     基因数:1020

     细胞数:1650

     总表达数:471295

     细胞类型:16种

三、单细胞测序工作

        关于这一部分,这篇文章没有讲解,我在了解生物背景的时候,查阅了一些资料,关于单细胞最初的制备工作。

        对于这篇文章,在作者给的公开代码和数据中,数据已经是处理好的有关所有基因点的三维位置坐标。

四、细胞分类

        进行细胞分类的关键是得到有细胞位置的数据集。

1、输入文件

        文件由三部分组成,X,obs,var。三者的位置关系如下图所示:

 输入文件,得到adata数据格式,但是下文的操作都在细胞层面,所以对应查看adata.obs文件。

expr_path = os.path.join(out_path, 'expr_BY1.csv')    # 里面全是0 1 2 3 的数字
var_path = os.path.join(out_path, 'var_BY1.csv')      # 基因的名称
obs_path = os.path.join(out_path, 'obs_BY1.csv')      # 二维行列坐标# add expression data to the AnnData object   添加表达式数据到AnnData对象
expr_x = np.loadtxt(expr_path, delimiter=',')     # delimiter表示分隔符,加载文件的分隔符var = pd.read_csv(var_path, header=None)  #header=None(文件中不包含列名的行)
var = pd.DataFrame(index=var.iloc[:,0].to_list())
obs = pd.read_csv(obs_path, index_col=0)adata = AnnData(X=expr_x, var=var, obs=obs)

2、预处理

(1)可视化高表达基因

sc.pl.highest_expr_genes(adata, n_top=20) 

        可视化所有细胞中表达量最多的20个基因,展示的方法采用的是箱线图。箱线图是对每个基因在所有细胞中表达量分布的更详细描述。箱子的宽度,反应了数据的波动程度,箱子越窄,数据分布越集中。

        箱线图的查看以下图为例:中位线表示的是MALAT1在单个细胞表达量的中位数;中位数对应的是该基因表达量占该细胞总基因表达量的17%。可见,MALAT1基因在大部分细胞中的表达量占比约在10%~20%之间。

 (2)计算质量控制指标

sc.pp.calculate_qc_metrics(adata, percent_top=None, inplace=True)

        在这里inplace=True,会将得到的细胞、基因质量控制指标添加到adata.obs和adata.var中。详细的添加的质量指标,如下文所示。其中:

n_genes_by_counts 该细胞 中有多少种基因
total_counts 该细胞 的基因总数(下文中一直出现的)

n_cells_by_counts :所有细胞中表达 该基因 的细胞数目
mean_counts :所有细胞中 该基因 表达的平均值
pct_dropout_by_counts:  未表达 该基因 的细胞占细胞总数的百分比
total_counts:  所有细胞中, 该基因 的表达量总和

 (3)可视化基因表达情况

sc.pl.violin(adata, ['n_genes_by_counts', 'total_counts', 'pct_counts_mt'],jitter=0.4, multi_panel=True)
n_genes_by_counts 每个细胞中,有表达的基因的种类数;        
total_counts 每个细胞的基因总计数(总表达量);      (每个细胞包含的表达量)
pct_counts_mt 每个细胞中,线粒体基因表达量占该细胞所有基因表达量的百分比;

 (4)直方图

su.plot_stats_per_cell(adata, save=False)

        查看表达情况:①表达数为这么多(横轴)的细胞有多少个(纵轴);②基因为这么多(横轴)的细胞有多少个(纵轴)。

 (5)散点图

sc.pl.scatter(adata, x='total_counts', y='n_genes_by_counts')

        每个点代表一个细胞。横轴:一个细胞中基因的总表达量;纵轴:一个细胞中表达的基因种类数。

 (6)分位数

su.show_reads_quantile(adata)

        查看细胞中基因的总表达量。

 (7)细胞过滤

        根据直方图和分位数的结果,设定过滤指标。

sc.pp.filter_cells(adata, min_genes=5)  # 过滤一个细胞中表达少于五个基因的细胞样本 
sc.pp.filter_genes(adata, min_cells=5)  # 过滤在少于五个细胞中表达的基因
sc.pp.filter_cells(adata, min_counts=29)   # 过滤每个细胞中计数少于29个的细胞样本 

        至此,数据预处理部分结束,筛选合适的基因与数据,目的是为了给之后的分析提供更高质量的数据。

3、归一化处理

        归一化的目的实际上就是把数据做一个转换,使同一基因在不同样本之间有可比性;同时降低数据的离散程度。在数据转换后都会变成log(x+1),使用log转换的一个好处,就是使得数据更加集中。

(1)归一化

sc.pp.normalize_total(adata)
sc.pp.log1p(adata)

        对细胞进行归一化,一个细胞里的基因求和为1,这样一个基因的表达量就显而易见了,容易找到高表达量基因。

(2)存储数据

adata.raw = adata

        将 AnnData 对象的 .raw 属性设置为归一化和对数化的原始基因表达,以便以后用于基因表达的差异测试和可视化。这只是冻结了 AnnData 对象的状态。

(3)可视化高变基因

        高变基因:在某些细胞里表达量高,但在其他较多细胞表达量较低。表达量差别较大。

        特征选择的时候会用到高变基因。特征选择:对数据集基因进行过滤只保留对数据有贡献的基因。

sc.pp.highly_variable_genes(adata, min_mean=0.0125, max_mean=3, min_disp=0.5)sc.pl.highly_variable_genes(adata)# 绘制特异性基因散点图adata = adata[:, adata.var.highly_variable]# 高变基因的选取

4、降维(PCA)

        通过运行主成分分析 (PCA) 来降低数据的维数,力求用最少的维度去捕捉更多的数据特征。

sc.tl.pca(adata, svd_solver='arpack')     # 通过主成分分析降低数据维度sc.pl.pca_variance_ratio(adata, log=False)  
# 检查单个 PC 对数据总方差的贡献,这可以提供给我们应该考虑多少个 PC 以计算细胞的邻域关系的信息

sc.pl.pca(adata, color='batch')   #可视化PCA降维

5、聚类

        首先使用数据的 PCA 表示来计算细胞的邻域图,之后使用UMAP可视化。

# Computing the neighborhood graph
sc.pp.neighbors(adata, n_neighbors=50, n_pcs=15)# Run UMAP
sc.tl.umap(adata)# Plot UMAP
sc.pl.umap(adata, color='batch')

        接下来使用louvain聚类,得到细胞类群。

# Run louvain cluster
sc.tl.louvain(adata, resolution=0.9)    # resolution=0.9 提供的是分辨率  一般默认分辨率是1.0# Plot UMAP with cluster labels 
sc.pl.umap(adata, color='louvain') 

 6、(分为三类)

        在生物数据处理的过程中,很多时候是根据已知的生物特性,进行调整,在该文章中,对细胞按照神经元进行划分,可分为三类:兴奋神经元、抑制神经元、非神经元。所以接下来对已经分为的九类再重新划分为三类。在这里根据高表达基因进行划分。

top_markers = ["Gad1","Slc17a7"]plt.figure(figsize=(30,15))
su.plot_heatmap_with_labels(adata, top_markers, 'louvain', show_axis=True, font_size=10)

        根据热图展示的表达情况,手动分为三类:把0、1、4、8合并;2,3,5,6合并。

7、Colormap赋予颜色

cluster_pl = ["#14a312", "#616161", "#a8208d",]
cluster_cmap = ListedColormap(cluster_pl)
sns.palplot(cluster_pl)

        matplotlib.colors.ListedColormap属于matplotlib.colors模块。matplotlib.colors模块用于将颜色或数字参数转换为RGB。 文中的"#14a312", "#616161", "#a8208d"是颜色对应的十六进制颜色表示。

上面被分为三个大类别,上文又赋予了颜色,重新用umap可视化展示。

8、检索标记基因

        先计算每个 louvain 分群中高度差异基因的排名,取排名前 5 的基因。最简单和最快的方法是 t 检验。

sc.tl.rank_genes_groups(adata, 'louvain', method='t-test')
sc.tl.filter_rank_genes_groups(adata, min_fold_change=0.01)

根据已知的标记基因,定义一个标记基因列表供以后参考:

markers = []
temp = pd.DataFrame(adata.uns['rank_genes_groups']['names']).head(5)
for i in range(temp.shape[1]):curr_col = temp.iloc[:, i].to_list()markers = markers + curr_colprint(curr_col)print(markers)
plt.figure(figsize=(30,15))
su.plot_heatmap_with_labels(adata, markers, 'louvain', cmap=cluster_cmap, show_axis=True, font_size=10)
['Pcsk2', 'Pgm2l1', 'Slc17a7', 'Egr1', 'Arc']
['Plp1', 'Qk', 'Apod', 'Glul', 'Ptgds']
['Gad1', 'Gad2', 'Npy', 'Slc6a1', 'Kcnc2']
['Pcsk2', 'Pgm2l1', 'Slc17a7', 'Egr1', 'Arc', 'Plp1', 'Qk', 'Apod', 'Glul', 'Ptgds', 'Gad1', 'Gad2', 'Npy', 'Slc6a1', 'Kcnc2']

9、细胞形态表达

        分为兴奋神经元、抑制神经元和非神经元。

(1)生成四个颜色

cluster_pl_plot=cluster_pl.copy()
cluster_pl_plot.append([0.9,0.9,0.9])
sns.palplot(cluster_pl_plot)
cluster_cmap_orig = ListedColormap(cluster_pl_plot)   #从颜色列表生成colormap对象
cluster_pl_plot=np.array(cluster_pl_plot)

(2) 获取数据

sample= 'BY1'
trueindex=adata.obs.loc[adata.obs['sample'] == sample,'orig_index']
trueindex=trueindex.tolist()    # 获得的是BY1的数值编号
clusterid=adata.obs.loc[adata.obs['sample'] == sample,'louvain']
clusterid=clusterid.tolist()    # 获得的是对应的聚类,012三个的聚类col=adata.obs.loc[adata.obs['sample'] == sample,'col']
col=col.tolist()     # BY1列数据
row=adata.obs.loc[adata.obs['sample'] == sample,'row']
row=row.tolist()     # BY1行数据current_seg_path = os.path.join('/data/STARmap_V1_1020/BY1/Celltyping/labeled_cells.csv')
labeled_cells=pd.read_csv(current_seg_path, header=None)     # 加载完整的数据,可视化展示pointid=labeled_cells[2].to_list() #27万行数据的第三列,数值从1~1650之间
pointid=[i-1 for i in pointid]    # 27万数据都减1的结果,0~1649

 (3)赋予对应颜色

mask = np.isin(pointid, trueindex)
labeled_cellstrue=labeled_cells.loc[mask]labeled_cellstrue_label=[]
for element in pointid:if element in trueindex:newelement=int(clusterid[trueindex.index(element)])labeled_cellstrue_label.append(newelement)else:newelement=3labeled_cellstrue_label.append(newelement)test=np.array(labeled_cellstrue_label)
test1=cluster_pl_plot[test]if sample=='BY1':plt.figure(figsize=(25,50))plt.scatter(labeled_cells[1], labeled_cells[0], s=50,edgecolors='none', c=test1,alpha=0.5)plt.axis('off')

五、参考链接

        1、http://t.csdn.cn/RT7y2

        2、小泽看文献 | 诚意满满的综述之单细胞转录组分析最佳思路

        3、scanpy教程:预处理与聚类

这篇关于【Scanpy】单细胞转录组分析思路之细胞分类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/671087

相关文章

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

Spring、Spring Boot、Spring Cloud 的区别与联系分析

《Spring、SpringBoot、SpringCloud的区别与联系分析》Spring、SpringBoot和SpringCloud是Java开发中常用的框架,分别针对企业级应用开发、快速开... 目录1. Spring 框架2. Spring Boot3. Spring Cloud总结1. Sprin

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

MyBatis-Plus中静态工具Db的多种用法及实例分析

《MyBatis-Plus中静态工具Db的多种用法及实例分析》本文将详细讲解MyBatis-Plus中静态工具Db的各种用法,并结合具体案例进行演示和说明,具有很好的参考价值,希望对大家有所帮助,如有... 目录MyBATis-Plus中静态工具Db的多种用法及实例案例背景使用静态工具Db进行数据库操作插入