单细胞测序并不一定需要harmony去除批次效应

news2024/12/28 6:37:08

大家好,今天我们分享的是单细胞的学习教程https://www.singlecellworkshop.com/analysis-tutorial.html  教程的作者使用了四个样本,但是没有使用harmony或者其他方法去整合 去除批次效应。


主要内容:

  • SCTransform流程代码及结果

  • harmony流程代码及结果

  • seurat单样本标准流程代码及结果

  • 三种方法结果比较

是不是这四个样本就不需要去批次效应呢?接下来我们探索一下

1 首先是把教程的代码跑一遍

# load Seurat package 
library(Seurat)

dir.create("~/gzh/harmony_sct",recursive = TRUE)
setwd("~/gzh/harmony_sct/")
getwd()
list.files()


# 1 不去除批次效应,教程的步骤----
{
  pfc2.data <- Read10X(data.dir = "raw-data/pfc-sample2")
  pfc3.data <- Read10X(data.dir = "raw-data/pfc-sample3")
  pfc5.data <- Read10X(data.dir = "raw-data/pfc-sample5")
  pfc7.data <- Read10X(data.dir = "raw-data/pfc-sample7")
  
  # create a new Seurat object for each sample
  # min.cells = 3, only genes detected in at least 3 cells will be included
  # min.features = 200, only cells with at least 200 genes detected will be included
  
  pfc2 <- CreateSeuratObject(counts = pfc2.data, project = "pfc-demo", min.cells = 3, min.features = 200)
  pfc3 <- CreateSeuratObject(counts = pfc3.data, project = "pfc-demo", min.cells = 3, min.features = 200)
  pfc5 <- CreateSeuratObject(counts = pfc5.data, project = "pfc-demo", min.cells = 3, min.features = 200)
  pfc7 <- CreateSeuratObject(counts = pfc7.data, project = "pfc-demo", min.cells = 3, min.features = 200)
  
  pfc2
  
  # remove the raw data to save processing space
  rm(pfc2.data, pfc3.data, pfc5.data, pfc7.data)
  
  # inspect the metadata for one of our objects using the 'head' function
  head(pfc2@meta.data)
  
  
  pfc2@meta.data$sample_number <- "2" 
  pfc3@meta.data$sample_number <- "3" 
  pfc5@meta.data$sample_number <- "5" 
  pfc7@meta.data$sample_number <- "7" 
  
  # merge multiple Seurat objects
  pfc <- merge(x = pfc2, y = list(pfc3, pfc5, pfc7))
  
  
  # remove individual objects to save processing space
  rm(pfc2, pfc3, pfc5, pfc7)
  
  
  # inpect our new combined object
  pfc
  # an important metadata slot to add in every experiment is the ratio of mitochondrial genes
  # detected in each cell - this can be used as a proxy for cell quality in most preparations
  pfc[["percent.mt"]] <- PercentageFeatureSet(object = pfc, pattern = "^mt-")
  
  # percent.mt cutoffs typically range from 5-10% depending on the sample
  
  VlnPlot(pfc, features = c("percent.mt"), pt.size=0, y.max=15) 
  
  pfc <- subset(pfc, subset = percent.mt < 5)
  
  
  VlnPlot(pfc, features = c("nFeature_RNA"), pt.size=0, y.max=2000)
  
  pfc <- subset(pfc, subset = nFeature_RNA > 600)
  # inspect our QC metrics again
  VlnPlot(pfc, features = c("nFeature_RNA","nCount_RNA","percent.mt"), pt.size=0)
  
  
  # this may take several minutes to execute, and progress will display in the console
  pfc <- SCTransform(pfc)
  
  
  pfc <- RunPCA(pfc, npcs = 60)
  
  
  pfc <- FindNeighbors(pfc, dims = 1:60) 
  pfc <- FindClusters(pfc, resolution = 0.7)
  pfc <- RunUMAP(pfc, dims = 1:60)
  
  DimPlot(pfc, label=T)
  DimPlot(pfc, group.by="sample_number")
}

DefaultAssay(pfc)
Assays(pfc)

