scRNA-seq Clustering
学习目标:
- 利用多种方法评估用于聚类的PC选择
- 基于重要PC执行单细胞聚类
Single-cell RNA-seq clustering analysis
现在我们已经有了整合的高质量的细胞,我们想知道我们的细胞群体中存在的不同细胞类型。
sc_workflow_integration.png
目标
- 生成特定于细胞类型的簇, 并使用已知的细胞类型标记基因来确定簇的身份。
- 确定分群是否代表真实的细胞类型或由于生物或技术差异而形成的群集 ,例如处于细胞周期S期的细胞群集、特定批次的群集或高线粒体含量的细胞。
挑战
- 识别可能由于无意义的生物或技术差异而导致的 质量较差的群集
- 识别每个分群的 细胞类型
- 保持耐心,因为这可能是聚类和标记识别之间高度迭代的过程(有时甚至回到QC过滤)
建议
- 在执行聚类之前,要很好地了解您对要呈现的细胞类型的期望。了解你所期望的是低复杂性的细胞类型还是高线粒体含量的细胞类型,以及这些细胞是否正在分化
- 如果您有多种情况,执行整合以对齐细胞通常很有帮助
- 如果需要并适合于实验,可以将UMI数量(默认情况下使用sctransfer)、线粒体内容和细胞周期 Regress out ,以避免进行聚类。
- 确定要删除的任何垃圾群集或要重新QC过滤的群集。垃圾群集可能是包含高线粒体含量和低UMIs/基因的那些。如果由许多细胞组成,那么重新回到QC过滤掉,然后重整合/分群可能会很有帮助
- 如果未将所有细胞类型检测为单独的群集,请尝试更改用于分群的分辨率或PC数量
基于top-PCs(metagenes)的细胞分群
识别重要的PCs
为了克服scRNA-seq数据中任何单个基因表达中广泛的技术噪音,Seurat根据细胞从整合的可变性最高的基因的表达中得出的PCA分数将细胞分配到不同的簇,每个PC实质上代表一个结合了相关基因集信息的“metagene”。因此,确定要在分群步骤中包括多少PC对于确保我们捕获数据集中存在的大多数变异或细胞类型是很重要的。
在决定下游分群分析要包括哪些PC之前,先探索下这些PC非常有用。
- (a) 探索PC的一种方法是使用热图来可视化选定PC的高可变基因,并根据PCA得分对基因和细胞进行排序。这里的想法是观察PC,并确定驱动它们的基因是否对区分不同类型的细胞有意义。
cells
参数指定用于绘图的PCA得分负向最低或正向最高的细胞数量。我们的想法是,我们正在寻找一个PC,它的热图开始看起来更“模糊”,也就是说,基因组之间的区别不是那么明显。
# Explore heatmap of PCs
DimHeatmap(seurat_integrated,
dims = 1:9,
cells = 500,
balanced = TRUE)
如果我们想要探索大量的PC,这种方法可能会很慢,很难将可视乎单个基因。在相同的脉络下,为了探索大量的PC,我们可以通过驱动PC的PCA得分打印出前10个(或更多)正向和负向基因。
# Printing out the most variable genes driving PCs
print(x = seurat_integrated[["pca"]],
dims = 1:10,
nfeatures = 5)
- (b) elbow plot 是确定使用多少个PC进行分群的另一种有用的方法,这样我们就可以捕获数据中的大部分变化。elbow plot 直观地显示了每个PC的标准偏差,我们要找的就是标准偏差开始趋于平稳的位置。本质上,elbow 出现的位置通常是识别大部分变化的阈值。但是,这种方法可能相当主观。
让我们使用排名前40位的PC绘制一张elbow plot:
# Plot the elbow plot
ElbowPlot(object = seurat_integrated,
ndims = 40)
基于这个曲线图,我们可以粗略地根据elbow出现在PC8-PC10周围的位置来确定大部分变化,或者有人可能会争辩说,应该是当数据点开始接近X轴时,PC30左右。这让我们对需要包括的PC数量有了一个非常粗略的了解,我们可以以更定量的方式提取这里的可视化的信息,这可能会更可靠一些。
Elbow plot: quantitative approach
基于这个曲线图,我们可以粗略地根据elbow 出现(接触底部)在PC12-PC16的位置之间来确定出大部分变化。虽然这让我们对需要包括的PC数量有了很好的粗略了解,但更定量的方法可能会更可靠一些。我们可以通过取较大的值来计算主成分开始弯曲的位置:
- 主成分只贡献标准偏差的5%,而主成分累计贡献标准偏差的90%的点
- 连续PC之间的变化百分比变化小于0.1%的点
我们将从计算第一个度量开始:
# Determine percent of variation associated with each PC
pct <- seurat_integrated[["pca"]]@stdev / sum(seurat_integrated[["pca"]]@stdev) * 100
# Calculate cumulative percents for each PC
cumu <- cumsum(pct)
# Determine which PC exhibits cumulative percent greater than 90% and % variation associated with the PC as less than 5
co1 <- which(cumu > 90 & pct < 5)[1]
co1
第一个度量返回PC42作为符合这些要求的PC。让我们检查第二个度量,它标识了连续PC之间变化百分比小于0.1%的PC:
# Determine the difference between variation of PC and subsequent PC
co2 <- sort(which((pct[1:length(pct) - 1] - pct[2:length(pct)]) > 0.1), decreasing = T)[1] + 1
# last point where change of % of variation is more than 0.1%.
co2
第二个度量返回PC14。通常,我们会选择这两个指标中最小的一个,因为PC覆盖了数据中的大部分变化。
# Minimum of the two calculation
pcs <- min(co1, co2)
pcs
基于这些指标,对于Seurat中的细胞分群,我们将使用前14个PC来生成群集。我们可以再次绘制elbow plot,并覆盖使用我们的指标确定的信息:
# Create a dataframe with values
plot_df <- data.frame(pct = pct,
cumu = cumu,
rank = 1:length(pct))
# Elbow plot to visualize
ggplot(plot_df, aes(cumu, pct, label = rank, color = rank > pcs)) +
geom_text() +
geom_vline(xintercept = 90, color = "grey") +
geom_hline(yintercept = min(pct[pct > 5]), color = "grey") +
theme_bw()
UPDATE THIS IMAGE!!
虽然上述两种方法与Seurat的旧方法一起被更多地用于归一化和鉴定可变基因,但它们不再像以前那样重要。这是因为SCTransform方法比旧方法更准确。
为什么选择PC对于旧的方法更重要?
旧的方法在一些较高的PC中加入了一些技术差异来源,因此PC的选择更为重要。SCTransform更好地估计了差异,并且在较高的PC中不经常包括这些技术差异来源。
从理论上讲,使用SCTransform时,我们选择的PC越多,在执行分群时考虑的差异就越大,但执行分群所需的时间要花费更多。因此,对于此分析,我们将使用前40个PC来生成群集。
未完待续......
注:以上内容来自哈佛大学生物信息中心(HBC)_的教学团队的生物信息学培训课程。原文链接:https://hbctraining.github.io/scRNA-seq/schedule/
- Linux中MySQL5.6编译安装与MySQL5.7二进制安装步骤
- Nginx服务编译安装、日志功能、状态模块及访问认证模式实操
- 快速入门系列--WebAPI--03框架你值得拥有
- 快速入门系列--MVC--06视图
- 腾讯入局物业管理 欲改造传统服务?
- ExtJs学习笔记(4)_EditorGridPanel(可编辑的网格控件)
- ansible批量管理软件部署及剧本
- 快速入门系列--MVC--02路由
- Javascript生成GUID
- 快速入门系列--MVC--04模型
- 快速入门系列--MVC--03控制器和IOC应用
- ExtJs学习笔记(3)_GridPanel[XML做数据源]
- 快速入门系列--MVC--05行为
- Linux Rsync备份服务介绍及部署守护进程模式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 曾经豪言“指哪爬哪”,如今被一个JS狠狠教做人
- mysql主从复制延迟问题记录
- linux下设置locale
- 宜信OCR技术探索与实践|直播速记
- keepalived结合lvs实现双机热备
- jenkins安装说明
- Haproxy combined with FTP cluster for load balancing
- redis使用playbook批量安装
- SpringCloud Alibaba微服务实战十八 - Oauth2.0 自定义授权模式
- 包子旧闻&Leetcode solution 1344. Angle Between Hands of a Clock
- Ubuntu下DNS服务搭建
- 深入理解JavaScript函数式编程
- JavaScript 异步编程
- 日志清理脚本-V0.0.3(增加多目录清理、正则表达式匹配、调试模式;部分细节优化)
- Fastdfs高可用集群搭建