单细胞聚类,究竟聚类聚成多少类比较合适?全代码分享

news2024/11/15 4:26:16

单细胞数据分析到最后一步往往都需要聚类,进而给亚群命名。但是我们通常纠结resolution到底选多大为好,究竟聚成多少类比较合适?今天我们使用Silhouette来确定多少类比较合适。

关注微信:生信小博士

选择最优聚类有多种方式,今天着重于Silhouette Method。

Determining optimal number of clusters (k)

Before we do the actual clustering, we need to identity the Optimal number of clusters (k) for this data set of wholesale customers. The popular way of determining number of clusters are

  1. Elbow Method
  2. Silhouette Method
  3. Gap Static Method

Elbow and Silhouette methods are direct methods and gap statistic method is the statistics method.

In this demonstration, we are going to see how silhouette method is used.

1 最优聚类 数据前处理

如果你已经准备好前期的数据,此步可以省略。

这一步的目的:会得到一个名为inttegtaed_data的seurat对象。

slide_files <- list.files("~/silicosis/spatial/prcessed_visum_for_progeny/data/",recursive = TRUE,
                                        all.files = TRUE,full.names = TRUE,pattern = "_")




integrated_data <- map(slide_files, readRDS)
print("You managed to load everything")
print("Object size")
print(object.size(integrated_data))





# Calculate HVG per sample - Here we assume that batch and patient effects aren't as strong
# since cell-types and niches should be greater than the number of batches

Assays(integrated_data [[1]])
str(integrated_data [[1]])



def_assay="Spatial"


hvg_list <- map(integrated_data, function(x) {
  
  DefaultAssay(x) <- def_assay
  
  x <- FindVariableFeatures(x, selection.method = "vst", 
                            nfeatures = 3000)
  
  x@assays[[def_assay]]@var.features
  
}) %>% unlist()

hvg_list <- table(hvg_list) %>%
  sort(decreasing = TRUE)




gene_selection_plt <- hvg_list %>% enframe() %>% 
  group_by(value) %>% 
  mutate(value = as.numeric(value)) %>%
  summarize(ngenes = length(name)) %>% 
  ggplot(aes(x = value, y = ngenes)) + 
  geom_bar(stat = "identity")

gene_selection <- hvg_list[1:3000] %>% names()


#########
# Create merged object ---------------------------------
integrated_data <- purrr::reduce(integrated_data,
                          merge,
                          merge.data = TRUE)

print("You managed to merge everything")
print("Object size")
print(object.size(integrated_data))

# Default assay ---------------------------------------
#DefaultAssay(integrated_data) <- def_assay



# Process it before integration -----------------------
integrated_data <- integrated_data %>%
  ScaleData(verbose = FALSE) %>% 
  RunPCA(features = gene_selection, 
         npcs = 30, 
         verbose = FALSE) 

original_pca_plt <- DimPlot(object = integrated_data, 
                            reduction = "pca", 
                            pt.size = .1, 
                            group.by = "orig.ident")

head(integrated_data@meta.data)

batch_covars="orig.ident"
# Integrate the data -----------------------
integrated_data <- RunHarmony(integrated_data, 
                              group.by.vars =   batch_covars, 
                              plot_convergence = TRUE,
                              assay.use = def_assay,
                              max.iter.harmony = 20)



# Corrected dimensions -----------------------
corrected_pca_plt <- DimPlot(object = integrated_data, 
                             reduction = "harmony", 
                             pt.size = .1, 
                             group.by = "orig.ident")


# Create the UMAP with new reduction -----------
integrated_data <- integrated_data %>% 
  RunUMAP(reduction = "harmony", dims = 1:30,
          reduction.name = "umap_harmony") %>%
  RunUMAP(reduction = "pca", dims = 1:30,
          reduction.name = "umap_original")

integrated_data <- FindNeighbors(integrated_data, 
                                 reduction = "harmony", 
                                 dims = 1:30)

head(integrated_data@meta.data)

colnames(integrated_data@meta.data)=gsub(pattern ="_snn_res.",replacement = "_before",x = colnames(integrated_data@meta.data) ) 

