10X单细胞转录组整合、转录组 && ATAC整合分析之VIPCCA

隔离的第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 可以将多模态转换为低维空间,而无需任何事后数据处理,这是与现有对齐方法形成直接对比的独特且理想的功能。

图片.png

示例代码,这里要结合上一篇分享的内容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,)
图片.png
Plot correlation

该函数仅适用于 fit_integrate() 函数训练生成的 AnnData。 在基因表达矩阵中随机选择 2000 个位置。 x轴代表这些位置原始数据的表达值,y轴代表同一位置的vipcca整合后数据的表达值。

pl.plotCorrelation(adata_integrate.raw.X, adata_integrate.X, save=False, rnum=2000, lim=10)
图片.png

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'])
图片.png

生活很好,有你更好

©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容