封面
❝
熟悉师兄公众号的都应该清楚,师兄之前的推文主要集中在各种类型的科研绘图上!但是不少粉丝小伙伴们还是反应,只知道绘图,数据不会分析,还是不行的呀!没错,拿不到可靠的分析结果,只知道绘图,这当然是远远不够的!因此,
学习各种常用的生信数据分析则必然成为了每一个生信人必须要经历的事情。
因此,后续的推文中,师兄会尽可能地多更新一些有关数据分析的内容,可能包含的系列包括《R语言数据处理基本技巧》、《从零开始学单细胞转录组》、《从零开始学空间转录组》等;
本系列,师兄将
从单细胞转录组学开始
,带领大家一起
从零开始学单细胞
!系列内容可以详见下方大纲!
说明:
由于本系列教程还是强调
面对完全零基础小白
,所以很多内容师兄会介绍的非常细,对于部分已经入门的老手来说可能比较多余,所以
大家选择性阅读即可!
本系列主要内容目录及单细胞学习交流群,请看Part 1;
本期主要内容,请看Part 2;
合作服务器推荐及生信师兄粉丝专属优惠详情,请看Part 3;
如果您觉得本系列文章对你有帮助的话,欢迎
点赞、收藏、在看+转发
!您的支持是师兄持续更新的最大动力!
Part 1 系列介绍
1.1 内容大纲
单细胞转录组系列教程目录
1.2 生信师兄单细胞学习交流群
❝
当然了,好的学习过程离不开详尽地交流讨论和重难点答疑!因此,在发布教程的同时,师兄也成立了
《生信师兄单细胞学习交流群》
用于本系列内容的学习交流。需要的小伙伴可以扫描下方二维码,添加师兄微信后备注
“单细胞学习交流群”
后付费加群!
1.2.1 群内资源
本系列所有免费及付费内容的配套学习资源、代码资源及示例数据;
群内资源(以上图课程目录为准)
师兄会在群内提供不定时答疑,满足答疑要求的问题师兄会尽可能抽时间回答;
1.2.2 入群费用
入群费用:
¥299元(每集赞1个抵扣1元,至多抵扣100元!此优惠永久有效!)
1.2.3 本系列不含视频教程
目前,师兄还没有足够的时间进行视频课程的录制,所以
本系列教程不包含视频课程
!但是如果大家需要,师兄也一定会尽可能抽时间录制课程!
如果后续推出视频课程
,还是和《R语言科研绘图进阶版视频教程》一样,
加群的小伙伴届时可凭借入群截图,抵扣购课差价。
所以,早入群早享受吧!
1.2.4 声明
❝
是否加群,纯属自愿!
本系列的大部分内容会是免费阅读,
所以完全支持白嫖!
但是看完还请动动你的手指,
点个赞!点个在看!如果能转发那就太感谢了!
加群可以
获取本系列所有付费部分内容,代码,示例数据,以及定期答疑的交流群
!
如果考虑好加群,就
早加早享受,随着群内资源的增加,入群的费用也可能会随之增加
!
优惠方式
:
点赞 + 在看,并转发这个系列任意一篇文章至朋友圈,每集赞1个抵扣1元,至多抵扣100元!此优惠永久有效哦!
Part2 主要内容
❝
在单细胞转录组数据中,由于实验条件、样本来源、测序平台等多种因素的影响,
不同样本之间往往存在批次效应和技术偏倚
,这限制了我们对细胞复杂性的深入理解。因此,
整合多个单细胞数据集成为了一个迫切的需求,以消除这些技术噪声,提高数据的可靠性和一致性。
本文将介绍多种单细胞样本整合的方法,其中包括
基于锚定点的方法CCA、Harmony方法
。
2.1 为什么要整合?意义是什么?
2.1.1 消除批次效应
不同批次的实验会引入系统性差异,这些差异可能来源于实验条件、仪器、试剂或技术人员的差异。整合单细胞数据有助于:校正批次效应,使得来自不同实验批次的数据可以被公平地比较。
2.1.2 提高统计效力
通过整合多个数据集,可以增加样本量,从而提高统计分析的效力,使结果更加可靠。此外,还可能
检测到稀有细胞类型或状态
,这些在单个样本中可能难以发现。
2.1.3 促进数据共享和再利用
通过整合公开的单细胞数据集,可以
最大化数据利用价值
,为其他研究提供参考和基础。此外,不同数据的整合还可以
验证发现的普遍性
,确保在不同实验条件下的结果一致。
2.2 基于CCA锚点的整合
2.2.1 简介
基于锚点的数据整合方法是一种用于整合多组单细胞RNA测序(scRNA-seq)数据的技术,旨在
消除批次效应,并在不同数据集之间找到共同的细胞类型和状态。
最早由Seurat开发团队提出,特别是在Seurat v3版本中得到了详细介绍和实现。
参考文献
❝
Tips:
推荐一篇介绍该方法产生的来龙去脉的推文,个人觉得写得非常好,发布在BioArts上,大家感兴趣可以阅读:
https://mp.weixin.qq.com/s/o-TvvNOnMMKh88nqF7NxPg
2.2.2 基本步骤
基本步骤
2.2.2.1 数据集概述
参考数据集:
通常是一个已经经过详细分析和注释的数据集,被认为是一个标准或基准,可以用来比较和整合其他数据集。
查询数据集:
是需要与参考数据集进行比较和整合的新数据集。这个数据集可能来源于不同的实验、不同的条件或不同的批次,尚未进行过详细的注释和分析。
共享生物状态
:两个数据集
共享相似生物状态的细胞
,但查询数据集
包含独特的细胞群体(黑色表示)
。
2.2.2.2 数据预处理与降维
典型相关分析(CCA)
:对两个数据集进行CCA,将数据集投射到由数据集之间共享的相关性结构定义的子空间中;
L2归一化
:对典型相关向量进行L2归一化,以规范化数据并增强比较的准确性;
2.2.2.3 识别锚点
相互最近邻居
:在共享空间中,
识别出参考数据集细胞和查询数据集细胞中的相互最近邻居
。这些细胞对应该代表
处于共享生物状态的细胞,并作为“锚点”来指导数据集整合。
错误锚点
:原则上,
特有群体中的细胞不应被识别为锚点(上图黑色细胞)
,但在实践中,可能会观察到错误的锚点。
2.2.2.4 锚点评分
邻域结构一致性
:根据每个数据集的邻域结构中锚点的一致性为每个锚对分配一个分数。
高分表示锚点对的鲁棒性更高
。
筛选锚点:
通过锚对之间的局部邻域的重叠度来评估锚对之间的相似度来去除错误锚点,即锚点对细胞周边的细胞是否也具有较高的相似度?
2.2.2.5 数据整合
计算校正向量
:利用锚点及其分数,计算每个查询数据集细胞的“校正”向量。
表达式转换
:通过校正向量转换查询数据集细胞的表达式,使其能够与参考数据集进行联合分析,实现数据整合。
❝
Tips:
这项算法的
独特之处在于引入了“细胞锚定”策略
,此外,基于锚点的样本整合方法不仅限于scRNA-seq技术,同样也适用于其他技术如scATAC-seq技术数据的整合。Satija课题组的这一通用整合方案,通过精心设计的算法和严格的独立测试,不仅能
有效消除批次效应,保留真实的生物学影响,还能完整地迁移离散和连续的多模态信息
。
2.2.3 代码实操
2.2.3.1 基于常规LogNormalize的标准化方法进行数据整合
# 安装并加载所需包 if (!requireNamespace("Seurat" , quietly = TRUE )) install.packages("Seurat" )if (!requireNamespace("SeuratData" , quietly = TRUE )) install.packages("SeuratData" )library (Seurat)library (SeuratData)library (patchwork)library (sctransform)library (tidyverse)# 加载ifnb示例数据 # InstallData("ifnb") # 确保示例数据已安装 ############ 对象读取和拆分 ---------------- # 该对象包含来自两种条件的人类PBMC数据,即干扰素刺激细胞和对照细胞。我们的目标是将这两个条件整合在一起,以便我们可以跨数据集共同识别细胞亚群,然后探索每个组在不同条件下的不同之处: ifnb <- LoadData("ifnb" )# 先根据meta信息将数据拆分成两个不同处理的数据: ifnb[["RNA" ]] <- split(ifnb[["RNA" ]], f = ifnb$stim) ifnb## An object of class Seurat ## 14053 features across 13999 samples within 1 assay ## Active assay: RNA (14053 features, 0 variable features) ## 4 layers present: counts.CTRL, counts.STIM, data.CTRL, data.STIM
数据拆分
❝
Tips:
在早期的 Seurat 版本中,数据整合流程需要
多个Seurat对象的列表作为输入
。在 Seurat v5 中,
所有数据都可以作为单个对象保存
,并且在集成之前,用户可以简单地分割每个层。
############ 不整合的情况下分析 ---------------- ifnb <- NormalizeData(ifnb) %>% FindVariableFeatures() %>% ScaleData() %>% RunPCA() %>% FindNeighbors(dims = 1 :30 , reduction = "pca" ) %>% FindClusters(resolution = 2 , cluster.name = "unintegrated_clusters" ) %>% RunUMAP(dims = 1 :30 , reduction = "pca" , reduction.name = "umap.unintegrated" )## Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck ## ## Number of nodes: 13999 ## Number of edges: 555146 ## ## Running Louvain algorithm... ## Maximum modularity in 10 random starts: 0.8153 ## Number of communities: 26 ## Elapsed time: 1 seconds DimPlot(ifnb, reduction = "umap.unintegrated" , group.by = c("stim" , "seurat_clusters" ))
umap_unintergrated
❝
从左图可以明显看出两组细胞之间存在着明显的分隔,表明批次效应没有很好的去除!
############ 基于整合后的结果分析 ------------------- # 整合:注意V5版本的整合只需要一个函数,相比于V4版本精简了很多! ifnb <- IntegrateLayers( object = ifnb, method = CCAIntegration, orig.reduction = "pca" , new.reduction = "integrated.cca" , verbose = FALSE )# 整合后,使用JoinLayer函数重新将两个layer进行整合: ifnb[["RNA" ]] <- JoinLayers(ifnb[["RNA" ]])
CCAIntergration
❝
Tips:
整合后,reductions层中多了intergrated.cca对象。需要注意的是
该对象的维度只有50维,表明其是基于pca的结果做的整合
!这与V4版本存在显著不同,
V4版本的整合是基于2000个高变基因的数据做的(但是CCA的过程中本身也涉及到了降维)
,由于其整合的数据来源发生了变化,所以整合后的结果也从原本放在assays中,改为放到reductions中了!
这里可以参考官网的更新说明:https://satijalab.org/seurat/articles/announcements;明确指出,
新的整合是基于低维数据做的
,并且V5版本中依旧支持运行V4的workflow!
ifnb <- FindNeighbors(ifnb, reduction = "integrated.cca" , dims = 1 :30 ) %>% FindClusters(resolution = 1 ) %>% RunUMAP(dims = 1 :30 , reduction = "integrated.cca" )## Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck ## ## Number of nodes: 13999 ## Number of edges: 590318 ## ## Running Louvain algorithm... ## Maximum modularity in 10 random starts: 0.8453 ## Number of communities: 19 ## Elapsed time: 2 seconds DimPlot(ifnb, reduction = "umap" , group.by = c("stim" , "seurat_annotations" ))
umap_intergrated
# 通过split.by参数,并排展示整合后两组数据的分群效果:可以看出两组数据融合的非常好! DimPlot(ifnb, reduction = "umap" , split.by = "stim" )
umap
2.2.3.2 基于SCTransform的标准化方法进行数据整合
############ 前面的步骤都一样 ------------------- ifnb <- LoadData("ifnb" ) ifnb[["RNA" ]] <- split(ifnb[["RNA" ]], f = ifnb$stim)############ 不整合的情况下分析 ---------------- ifnb <- SCTransform(ifnb) %>% RunPCA() %>% FindNeighbors(dims = 1 :30 , reduction = "pca" ) %>% FindClusters(resolution = 2 , cluster.name = "unintegrated_clusters" ) %>% RunUMAP(dims = 1 :30 , reduction = "pca" , reduction.name = "umap.unintegrated" ) DimPlot(ifnb, reduction = "umap" , group.by = c("stim" , "seurat_annotations" ))
umap_sct_unintergrated
############ 基于整合后的结果分析 ------------------- # 这里需要注意:normalization.method需要设置为"SCT"; ifnb <- IntegrateLayers(object = ifnb, method = CCAIntegration, normalization.method = "SCT" , verbose = F )
SCT-CCAIntergration
❝
Tips:
整合后,reductions层中多了intergrated.dr对象。需要注意的是V5版本中,新的整合不会在assays中新增Intergrated这个assay了!
# 这里也要注意,因为此时聚类和分群基于的是reduction中的intergrated.dr信息: ifnb <- FindNeighbors(ifnb, reduction = "integrated.dr" , dims = 1 :30 ) %>% FindClusters(resolution = 0.6 ) %>% RunUMAP(dims = 1 :30 , reduction = "integrated.dr" )## Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck ## ## Number of nodes: 13999 ## Number of edges: 544933 ## ## Running Louvain algorithm... ## Maximum modularity in 10 random starts: 0.9072 ## Number of communities: 19 ## Elapsed time: 1 seconds DimPlot(ifnb, reduction = "umap" , group.by = c("stim" , "seurat_annotations" ))
umap_sct_intergrated
2.3 Harmony
2.3.1 简介
Harmony 基于一个迭代的优化算法,能够在保持生物学变异的同时,校正来自不同数据集(批次)的技术差异。其核心思想是通过调整细胞在低维嵌入空间中的位置,使同一生物状态的细胞在不同批次中对齐。
参考文献
2.3.2 基本步骤
Harmony基本步骤
PCA嵌入
:使用主成分分析(PCA)将细胞嵌入到降维后的空间中。
数据初始化
:Harmony 接受在降维空间中的细胞坐标,并运行迭代算法来调整数据集特定的效应。
模糊聚类
:使用
模糊聚类方法将每个细胞分配给多个Cluster,惩罚项确保每个Cluster内数据集的多样性最大化
。
计算中心点
:对于每个群集,Harmony 计算全局中心点和每个数据集特定的中心点。
计算校正因子
:在每个群集内,根据中心点计算每个数据集的校正因子。
细胞校正
:使用细胞特定因子来校正每个细胞,这是根据在步骤a中细胞软聚类分配的数据集校正因子的加权线性组合。
迭代优化
:重复执行步骤上述步骤a-d,直到达到收敛。随着每轮迭代,Cluster分配与数据集之间的依赖关系减少。