准备好的数据如下。这里的数据你可以使用seurat的pbmc教程中的数据,作为练习。

然后进行下一步

2 开始最优聚类

全代码如下

optimize=TRUE
################opt cluster--------------
if(optimize) { 
  
  # Clustering and optimization -------------------------
  print("Optimizing clustering")
  
  seq_res <- seq(0.5, 1.5, 0.1)
  
# seq_res=1
  integrated_data <- FindClusters(integrated_data,
                                  resolution = seq_res,
                                  verbose = F)
  
  clustree_plt <- clustree::clustree(integrated_data, 
                           prefix = paste0(DefaultAssay(integrated_data), "_snn_res."))
  
  # Optimize clustering ------------------------------------------------------
  cell_dists <- dist(integrated_data@reductions$harmony@cell.embeddings,
                     method = "euclidean")
  head(cell_dists)
 
  
  cluster_info <- integrated_data@meta.data[,grepl(paste0(DefaultAssay(integrated_data),"_snn_res"),
                                                   colnames(integrated_data@meta.data))] %>%
    dplyr::mutate_all(as.character) %>%
    dplyr::mutate_all(as.numeric)
  
  head(cluster_info)[,1:9]
#  head(cell_dists)[,1:9]
  si= silhouette(cluster_info[,1], cell_dists) %>%head()
  si
   
  silhouette_res <- apply(cluster_info, 2, function(x){
    si <- silhouette(x, cell_dists)
   
     if(!any(is.na(si))) {
      mean(si[, 'sil_width'])
    } else {
      NA
    }
  })
  head(silhouette_res)
  
  integrated_data[["opt_clust_integrated"]] <- integrated_data[[names(which.max(silhouette_res))]]
  
  Idents(integrated_data) = "opt_clust_integrated"
  
最终会得到一个opt_clust_integrated,代表最优聚类的清晰度。如果你的数据比较大,可以调整   seq_res <- seq(0.5, 1.5, 0.1),把1.5调到3,甚至更高。

上述代码的部分运行结果:

根据下面的图,resolution为0.7是最优聚类

3 找到最优聚类之后,把多余的聚类结果删掉,节省内存

全代码如下

  # Reduce meta-data -------------------------------------------------------------------------
  spam_cols <- grepl(paste0(DefaultAssay(integrated_data), "_snn_res"),
                     colnames(integrated_data@meta.data)) |
    grepl("seurat_clusters",colnames(integrated_data@meta.data))
  
  integrated_data@meta.data <- integrated_data@meta.data[,!spam_cols]
  
} else {
  
  print("Not Optimizing clustering")
  
  seq_res <- seq(0.2, 1.6, 0.2)
  
  integrated_data <- FindClusters(integrated_data,
                                  resolution = seq_res,
                                  verbose = F)
  
  clustree_plt <- clustree(integrated_data, 
                           prefix = paste0(DefaultAssay(integrated_data), 
                                           "_snn_res."))
  
  integrated_data <- FindClusters(integrated_data,
                                  resolution = default_resolution,
                                  verbose = F)
  
  integrated_data[["opt_clust_integrated"]] <- integrated_data[["seurat_clusters"]]
  
  spam_cols <- grepl(paste0(DefaultAssay(integrated_data), "_snn_res"),
                     colnames(integrated_data@meta.data)) |
    grepl("seurat_clusters",colnames(integrated_data@meta.data))
  
  integrated_data@meta.data <- integrated_data@meta.data[,!spam_cols]
  
}

4 保存对象

# Save object ------------------------------------------------------
saveRDS(integrated_data, file ="~/silicosis/spatial/integrated_slides/integrated_slides.rds" )

 关注微信:生信小博士

参考: 

