管理系统开发价格 单细胞测序最好的教程(十一):各异抒发基因分析|大略比pseudobulk更优
图片管理系统开发价格管理系统开发价格
第一位杀号:上期第一位奖号为3,第一位奖号3历史上出现694次,前100次该位开出奖号3之后,下期号码0-9出现次数从高到底分别为:号码2→14次,7→13次,3→12次,0、6、8→10次,4、5、9→8次,1→7次。
奇偶形态判断:前面10期奖号中,包含全偶形态1期,两偶一奇形态2期,两奇一偶形态3期,全奇形态4期。
作家按
本章节主要教悔了单细胞数据的各异抒发基因分析圭表,预防对比了ttest与DEseq2在整个细胞进行各异抒发分析的异同,以及为什么要使用元细胞分析的原因。本教程首发于单细胞最好的中语教程[1],未经授权许可,回绝转载。
全笔墨数|预测阅读时候: 3000|5min
——Starlitnightly(星夜)
1. 布景咱们在前边谛视的章节中,接洽了不同细胞的特异性marker(标志)基因,但好多时候,咱们更情绪在某一类细胞中,两种不同景况下的组别各异,举例药物诊治与未经药物诊治,肿瘤细胞与正常细胞(癌旁)细胞等。因此,咱们但愿能在单细胞水平上,进行各异抒发分析。
图片
各异抒发基因模子单细胞RNA-seq与批量RNA-seq数据比拟,有着更强的寥落性,举例dropout表象的深广出现,这使得咱们若是只是将每一个细胞视作样本进行各异抒发分析,由于权臣性阅览的P值关于样本量的明锐度很高,因此若是使用一皆细胞进行各异抒发分析,那么分析闭幕中的权臣性各异可能是不行靠的。咱们鄙人面的对比实验会进一步阐述这种表象。为了贬责单细胞寥落性与样本过大的问题,咱们不错聘用一种叫作念伪Bulk(pseudo-bulk)的圭表来团聚单细胞数据,从而进行各异抒发分析。但这又引入另一个问题,最近的一项接洽强调了伪Bulk的问题,其中推行统计诈欺于统计上不孤独的生物复制。未能接头叠加(来自解除个体的细胞)的内在联系性会加多失实发现率(FDR)。因此,应在各异抒发分析之前,应先诈欺批量效应阅兵或通过每个个体的总额、平均或赶紧效应(即伪Bulk生成)对个体内的细胞类型特异性抒发值进行团聚,以阐述注解样本内联系性。
元细胞的办法(代表不同细胞景况的细胞组,其中元细胞内的变异是由于本领而非生物来源)被漠视行动保合手统计着力同期最大化灵验数据分辨率的一种方式。与伪Bulk不同,SEACells 寻求以与数据模态无关的方式将单个细胞团聚成代表不同细胞景况的元细胞。使用计数矩阵行动输入,它提供每个元单位的每个单位权重、每个元单位的每个单位硬分派以及每个元单位的团聚计数行动输出,故在本教程中,咱们将展示若何使用SEACells完成各异抒发分析。
import omicverse as ovimport scanpy as scimport scvelo as scvov.utils.ov_plot_set()
____ _ _ __ / __ \____ ___ (_)___| | / /__ _____________ / / / / __ `__ / / ___/ | / / _ / ___/ ___/ _ \ / /_/ / / / / / / / /__ | |/ / __/ / (__ ) __/ \____/_/ /_/ /_/_/\___/ |___/\___/_/ /____/\___/ Version: 1.5.5, Tutorials: https://omicverse.readthedocs.io/2. 加载数据
在这里,咱们使用pertpy的演示数据Kang 数据集,它是来自 8 名狼疮患者 INF-β 诊治前后 6 小时前后的 10 倍基于 scRNA-seq 的外周血单核细胞 (PBMC) 数据(悉数 16 个样本)
下载地址:https://figshare.com/ndownloader/files/34464122
小程序开发adata = ov.read('data/kang.h5ad')adata
# AnnData object with n_obs × n_vars = 24673 × 15706 # obs: 'nCount_RNA', 'nFeature_RNA', 'tsne1', 'tsne2', 'label', 'cluster', 'cell_type', 'replicate', 'nCount_SCT', 'nFeature_SCT', 'integrated_snn_res.0.4', 'seurat_clusters' # var: 'name' # obsm: 'X_pca', 'X_umap'
adata.X.max()
与别的圭表不相同,咱们在这里使用ttest圭表策划各异抒发基因,因此咱们需要使用log对数化处理后的数据,因此咱们对数据进行预处理
#quantity controladata=ov.pp.qc(adata, tresh={'mito_perc': 0.2, 'nUMIs': 500, 'detected_genes': 250})#normalize and high variable genes (HVGs) calculatedadata=ov.pp.preprocess(adata,mode='shiftlog|pearson',n_HVGs=2000,)#save the whole genes and filter the non-HVGsadata.raw = adataadata = adata[:, adata.var.highly_variable_features]#scale the adata.Xov.pp.scale(adata)#Dimensionality Reductionov.pp.pca(adata,layer='scaled',n_pcs=50)adata.obsm['X_mde']=ov.utils.mde(adata.obsm['scaled|original|X_pca'])
ov.utils.embedding(adata, basis='X_mde', frameon='small', color=['replicate','label','cell_type'])
图片
降维可视化图3. 批次效应的阅兵咱们发现数据存在着一定的批次效应,咱们这里使用scVU进行批次效应的阅兵。虽然,你也不错使用别的圭表,如harmony等,更多的批次效应阅兵的圭表见omicverse的教程:https://omicverse.readthedocs.io/en/latest/Tutorials-single/t_single_batch/
adata=ov.single.batch_correction(adata,batch_key='replicate', methods='scVI',n_layers=2, n_latent=30, gene_likelihood="nb")adata.obsm["X_mde_scVI"] = ov.utils.mde(adata.obsm["X_scVI"])
# ...Begin using scVI to correct batch effect# GPU available: True (cuda), used: True# TPU available: False, using: 0 TPU cores# IPU available: False, using: 0 IPUs# HPU available: False, using: 0 HPUs# LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]# Epoch 326/326: 100%|██████████| 326/326 [13:22<00:00, 2.47s/it, loss=599, v_num=1] # `Trainer.fit` stopped: `max_epochs=326` reached.# Epoch 326/326: 100%|██████████| 326/326 [13:22<00:00, 2.46s/it, loss=599, v_num=1]# ```python# ov.utils.embedding(adata,# basis='X_mde_scVI',# frameon='small',# color=['replicate','label','cell_type'])
图片
批次效应阅兵图4. 各异抒发分析(全细胞水平)在使用元细胞分析前,我想先使用全细胞水平进行分析,以展示全细胞水平下的各异抒发分析成果,在教程中,咱们只分析CD4 T cells的各异抒发基因,但愿能通过CD4 T cells的各异来标明诊治前后免疫唐突反应的变化。
咱们这里不错使用ttest或者是DESeq2两种模子,两种模子的成果我将永诀演示:
4.1 基于ttest进行各异抒发分析关于ttest统计圭表而言,数据要求自高正态漫步的基本表情。中心极放手理,是指概率论中狡计赶紧变量和漫步渐近于正态漫步的定理,是数理统计学和舛讹分析的表面基础,指出了多半赶紧变量雷同遵守正态漫步的条目。闾里们使用原数据的对数尺度化后的本体,来进行各异抒发分析。
test_adata=adata[adata.obs['cell_type'].isin(['CD4 T cells'])]dds=ov.bulk.pyDEG(test_adata.to_df(layer='lognorm').T)dds.drop_duplicates_index()print('... drop_duplicates_index success')
# ... drop_duplicates_index success
咱们录取label永诀为Ctrl与Stim行动需要进行各异分析的两个组别
treatment_groups=test_adata.obs[test_adata.obs['label']=='stim'].index.tolist()control_groups=test_adata.obs[test_adata.obs['label']=='ctrl'].index.tolist()dds.deg_analysis(treatment_groups,control_groups,method='ttest')
况且咱们不指定各异抒发倍数,由算法把柄数据的漫步自动策划顺应的阈值
# -1 means automatically calculatesdds.foldchange_set(fc_threshold=-1, pval_threshold=0.05, logp_max=10)
# ... Fold change threshold: 0.8351151943206787
咱们使用自带的火山图函数plot_volcano来不雅察各异抒发基因的漫步
dds.plot_volcano(title='DEG Analysis',figsize=(4,4), plot_genes_num=8,plot_genes_fontsize=12,)
图片
火山图1咱们还不错使用自带的箱线图函数plot_boxplot来不雅察各异抒发基因在不同组的各异情况
dds.plot_boxplot(genes=['NELL2','TNFSF13B'],treatment_groups=treatment_groups, control_groups=control_groups,figsize=(2,3),fontsize=12, legend_bbox=(2,0.55))
图片
箱线图1除此除外,管理系统开发公司咱们还不错在低维流型图umap中,不雅察各异抒发基因在不同组的漫步情况
ov.utils.embedding(test_adata, basis='X_mde_scVI', frameon='small', color=['label','NELL2','TNFSF13B'])
图片
降维图14.2 基于DEseq2进行各异抒发分析DEseq2被平素使用在各异抒发分析的多样形状,成绩于其负二项漫步模子的联想。使得咱们不错使用原始计数Counts进举止直分析。DESeq2将对原始reads进行建模,使用尺度化因子(scale factor)来阐述注解库深度的各异。然后,DESeq2臆测基因的破碎度,并平缓这些臆测值以生成更准确的破碎度臆测,从而对reads count进行建模。临了,DESeq2拟合负二项漫步的模子,并使用Wald阅览或似然比阅览进行假定阅览。
与ttest不同,使用DEseq2时毋庸接头数据与正态漫步之间的关系,也毋庸接头数据特征。
test_adata=adata[adata.obs['cell_type'].isin(['CD4 T cells'])]dds=ov.bulk.pyDEG(test_adata.to_df(layer='counts').T)dds.drop_duplicates_index()print('... drop_duplicates_index success')treatment_groups=test_adata.obs[test_adata.obs['label']=='stim'].index.tolist()control_groups=test_adata.obs[test_adata.obs['label']=='ctrl'].index.tolist()dds.deg_analysis(treatment_groups,control_groups,method='DEseq2')
# ... drop_duplicates_index success # Fitting size factors... # ... done in 0.20 seconds. # Fitting dispersions... # ... done in 3.69 seconds. # Fitting dispersion trend curve... # ... done in 0.60 seconds. # logres_prior=nan, sigma_prior=nan # Fitting MAP dispersions... # ... done in 73.18 seconds. # Fitting LFCs... # ... done in 299.53 seconds. # Refitting 5 outliers. # Fitting dispersions... # ... done in 0.09 seconds. # Fitting MAP dispersions... # ... done in 0.23 seconds. # Fitting LFCs... # ... done in 0.70 seconds. # Running Wald tests... # ... done in 71.47 seconds. # Log2 fold change & Wald test p-value: condition Treatment vs Control
# -1 means automatically calculatesdds.foldchange_set(fc_threshold=1.2, pval_threshold=0.05, logp_max=10)
#... Fold change threshold: 1.2
dds.plot_volcano(title='DEG Analysis',figsize=(4,4), plot_genes_num=8,plot_genes_fontsize=12,)
图片
火山图2dds.plot_boxplot(genes=['IFI6','RGCC'],treatment_groups=treatment_groups, control_groups=control_groups,figsize=(2,3),fontsize=12, legend_bbox=(2,0.55))
图片
箱线图2ov.utils.embedding(test_adata, basis='X_mde_scVI', frameon='small', color=['label','IFI6','RGCC'])
图片
降维图25. 基于元细胞的各异抒发分析咱们不错看到,岂论是使用ttest与DEseq2,都不错一定经由善策划出两个组别的细胞各异抒发基因,况且也如确凿两个组别中兑现了分离。然则,这也带来了多半的生物学杂音。两种细胞并莫得兑现相当齐全的分离,各异抒发基因的抒发在两类细胞中也有着一定的丰采。
为了贬责这一问题,扩大样本(细胞)的深度,咱们使用SEACells团聚细胞,然后在元细胞水平上,实验各异抒发分析。值得一提的是,SEACells团聚的元细胞在信号团聚和细胞分辨率之间兑现了最好均衡,况且它们拿获通盘表型谱中的细胞景况,包括荒僻景况。元细胞保留了样本之间隐讳的生物学各异,这些各异通过替代圭表行动批次效应被摈弃,因此,为数据集成提供了比寥落单个细胞更好的起原。
5.1 元细胞入手化在这里,咱们使用scVI行动元细胞特征向量的入手化,你也不错使用X_pca或者是omicverse策划得回的scaled|original|X_pca来行动元细胞的入手输入。
meta_obj=ov.single.MetaCell(adata,use_rep='X_scVI',n_metacells=250, use_gpu=True)
# Welcome to SEACells GPU! # Computing kNN graph using scanpy NN ... # computing neighbors # finished: added to `.uns['neighbors']` # `.obsp['distances']`, distances for each pair of neighbors # `.obsp['connectivities']`, weighted adjacency matrix (0:00:03) # Computing radius for adaptive bandwidth kernel... # 0%| | 0/24528 [00:00<?, ?it/s] # Making graph symmetric... # Parameter graph_construction = union being used to build KNN graph... # Computing RBF kernel... # 0%| | 0/24528 [00:00<?, ?it/s] # Building similarity LIL matrix... # 0%| | 0/24528 [00:00<?, ?it/s] # Constructing CSR matrix...
咱们需要入手化元细胞的原型,也即是其在特征空间scVI上的入手位置,这里可能有一些难清楚,若是咱们在umap图上来清楚的话,不错示意为umap图上的元细胞的位置,大略会愈加常常一些。
meta_obj.initialize_archetypes()
# Building kernel on X_scVI # Computing diffusion components from X_scVI for waypoint initialization ... # computing neighbors # finished: added to `.uns['neighbors']` # `.obsp['distances']`, distances for each pair of neighbors # `.obsp['connectivities']`, weighted adjacency matrix (0:00:02) # Done. # Sampling waypoints ... # Done. # Selecting 239 cells from waypoint initialization. # Initializing residual matrix using greedy column selection # Initializing f and g... # 100%|██████████| 21/21 [00:00<00:00, 42.44it/s] # Selecting 11 cells from greedy initialization.5.2 元细胞模子教练
入手完模子结构后,咱们就需要对元细胞进行团聚,在这里咱们通过教练SEACells模子来完成这一筹商
meta_obj.train(min_iter=10, max_iter=50)
# Randomly initialized A matrix. # Setting convergence threshold at 0.28753 # Starting iteration 1. # Completed iteration 1. # Converged after 8 iterations. # Converged after 9 iterations. # Starting iteration 10. # Completed iteration 10. # Converged after 10 iterations.
咱们提供了一个保存与读取函数,幸免叠加策划
meta_obj.save('seacells/model.pkl')meta_obj.load('seacells/model.pkl')5.3 预测元细胞
咱们不错使用 predicted 来预测原始 scRNA-seq 数据的元胞。有两种圭表可供弃取,一种是 "soft"圭表,另一种是 "hard"圭表。
在 "soft"圭表中,汇总每个 SEACell 中的细胞,对整个原始数据乞降 x 为属于一个 SEACell 的整个细胞分派权重。数据未尺度化,伪原始团聚计数存储在 .layer['raw']中。与变量(.var)联系的属性会被复制过来,但每个 SEACell 的联系属性必须手动复制,因为某些属性可能需要乞降或取平均值等,具体取决于属性。
在 "hard"圭表中,汇总每个 SEACell 中的单位格,对属于一个 SEACell 的整个单位格的整个原始数据乞降。数据未经尺度化处理,原始汇算计数存储在 .layer['raw']中。与变量(.var)联系的属性会被复制过来,但每个 SEACell 的联系属性必须手动复制,因为某些属性可能需要乞降或取平均值等,具体取决于属性。
咱们最先需要串联细胞类型(cell_type)与组别(label)的标签用于预测。
meta_obj.adata.obs['celltype-label']=[i+'-'+j for i,j in zip(meta_obj.adata.obs['cell_type'], meta_obj.adata.obs['label'])]
ad=meta_obj.predicted(method='soft',celltype_label='celltype-label', summarize_layer='lognorm')
# 100%|██████████| 250/250 [01:03<00:00, 3.94it/s]
ad
# AnnData object with n_obs × n_vars = 250 × 2000 # obs: 'Pseudo-sizes', 'celltype', 'celltype_purity'
import matplotlib.pyplot as pltfig, ax = plt.subplots(figsize=(4,4))ov.utils.embedding( meta_obj.adata, basis="X_mde_scVI", color=['cell_type'], frameon='small', title="Meta cells", #legend_loc='on data', legend_fontsize=14, legend_fontoutline=2, size=10, ax=ax, alpha=0.2, #legend_loc='', add_outline=False, #add_outline=True, outline_color='black', outline_width=1, show=False, #palette=ov.utils.blue_color[:], #legend_fontweight='normal')ov.single._metacell.plot_metacells(ax,meta_obj.adata, use_rep='X_mde_scVI',color='#CB3E35', )
图片
元细胞图sc.pp.highly_variable_genes(ad, n_top_genes=1500, inplace=True)sc.tl.pca(ad, use_highly_variable=True)sc.pp.neighbors(ad, use_rep='X_pca')sc.tl.umap(ad)
# If you pass `n_top_genes`, all cutoffs are ignored. # extracting highly variable genes # finished (0:00:00) # --> added # 'highly_variable', boolean vector (adata.var) # 'means', float vector (adata.var) # 'dispersions', float vector (adata.var) # 'dispersions_norm', float vector (adata.var) # computing PCA # on highly variable genes # with n_comps=50 # finished (0:00:00) # computing neighbors # finished: added to `.uns['neighbors']` # `.obsp['distances']`, distances for each pair of neighbors # `.obsp['connectivities']`, weighted adjacency matrix (0:00:00) # computing UMAP # finished: added # 'X_umap', UMAP coordinates (adata.obsm) (0:00:00)
import matplotlib.pyplot as pltfrom matplotlib import patheffectsfig, ax = plt.subplots(figsize=(4,4))ov.utils.embedding( ad, basis="X_umap", color=['celltype'], frameon='small', title="metacells celltypes", #legend_loc='on data', legend_fontsize=14, legend_fontoutline=2, #size=10, ax=ax, legend_loc=None, add_outline=False, #add_outline=True, outline_color='black', outline_width=1, show=False, #palette=ov.palette()[12:], #legend_fontweight='normal')ov.utils.gen_mpl_labels( ad, 'celltype', exclude=("None",), basis='X_umap', ax=ax, adjust_kwargs=dict(arrowprops=dict(arrowstyle='-', color='black')), text_kwargs=dict(fontsize= 12 ,weight='bold', path_effects=[patheffects.withStroke(linewidth=2, foreground='w')] ),)
图片
元细胞可视化test_adata=ad[ad.obs['celltype'].isin(['CD4 T cells-stim','CD4 T cells-ctrl'])]dds_meta=ov.bulk.pyDEG(test_adata.to_df().T)dds_meta.drop_duplicates_index()print('... drop_duplicates_index success')treatment_groups=test_adata.obs[test_adata.obs['celltype']=='CD4 T cells-stim'].index.tolist()control_groups=test_adata.obs[test_adata.obs['celltype']=='CD4 T cells-ctrl'].index.tolist()dds_meta.deg_analysis(treatment_groups,control_groups,method='ttest')# -1 means automatically calculatesdds_meta.foldchange_set(fc_threshold=-1, pval_threshold=0.05, logp_max=10)
# ... drop_duplicates_index success # ... Fold change threshold: 1.4815978396550413
dds_meta.plot_volcano(title='DEG Analysis',figsize=(4,4), plot_genes_num=8,plot_genes_fontsize=12,)
图片
火山图3dds_meta.plot_boxplot(genes=['IFIT1','OSCP1'],treatment_groups=treatment_groups, control_groups=control_groups,figsize=(2,3),fontsize=12, legend_bbox=(2,0.55))
图片
箱线图3ov.utils.embedding(test_adata, basis='X_umap', frameon='small', color=['IFIT1','OSCP1','celltype'], cmap='RdBu_r')
图片
降维图3ov.utils.embedding(adata, basis='X_mde_scVI', frameon='small', color=['label','IFIT1','OSCP1'])
图片
降维图4咱们发现,IFIT1和OSCP1永诀在stim和ctrl组中特异性下调与上调,其中IFIT1编码一种含有四肽叠加序列的卵白质,领先被已然为纷扰素诊治指点的。元细胞泄表示了更优的各异基因的识别上风,况且铲除了dropout的纷扰,咱们对比箱线图可得回沟通的不雅点。
test_adata=adata[adata.obs['cell_type'].isin(['CD4 T cells'])]treatment_groups=test_adata.obs[test_adata.obs['label']=='stim'].index.tolist()control_groups=test_adata.obs[test_adata.obs['label']=='ctrl'].index.tolist()dds.plot_boxplot(genes=['IFIT1','OSCP1'],treatment_groups=treatment_groups, control_groups=control_groups,figsize=(2,3),fontsize=12, legend_bbox=(2,0.55))
图片
箱线图45. 追忆咱们在对单细胞数据进行各异抒发分析的时候,不错从全细胞和元细胞两个角度去接头,频繁来说为了幸免生物学杂音和dropout的纷扰,咱们会弃取元细胞行动分析计谋来进行。但更多时候,咱们会同期使用两种圭表,并进行互相印证,来标明分析的准确性与可靠性。
6. 念念考咱们为什么要使用元细胞来进行各异抒发分析?ttest与DESeq2的各异抒发分析闭幕有什么不同?文中连结[1]单细胞最好的中语教程: https://single-cell-tutorial.readthedocs.io/zh/latest/
图片
本站仅提供存储处事,整个本体均由用户发布,如发现存害或侵权本体,请点击举报。