隔离的第11天,人生如戏,得与失都是很平常的事,可能我们错过了很喜欢的姑娘,可能被深爱的人所伤害,也可能面对所在的城市感到无力留下来,“躺平”或许很对,但努力一定很酷。
好了,今天我们来分享一个单细胞多样本整合的分析方法,VIPCCA,顾名思义,CCA的进阶版,参考文献在Effective and scalable single-cell data alignment with non-linear canonical correlation analysis,2021年12月发表于nucleic acids research,IF 9.1分,我们借鉴一下,看看有没有值得学习的地方。
单细胞测序在基因调控、细胞分化和细胞多样性研究中具有革命性意义。 随着近年来技术的显着改进,每个实验检测的单细胞数量呈指数级增长,同时大规模研究产生的数据集也在快速增长和积累。 因此,当前单细胞研究中的一个主要计算挑战是对来自多个不同样本或跨不同平台和数据类型的测量进行标准化,以进行有效的综合和比较分析。 这种综合分析需要开发单细胞数据对齐方法,该方法可以消除批次效应并考虑跨数据集的技术噪声。
最近开发了许多单细胞数据对齐方法。它们中的大多数,除了一些值得注意的例外,例如最近的 iNMF,都针对小型和中型数据集。这些现有的方法可以概括为四类:(i)基于参考的方法,例如 Scmap-cluster 和 scAlign,它们基于注释良好的参考数据集对齐新的查询数据集; (ii) 基于聚类的方法,例如 Harmony、DESC,它们通过迭代优化聚类目标函数来消除批效应并在嵌入空间中对齐样本; (iii) 基于匹配的方法,例如 MNN 和 Scanorama,它们应用相互最近的邻居策略来识别跨数据集的重叠单元格和 (iv) 基于投影的方法,使用统计模型将来自不同数据集的单个细胞投影到较低的维空间,包括对投影应用典型相关分析的Seurat ,使用来自非负矩阵分解的潜在因子进行投影的LIGER, and scVI and others that use variational techniques for projection.
然而,大多数现有的对齐方法都存在固有缺陷,无法成功应用于大型数据集。具体而言,基于参考的方法的对齐将受到参考数据大小和参考中可用的预选细胞类型注释的限制,因此当数据大小增加时,可能会导致错过新发现的机会增加。像 MNN 这样的基于匹配的方法使用往返游走策略,该策略需要为具有两个以上样本的数据集生成所有成对对齐,这对于大样本量来说将是耗时的。具有复杂参数模型的方法(例如 LIGER 和 scAlign)或具有复杂事后数据处理的方法(例如 Seurat )也难以扩展到大型数据集。基于 ZINB 的方法(例如 scVI)在捕获多个数据集的复杂表达特征方面可能效率较低。尽管一些现有的最新方法可以扩展到大型数据集,但由于复杂的参数模型,它们仍然有可能不准确地对齐细胞。因此,迫切需要开发在计算上也有效的有效对齐方法。
除了迫切需要开发可扩展的比对方法外,当前比对方法的另一个阻碍问题是它们的性能通常仅使用单细胞 RNA 测序 (scRNA-seq) 数据进行基准测试和优化。 因此,大多数现有的比对方法不适合整合其他单细胞测序数据类型,例如使用测序 (scATAC-seq) 进行转座酶可及染色质的单细胞测定。 此外,现有的比对方法(如 Seurat)返回的结果只能保留真实的细胞间关系(或相似性),而不能代表基因表达水平,不适合进行差异表达分析或富集分析等下游分析。
为了应对这些挑战,作者提出了一个统一的计算框架 VIPCCA,它基于非线性概率典型相关分析,用于有效且可扩展的单细胞数据对齐。 VIPCCA 利用来自深度神经网络的尖端技术对单细胞数据进行非线性建模,从而允许用户通过跨技术、数据类型、条件和模式的多个单细胞数据集的集成来捕获复杂的生物结构。此外,VIPCCA 依靠变分推理来进行可扩展计算,从而能够将大规模单细胞数据集与数百万个细胞有效集成。重要的是,VIPCCA 可以将多模态转换为低维空间,而无需任何事后数据处理,这是与现有对齐方法形成直接对比的独特且理想的功能。
示例代码,这里要结合上一篇分享的内容10X单细胞空间转录组联合分析之DAVAE
Integrating multiple scRNA-seq data
加载
import scbean.model.vipcca as vip
import scbean.tools.utils as tl
import scbean.tools.plotting as pl
import matplotlib
import scanpy as sc
matplotlib.use('TkAgg')
# Command for Jupyter notebooks only
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
from matplotlib.axes._axes import _log as matplotlib_axes_logger
matplotlib_axes_logger.setLevel('ERROR')
Loading data
base_path = "/Users/zhongyuanke/data/vipcca/mixed_cell_lines/"
file1 = base_path+"293t/hg19/"
file2 = base_path+"jurkat/hg19/"
file3 = base_path+"mixed/hg19/"
adata_b1 = tl.read_sc_data(file1, fmt='10x_mtx', batch_name="293t")
adata_b2 = tl.read_sc_data(file2, fmt='10x_mtx', batch_name="jurkat")
adata_b3 = tl.read_sc_data(file3, fmt='10x_mtx', batch_name="mixed")
或者
base_path = "/Users/zhongyuanke/data/vipcca/mixed_cell_lines/"
adata_b1 = tl.read_sc_data(base_path+"293t.h5ad", batch_name="293t")
adata_b2 = tl.read_sc_data(base_path+"jurkat.h5ad", batch_name="jurkat")
adata_b3 = tl.read_sc_data(base_path+"mixed.h5ad", batch_name="mixed")
Data preprocessing
adata_all = tl.preprocessing([adata_b1, adata_b2, adata_b3], index_unique="-")
VIPCCA Integration
# Command for Jupyter notebooks only
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"
# construct a vipcca object
handle = vip.VIPCCA(
adata_all=adata_all,
res_path='/Users/zhongyuanke/data/vipcca/mixed_cell_lines/tutorials/',
mode='CVAE',
split_by="_batch",
epochs=20,
lambda_regulizer=5,
batch_input_size=128,
batch_input_size2=16
)
# do integration and return an AnnData object
adata_integrate = handle.fit_integrate()
1.The meta.data of each cell has been saved in adata.obs
2.The embedding representation from vipcca of each cell have been saved in adata.obsm(‘X_vipcca’)
Loading result
- Loading result from saved model.h5 file through vipcca: The model.h5 file of the trained result can be downloaded here
model_path = 'model.h5'
handle = vip.VIPCCA(
adata_all=adata_all,
res_path='/Users/zhongyuanke/data/vipcca/mixed_cell_lines/tutorials/',
mode='CVAE',
split_by="_batch",
epochs=20,
lambda_regulizer=5,
batch_input_size=128,
batch_input_size2=16,
model_file=model_path
)
adata_integrate = handle.fit_integrate()
- Loading result from h5ad file: The output.h5ad file of the trained result can be downloaded here
integrate_path = '/Users/zhongyuanke/data/vipcca/mixed_cell_lines/tutorials/output.h5ad'
adata_integrate = sc.read_h5ad(integrate_path)
UMAP Visualization
sc.pp.neighbors(adata_integrate, use_rep='X_vipcca')
sc.tl.umap(adata_integrate)
sc.set_figure_params(figsize=[5.5,4.5])
sc.pl.umap(adata_integrate, color=['_batch','celltype'], use_raw=False, show=True,)
Plot correlation
该函数仅适用于 fit_integrate() 函数训练生成的 AnnData。 在基因表达矩阵中随机选择 2000 个位置。 x轴代表这些位置原始数据的表达值,y轴代表同一位置的vipcca整合后数据的表达值。
pl.plotCorrelation(adata_integrate.raw.X, adata_integrate.X, save=False, rnum=2000, lim=10)
scRNA-seq+scATAC-seq integration
Preprocessing with R
- For the scRNA-seq data: We obtained 13 cell types using a standard workflow in Seurat. The 13 cell types include 460 B cell progenitor, 2,992 CD14+ Monocytes, 328 CD16+ Monocytes, 1,596 CD4 Memory, 1,047 CD4 Naïve, 383 CD8 effector, 337 CD8 Naïve, 74 Dendritic cell, 592 Double negative T cell, 544 NK cell, 68 pDC, 52 Plateletes, and 599 pre-B cell.
- For the scATAC-seq data: First, we load in the provided peak matrix and collapse the peak matrix to a “gene activity matrix” using Seurat. Then we filtered out cells that have with fewer than 5,000 total peak counts to focus on a final set of 7,866 cells for analysis. See the Seurat website for tutorial and documentation for analysing scATAC-seq data.
library(Seurat)
library(ggplot2)
library(patchwork)
peaks <- Read10X_h5("/Users/zhongyuanke/data/seurat_data/sc_atac/atac_v1_pbmc_10k_filtered_peak_bc_matrix.h5")
# create a gene activity matrix
activity.matrix <- CreateGeneActivityMatrix(
peak.matrix = peaks,
annotation.file = "/Users/zhongyuanke/data/seurat_data/sc_atac/Homo_sapiens.GRCh37.82.gtf",
seq.levels = c(1:22, "X", "Y"),
upstream = 2000,
verbose = TRUE
)
pbmc.atac <- CreateSeuratObject(counts = peaks, assay = "ATAC", project = "10x_ATAC")
pbmc.atac[["ACTIVITY"]] <- CreateAssayObject(counts = activity.matrix)
meta <- read.table(
"/Users/zhongyuanke/data/seurat_data/sc_atac/atac_v1_pbmc_10k_singlecell.csv",
sep = ",",
header = TRUE,
row.names = 1,
stringsAsFactors = FALSE
)
meta <- meta[colnames(pbmc.atac), ]
pbmc.atac <- AddMetaData(pbmc.atac, metadata = meta)
# filter
pbmc.atac <- subset(pbmc.atac, subset = nCount_ATAC > 5000)
pbmc.atac$tech <- "atac"
After filter, we converting Seurat Object to AnnData via h5Seurat using R packages. In this case, the atac.h5ad file will be generated in the corresponding path.
library(SeuratDisk)
SaveH5Seurat(atac, filename = "atac.h5Seurat")
Convert("atac.h5Seurat", dest = "h5ad")
Importing scbean package
import scbean.model.vipcca as vip
import scbean.tools.utils as tl
import scbean.tools.plotting as pl
import scbean.tools.transferLabel as tfl
import scanpy as sc
from sklearn.preprocessing import LabelEncoder
import matplotlib
matplotlib.use('TkAgg')
# Command for Jupyter notebooks only
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
from matplotlib.axes._axes import _log as matplotlib_axes_logger
matplotlib_axes_logger.setLevel('ERROR')
adata_rna = tl.read_sc_data("/Users/zhongyuanke/data/vipcca/atac/rna.h5ad")
adata_atac = tl.read_sc_data("/Users/zhongyuanke/data/vipcca/atac/geneact.h5ad")
Data preprocessing
adata_all= tl.preprocessing([adata_rna, adata_atac])
VIPCCA Integration
# Command for Jupyter notebooks only
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"
handle = vip.VIPCCA(adata_all=adata_all,
res_path='/Users/zhongyuanke/data/vipcca/atac_result/',
mode='CVAE',
split_by="_batch",
epochs=20,
lambda_regulizer=2,
batch_input_size=64,
batch_input_size2=14,
)
adata_integrate=handle.fit_integrate()
Cell type prediction
atac=tfl.findNeighbors(adata_integrate)
adata_atac.obs['celltype'] = atac['celltype']
adata = adata_rna.concatenate(adata_atac)
adata_integrate.obs['celltype'] = adata.obs['celltype']
UMAP Visualization
sc.pp.neighbors(adata_integrate, use_rep='X_vipcca')
sc.tl.umap(adata_integrate)
sc.set_figure_params(figsize=[5.5, 4.5])
sc.pl.umap(adata_integrate, color=['_batch', 'celltype'])
生活很好,有你更好