https://medium.com/codesmart/r-series-k-means-clustering-silhouette-794774b46586#id_token=eyJhbGciOiJSUzI1NiIsImtpZCI6ImEwNmFmMGI2OGEyMTE5ZDY5MmNhYzRhYmY0MTVmZjM3ODgxMzZmNjUiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJhenAiOiIyMTYyOTYwMzU4MzQtazFrNnFlMDYwczJ0cDJhMmphbTRsamRjbXMwMHN0dGcuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJhdWQiOiIyMTYyOTYwMzU4MzQtazFrNnFlMDYwczJ0cDJhMmphbTRsamRjbXMwMHN0dGcuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzdWIiOiIxMTIyMzMxNDE1MDU0MDY1NzA5OTMiLCJlbWFpbCI6ImFudGkuY2FuY2VyLmZpZ2h0ZXJAZ21haWwuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsIm5iZiI6MTY5ODE5ODYzMCwibmFtZSI6InlhbmcgeWFuZyIsInBpY3R1cmUiOiJodHRwczovL2xoMy5nb29nbGV1c2VyY29udGVudC5jb20vYS9BQ2c4b2NKUjVFOGJoU2wxRUVtUDcyVXhPUExGU2VlNlcza2hlZVItVnVaZDZiei09czk2LWMiLCJnaXZlbl9uYW1lIjoieWFuZyIsImZhbWlseV9uYW1lIjoieWFuZyIsImxvY2FsZSI6ImVuIiwiaWF0IjoxNjk4MTk4OTMwLCJleHAiOjE2OTgyMDI1MzAsImp0aSI6ImJlNjYyNmYyMWMwZGE4MjgzZWUzMWEzMGU0ZGY2MWQ0Y2M3YzlkODgifQ.FddjhGbYiuFDFjWFmjGcAXNdbuR3XyqzqWWv8NvyJnREj48qhcFsI4HHv0DWnwewOsmr2jnCnC51nInSyBvgZJSjAQMdUAVpoZTwvroliR3wB6q8In29eXhZ2N_WgqVqoTcMT5yECF4oJrVZgDYxG5t17KAIYso3pvbpCy-5oVq8zBPZ8M8HRd83upKAODDC4bAKtGsGqlFYDV-bD7L1pXsRw3HWebcyY7bfk74FVtnveGyk-A0VIHjDIAdxxjqMiZmuntRX7PUV-nXhSeiBxzI8W4kjHO8uQKlwaCgjyOARTNQ2b-AOY5f5gr6BP0kin9DN6rk7QuPfrvVIgg4yGwicon-default.png?t=N7T8https://medium.com/codesmart/r-series-k-means-clustering-silhouette-794774b46586#id_token=eyJhbGciOiJSUzI1NiIsImtpZCI6ImEwNmFmMGI2OGEyMTE5ZDY5MmNhYzRhYmY0MTVmZjM3ODgxMzZmNjUiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJhenAiOiIyMTYyOTYwMzU4MzQtazFrNnFlMDYwczJ0cDJhMmphbTRsamRjbXMwMHN0dGcuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJhdWQiOiIyMTYyOTYwMzU4MzQtazFrNnFlMDYwczJ0cDJhMmphbTRsamRjbXMwMHN0dGcuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzdWIiOiIxMTIyMzMxNDE1MDU0MDY1NzA5OTMiLCJlbWFpbCI6ImFudGkuY2FuY2VyLmZpZ2h0ZXJAZ21haWwuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsIm5iZiI6MTY5ODE5ODYzMCwibmFtZSI6InlhbmcgeWFuZyIsInBpY3R1cmUiOiJodHRwczovL2xoMy5nb29nbGV1c2VyY29udGVudC5jb20vYS9BQ2c4b2NKUjVFOGJoU2wxRUVtUDcyVXhPUExGU2VlNlcza2hlZVItVnVaZDZiei09czk2LWMiLCJnaXZlbl9uYW1lIjoieWFuZyIsImZhbWlseV9uYW1lIjoieWFuZyIsImxvY2FsZSI6ImVuIiwiaWF0IjoxNjk4MTk4OTMwLCJleHAiOjE2OTgyMDI1MzAsImp0aSI6ImJlNjYyNmYyMWMwZGE4MjgzZWUzMWEzMGU0ZGY2MWQ0Y2M3YzlkODgifQ.FddjhGbYiuFDFjWFmjGcAXNdbuR3XyqzqWWv8NvyJnREj48qhcFsI4HHv0DWnwewOsmr2jnCnC51nInSyBvgZJSjAQMdUAVpoZTwvroliR3wB6q8In29eXhZ2N_WgqVqoTcMT5yECF4oJrVZgDYxG5t17KAIYso3pvbpCy-5oVq8zBPZ8M8HRd83upKAODDC4bAKtGsGqlFYDV-bD7L1pXsRw3HWebcyY7bfk74FVtnveGyk-A0VIHjDIAdxxjqMiZmuntRX7PUV-nXhSeiBxzI8W4kjHO8uQKlwaCgjyOARTNQ2b-AOY5f5gr6BP0kin9DN6rk7QuPfrvVIgg4yGw

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1131598.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SSM(Spring SpringMVC MyBatis)配置文件信息,完成学生管理页面(前后端全部代码)