图片

图片

我们可以看到就算不去批次效应,结果也挺好的

02

2 然后使用harmony去除批次效应 看看效果


subset_data=pfc

DefaultAssay(subset_data)='RNA'

{
library(dplyr)


DimPlot(subset_data)


subset_data[["percent.mt"]] <- PercentageFeatureSet(subset_data, pattern = "^mt-")
VlnPlot(subset_data, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)


subset_data = subset_data %>%
  Seurat::NormalizeData(verbose = FALSE) %>%  
  FindVariableFeatures(selection.method = "vst", nfeatures = 2000) %>%
  ScaleData(verbose = FALSE) %>%
  RunPCA(npcs = 30, verbose = FALSE)
ElbowPlot(subset_data, ndims = 30)
VlnPlot(subset_data, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)

head(subset_data@meta.data)
library(stringr)
table(str_split(colnames(subset_data),pattern = "_",simplify = TRUE)[,2])
subset_data@meta.data$stim <-paste0('mice',str_split(colnames(subset_data),pattern = "_",simplify = TRUE)[,2])
#table(subset_data$stim)

library('harmony')

subset_data <- subset_data %>% RunHarmony("stim", plot_convergence = TRUE)
harmony_embeddings <- Embeddings(subset_data, 'harmony') 
#######################cluster
dims = 1:30
subset_data <- subset_data %>% 
  RunUMAP(reduction = "harmony", dims = dims) %>% 
  RunTSNE(reduction = "harmony", dims = dims) %>% 
  FindNeighbors(reduction = "harmony", dims = dims)

subset_data=FindClusters(subset_data,resolution =0.7)
DimPlot(subset_data,group)
head(subset_data@meta.data)
  head(pfc@meta.data)
  
  
}

同样的分辨率下对比两次的结果

图片

图片

我们发现hamony之后多了两个亚群,但是样本总体分布好像影响并不大。所以我们看下harmony前后,每个亚群中的细胞数量变化

图片

总体看上去,harmony前后对大多数亚群影响并不大,且harmony前后有很多亚群多是可以互相重合的。(个人觉得之所以教程作者不去除批次效应是因为他所选的四个样本都是control组)

图片

如果想更详细的比较harmony前后的变化,我们可以从细胞命名、差异分析、拟时序分析等等结果来看啦~

那为什么作者只是使用了SCTtransform这个函数就可以?达到这么好的效果,是不是SCTtransform可以去除批次效应?——当然不是,不信你去看官网~

图片

3 .不死心的话,我们不使用SCTtransform,也不去除批次效应,只使用seurat标准流程试试

3#3 标准流程-----
head(subset_data@meta.data)
All=CreateSeuratObject(counts = subset_data@assays$RNA@counts,meta.data = subset_data@meta.data)

{
  
  VlnPlot(All, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)
  All = All%>%Seurat::NormalizeData(verbose = FALSE) %>%  
    FindVariableFeatures(selection.method = "vst"    ) %>%
    ScaleData(verbose = FALSE)
  All = RunPCA(All, npcs = 30, verbose = FALSE)
  ElbowPlot(All, ndims = 30)
  
  
  
#######################cluster
  All <- All %>% 
    RunUMAP(reduction = "pca", dims = 1:30) %>% 
    RunTSNE(reduction = "pca", dims = 1:30) %>% 
    FindNeighbors(reduction = "pca", dims = 1:30)
  All<-All%>% FindClusters(resolution = 0.7) %>% identity()
  
  DimPlot(All,group.by ='stim' )+ggtitle("standard_pipeline")
  
}
head(All@meta.data)

图片

结果看上去也还可以吧


我们对比一下三种方法:

图片

肉眼看不出来有多大区别吧

图片

有意思的是sctransform和标准流程都能得到17个亚群

图片

所以大家觉得我们需要harmnoy去除批次效应吗?

4 结论: 虽然不去批次效应也能拿到很好的结果,个人还是建议使用harmony,你觉得呢?