效果图&#xff08;elementUI&#xff09; 项目结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sche…

有必要买一台内衣裤专洗机吗?性价比超高内衣洗衣机推荐

如果你经常为洗袜子而烦恼&#xff0c;一台迷你洗衣机正是你的救星&#xff01;这款小巧轻便的小产品&#xff0c;是专门为我们解决洗贴身衣物问题而设计的。无论品牌或款式&#xff0c;我们都为你精心为您推荐了许多品质优良的产品。不管你是一个有宝宝的母亲&#xff0c;还是…

C/C++数据结构——队列

个人主页&#xff1a;仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客 专题分栏&#xff1a;数据结构_仍有未知等待探索的博客-CSDN博客 目录 一、前言 二、队列的基本操作&#xff08;循环队&#xff09; 1、循环队的数据类型 2、循环队的名词解释 3、循环队的创建及…

prosemirror 学习记录(三)tooltip

prosemirror Tooltip example 自己写的版本&#xff1a; import { Plugin } from "prosemirror-state";export const MyTooltipPlugin new Plugin({view(view) {const tooltip document.createElement("div");tooltip.classList.add("my-custom-t…

大模型在数据分析场景下的能力评测

“你们能对接国产大模型吗&#xff1f;” “开源的 LLaMA 能用吗&#xff0c;中文支持怎么样&#xff1f;” “私有化部署和在线服务哪个更合适&#xff1f;” 自 7 月 14 日发布 AI 数智助理 Kyligence Copilot 后&#xff0c;我们收到了很多类似上面的咨询&#xff0c;尤其…

Django token 认证原理与实战

概述 cookie、session 与token 的区别 Cookie的作用 cookie的存储量很小&#xff0c;一般不超过4Kcookie并不会保存很多信息&#xff0c;一般用来存储登录状态cookie是以键值对进行表示的(keyvalue),例如nameli,表示cookie的名字是name,cookie携带的值是licookie的存储分为会…

php 使用 python translate 实现离线翻译

下载类库 下载语言模型 使用 脚本 offline_translation.py # 离线翻译服务代码 import warningsfrom flask import Flask, request from gevent import pywsgi from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, pipeline, AutoModelWithLMHead from transf…

TCP 协议的可靠传输机制是怎样实现的?

TCP 协议是一种面向连接的、可靠的、基于字节流的传输层协议。 1 它通过以下几种方法来保证数据传输的可靠性&#xff1a; 检验和&#xff1a;TCP 在发送和接收数据时&#xff0c;都会计算一个检验和&#xff0c;用来检测数据是否在传输过程中发生了错误或损坏。如果检验和不匹…

【Docker】Docker Compose的使用

我们知道使用一个Dockerfile模板文件&#xff0c;可以让用户很方便的定义⼀个单独的应用容器。然而&#xff0c;在日常工作中&#xff0c;经常会碰到需要多个容器相互配合来完成某项任务的情况。 例如要实现一个Web项目&#xff0c;除了Web服务容器本身&#xff0c;往往还需要…

python实验16_网络爬虫