尽管在某些情况下即使不去除批次效应也能得到看似合理的结果,但这可能是偶然的,并且存在风险。批次效应可能掩盖或模拟出实际的生物信号,导致错误的生物学结论。因此,建议使用诸如Harmony这样的算法来校正批次效应,以提高数据分析的可靠性和准确性。

Harmony是一种用于多组数据整合的算法,它可以在保留生物学变异的同时,减少技术变异,特别是批次效应。通过对数据进行校正,Harmony可以帮助研究者更好地识别真实的生物学差异,而不是由实验条件引起的差异。

如果想更详细的比较harmony前后的变化,我们可以从细胞命名、差异分析、拟时序分析等等结果来看啦~如果大家对这个话题感兴趣我们可以开个直播聊聊~

微信公众号:生信小博士

感谢Jimmy老师的分享,此次推文的灵感来自Jimmy老师

猜你可能感兴趣:seurat个性化细胞注释并把细分亚群放回总群

图片

图片

看完记得顺手点个“在看”哦!

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

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

相关文章

第一节JavaScript 简介与使用

JavaScript简介 JavaScript是互联网上最流行的脚本语言&#xff0c;这门语言可用于HTML和Web&#xff0c;更广泛用于服务器、PC、电脑、智能手机等设备上。 JavaScript是一种轻量级的编程语言。 JavaScript是可插入HTML页面的编程代码。 JavaScript插入HTML页面后&#xff…

【模电】基本共射放大电路的工作原理及波形分析

基本共射放大电路的工作原理及波形分析 在上图所示的基本放大电路中&#xff0c;静态时的 I B Q I\tiny BQ IBQ、 I C Q I\tiny CQ ICQ、 U C E Q U\tiny CEQ UCEQ如下图( b )、( c )中虚线所标注。 &#xff08; a &#xff09; u i 的波形&#xff08; b &#xff09; i B …

SRE-架构框架-可靠性

Google-架构框架-可靠性 可靠性概览 Google Cloud 架构框架中的此类别介绍如何在云平台上构建和运营可靠的服务。此外&#xff0c;您还将了解一些支持可靠性的 Google Cloud 产品和功能。 该架构框架介绍了最佳实践&#xff0c;提供了实现建议&#xff0c;并说明了一些可用的…

深入理解:指针变量的解引用 与 加法运算

前言 指针变量的解引用和加法运算是非常高频的考点&#xff0c;也是难点&#xff0c;因为对初学者的不友好&#xff0c;这就导致了各大考试都很喜欢在这里出题&#xff0c;通常会伴随着强制类型转换、二维数组、数组指针等一起考查大家对指针的理解。但是不要怕&#xff0c;也许…

希宝猫罐头怎么样?专业人士告诉你质量好的猫罐头推荐

作为当了6年铲屎官的我来说&#xff0c;对猫咪的日常饮食来源还是蛮有学问的&#xff0c;我也是给我家的猫咪买过比较多的罐头了。怎么喂养猫罐头还是有技巧的。那么希宝猫罐头好不好呢&#xff1f; 希宝猫罐头&#xff0c;工艺精湛&#xff0c;追求卓越。它的包装考究&#x…