实验16&#xff1a;网络爬虫 1.实验目标及要求 &#xff08;1&#xff09;掌握简单爬虫方法。 2. 实验主要内容 爬取中国票房网 ① 爬取中国票房网&#xff08;www.cbooo.cn)2019年票房排行榜前20名的电影相关数据 代码部分: import time from selenium.webdriver impor…

抽丝剥茧,Redis使用事件总线EventBus或AOP优化健康检测

目录 前言 Lettuce 什么是事件总线EventBus&#xff1f; Connected Connection activated Disconnected Connection deactivated Reconnect failed 使用 一种另类方法—AOP 具体实现 前言 在上一篇深入浅出&#xff0c;SpringBoot整合Quartz实现定时任务与Redis健康…

FastAPI 快速学习之 Flask 框架对比

目录 一、前言二、FastAPI 优势三、Hello World四、HTTP 方法五、URL 变量六、查询字符串七、POST 请求八、文件上传九、表单提交十、Cookies十一、模块化视图十二、数据校验十三、自动化文档Swagger 风格ReDoc 风格 十四、CORS跨域 一、前言 本文主要对 FastAPI 与 Flask 框架…

cola架构:有限状态机(FSM)源码浅析及扩展

目录 0. cola状态机简述 1.cola状态机使用实例 2.cola状态机源码解析 2.1 语义模型接口源码 2.1.1 Condition和Action接口 2.1.2 State 2.1.3 Transition接口 2.1.4 StateMachine接口 2.2 Builder模式 2.2.1 StateMachine Builder模式 2.2.2 ExternalTransitionBuil…

Vue3-使用create-vue创建项目

认识create-vue create-vue是Vue官方新的脚手架工具&#xff0c;底层切换到了vite&#xff08;下一代构建工具&#xff09;&#xff0c;为开发提供极速响应。 使用create-vue创建项目 1.前提环境条件 已安装16.0或更高版本的Node.js node -v 2.创建一个Vue应用 npm init…

经典卷积神经网络 - GoogLeNet

GoogLeNet是google推出的基于Inception模块的深度神经网络模型&#xff0c;在2014年的ImageNet竞赛中夺得了冠军&#xff0c;在随后的两年中一直在改进&#xff0c;形成了Inception V2、Inception V3、Inception V4等版本。 Inception块 4个路径从不同层面抽取信息&#xff0…

轻松掌握这几种文件批量重命名方法

文件批量重命名一直是许多人在日常工作中经常遇到的问题。如何快速、准确地重命名文件&#xff0c;同时保证文件名的有序性和可读性&#xff0c;是一个值得探讨的问题。本文将介绍一种利用固乔文件管家软件批量重命名文件的方法&#xff0c;帮助您轻松解决这一难题。 固乔文件管…

解析外贸开发信的结构?营销邮件书写技巧?

做外贸的开发信结构是怎样的&#xff1f;写外贸邮件的注意事项&#xff1f; 外贸开发信是国际贸易中至关重要的一环&#xff0c;它不仅是与潜在客户建立联系的第一步&#xff0c;也是一种有效的市场推广工具。蜂邮EDM将深入解析外贸开发信的结构&#xff0c;帮助您更好地理解如…

基于springboot+vue实现地方美食分享网站项目【项目源码+论文说明】

基于springbootvue实现地方美食分享网站演示 摘要 首先&#xff0c;论文一开始便是清楚的论述了系统的研究内容。其次&#xff0c;剖析系统需求分析&#xff0c;弄明白“做什么”&#xff0c;分析包括业务分析和业务流程的分析以及用例分析&#xff0c;更进一步明确系统的需求…

VulnHub SICKOS: 1.1

一、信息收集 1.nmap扫描 IP&#xff1a;192.168.103.177 开放端口&#xff1a;22、3128、8080 这里可以看到3128端口是作为代理使用的&#xff0c;所以想访问80端口必须走3128端口代理 2.利用burp挂上游代理 然后直接开代理&#xff0c;访问80端口 3.扫描目录 因为3128端…

使用adobe font style 工具绘制的艺术字,请鉴赏。

Adobe Fireflyhttps://firefly.adobe.com/generate/font-styles