华为OD机试 - 仿LISP运算 - 逻辑分析(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

vue自定义指令:指定文字高亮

vue自定义指令&#xff1a;指定文字高亮 自定义指令 除了核心功能默认内置的指令 (v-model 和 v-show)&#xff0c;Vue 也允许注册自定义指令。注意&#xff0c;在 Vue2.0 中&#xff0c;代码复用和抽象的主要形式是组件。然而&#xff0c;有的情况下&#xff0c;你仍然需要对…

golang之net/http模块学习

文章目录 开启服务开启访问静态文件获取现在时间按时间创建一个空的json文件按时间创建一个固定值的json文件 跨域请求处理输出是json 开启服务 package mainimport ("fmt""net/http" )//路由 func handler(w http.ResponseWriter, r *http.Request){fmt.…

【Windows下】Eclipse 尝试 Mapreduce 编程

文章目录 配置环境环境准备连接 Hadoop查看 hadoop 文件 导入 Hadoop 包创建 MapReduce 项目测试 Mapreduce 编程代码注意事项常见报错 配置环境 环境准备 本次实验使用的 Hadoop 为 2.7.7 版本&#xff0c;实验可能会用到的文件 百度网盘链接&#xff1a;https://pan.baidu…

LoadBalancer将服务暴露到外部实现负载均衡Openelb-layer2模式配置介绍

目录 一.openelb简介 二.主要介绍layer2模式 1.简介 2.原理 3.部署 &#xff08;1&#xff09;先在集群master上开启kube-proxy的strictARP &#xff08;2&#xff09;应用下载openelb.yaml&#xff08;需要修改镜像地址&#xff09; &#xff08;3&#xff09;编写yam…

swagger 简介

开发文档链接&#xff08;里面有各种参数的介绍&#xff09; OpenAPI Specification - Version 3.0.3 | Swagger 在线编辑&#xff08;直接在线编辑到它不报错不然空格之类的容易错&#xff0c;他有一个离线的版本但是那个东西不知道为啥我跑不起来报一个swagger-router找不到…

接口压测指南

接口压测指南 一、 为什么需要进行接口压测二 、接口压测的目标是什么三、 用什么工具进行接口压测四、 接口压测核心指标4.1 JMeter的报告模板4.2 ApiPost报告模板 五、 接口慢如何排查5.1 大体排查思路5.2 排查工具5.3 压测经验 一、 为什么需要进行接口压测 突然有一天领导…

【Spring Boot】如何集成mybatis-plus

在pom文件中导入maven坐标 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version></dependency><!--mybatis-plus--><dependency><groupId>com.ba…

卷积神经网络(CNN):艺术作品识别

文章目录 一、前言一、设置GPU二、导入数据1. 导入数据2. 检查数据3. 配置数据集4. 数据可视化 三、构建模型四、编译五、训练模型六、评估模型1. Accuracy与Loss图2. 混淆矩阵3. 各项指标评估 一、前言 我的环境&#xff1a; 语言环境&#xff1a;Python3.6.5编译器&#xf…

python获取指定用户csdn博客列表并查询质量分,将结果保存到excel

API接口 获取博文总数接口 usernamehougang&#xff0c;表示获取用户hougang的所有博文数量 https://blog.csdn.net/community/home-api/v1/get-tab-total?usernamehougang 获取博文列表接口 https://blog.csdn.net/community/home-api/v1/get-business-list 质量分接口…

在文本框中添加单位

<el-col :span"12"><el-form-item label"进度" prop"schedule":rules"[{required: true, message:进度不能为空, trigger:blur},{validator: validator.isFloatGteZero, trigger:blur}]"><el-input v-model"input…

2024搞钱方式,这些你都了解吗?

气温日渐降低&#xff0c;凛冬已至&#xff0c;年关将近&#xff0c;咱还得多多搞钱才能喜气洋洋过大年不是&#xff1f;拿满全勤搞绩效&#xff0c;累死累活KPI……为了生活咱也是付出了太多。可是咱程序员该咋办呢&#xff1f; 相信有机智的小伙伴已经脱口而出了&#xff1a…

分布式搜索引擎elasticsearch(二)

1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据,一般测试用。例如:match_all 全文检索(full text)查…

从0开始使用Maven

文章目录 一.Maven的介绍即相关概念1.为什么使用Maven/Maven的作用2.Maven的坐标 二.Maven的安装三.IDEA编译器配置Maven环境1.在IDEA的单个工程中配置Maven环境2.方式2&#xff1a;配置Maven全局参数 四.IDEA编译器创建Maven项目五.IDEA中的Maven项目结构六.IDEA编译器导入Mav…

关于rocketMQ踩坑的那些事

在最近&#xff0c;我所写的这个项目需要使用到rocketMQ&#xff0c;为了图方便我便使用的是Windows版本的&#xff0c;但是在使用的过程中首先是发现无法发送消息出去&#xff0c;报错信息为 org.apache.rocketmq.client.exception.MQClientException: Send [3] times, still …