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

大家好,今天我们分享的是单细胞的学习教程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 includedpfc2 <- 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 spacerm(pfc2.data, pfc3.data, pfc5.data, pfc7.data)# inspect the metadata for one of our objects using the 'head' functionhead(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 objectspfc <- merge(x = pfc2, y = list(pfc3, pfc5, pfc7))# remove individual objects to save processing spacerm(pfc2, pfc3, pfc5, pfc7)# inpect our new combined objectpfc# 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 preparationspfc[["percent.mt"]] <- PercentageFeatureSet(object = pfc, pattern = "^mt-")# percent.mt cutoffs typically range from 5-10% depending on the sampleVlnPlot(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 againVlnPlot(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 consolepfc <- 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=pfcDefaultAssay(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)#######################clusterAll <- 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.mzph.cn/news/197273.shtml

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

相关文章

Shell脚本介绍

Shell脚本是一种使用文本编辑器编写的简单脚本语言&#xff0c;它可以自动化常见的系统任务&#xff0c;例如执行命令、处理文件和文本数据等。Shell脚本通常使用Unix或Linux系统中的shell&#xff08;例如bash&#xff09;来解释执行。 Shell脚本的基本语法包括&#xff1a; …

scrapy的建模及管道的使用

一、数据建模 通常在做项目的过程中&#xff0c;在items.py中进行数据建模 为什么建模 定义item即提前规划好哪些字段需要抓&#xff0c;防止手误&#xff0c;因为定义好之后&#xff0c;在运行过程中&#xff0c;系统会自动检查&#xff0c;配合注释一起可以清晰的知道要抓…

【面试经典150 | 二叉树】二叉树的最大深度

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;递归方法二&#xff1a;迭代 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的…

MVSNeRF:多视图立体视觉的快速推广辐射场重建

MVSNeRF&#xff1a;多视图立体视觉的快速推广辐射场重建 摘要1 引言 摘要 在2021年&#xff0c;作者提出了MVSNeRF&#xff0c;一种新的神经渲染方法&#xff0c;在视图合成中可以有效地重建神经辐射场。与之前对神经辐射场的研究不同&#xff0c;我们考虑了对密集捕获的图像…

十分钟带你看懂——Python测试框架之pytest最全讲

pytest特短 pytest是一个非常成熟的全功能的Python测试框架&#xff0c;主要有以下几个特点&#xff1a; 简单灵活&#xff0c;容易上手 支持参数化 能够支持简单的单元测试和复杂的功能测试&#xff0c;还可以用来做selenium/appnium等自动化测试、接口自动化测试&#xff08…

如何能够对使用ShaderGraph开发的Shader使用SetTextureOffset和SetTextureScale方法

假设在ShaderGraph中的纹理的引用名称为"_BaseMap"&#xff0c;同时对这个"_BaseMap"纹理使用了采样的节点"SampleTexture2D"&#xff0c;然后该采样节点的uv接入的TilingAndOffset节点&#xff0c;此时的关键步骤是新建一个Vector4属性&#xf…

C++实现顺序栈的基本操作(扩展)

#include <stdio.h> typedef char ElemType; #define StackSize 100 /*顺序栈的初始分配空间*/ typedef struct { ElemType data[StackSize]; /*保存栈中元素*/int top; /*栈顶指针*/ } SqStack; void InitStack(SqStack &st) {st.top-1; } …

SSM整合(注解版)

SSM 整合是指将学习的 Spring&#xff0c;SpringMVC&#xff0c;MyBatis 进行整合&#xff0c;来进行项目的开发。 1 项目基本的配置类 1.1 Spring 配置类 这个配置类主要是管理 Service 中的 bean&#xff0c;controller 层的 bean 对象是 SpringMVC 管理的 package cn.ed…

案例研究|作为一家BI厂商,飞致云是如何人人使用DataEase的?

杭州飞致云信息科技有限公司&#xff08;以下简称为飞致云&#xff09;长期秉持“软件用起来才有价值&#xff0c;才有改进的机会”的核心价值观&#xff0c;以“为数字经济时代创造好软件”为使命&#xff0c;致力于成为中国数字化团队首选的通用工具软件提供商。在软件产品不…

编码器-解码器(seq-seq)

1. 背景 encoder-decoder和seq-seq模型可以解决输入与输出都是不定长序列的问题。它们都用到了两个循环NN&#xff0c;分别叫做编码器(用来分析输入序列)与解码器(用来生成输出序列)。 2. 编码器 把一个不定长的输入序列变换成一个定长的背景变量c&#xff0c;并在其中编码输入…

大文件分片上传、分片进度以及整体进度、断点续传【前端原生、后端 Koa、Node 原生】(一)

分片&#xff08;500MB&#xff09;进度效果展示 效果展示&#xff0c;一个分片是 500MB 的 分片&#xff08;10MB&#xff09;进度效果展示 大文件分片上传效果展示 前端 思路 前端的思路&#xff1a;将大文件切分成多个小文件&#xff0c;然后并发给后端。 页面构建 先在页…

数据结构学习笔记——广义表

目录 一、广义表的定义二、广义表的表头和表尾三、广义表的深度和长度四、广义表与二叉树&#xff08;一&#xff09;广义表表示二叉树&#xff08;二&#xff09;广义表表示二叉树的代码实现 一、广义表的定义 广义表是线性表的进一步推广&#xff0c;是由n&#xff08;n≥0&…

C++11(上)

统一的列表初始化 首先要说明&#xff1a; 这个列表初始化和类和对象那里的初始化列表不是一个概念. {} 初始化 在C98中, 标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定. 比如: C语言里面其实就是这样支持的, 所以可以认为C支持这样就是因为要兼容C. 在…

IDEA中也能用postman了?

Postman是大家最常用的API调试工具&#xff0c;那么有没有一种方法可以不用手动写入接口到Postman&#xff0c;即可进行接口调试操作&#xff1f;今天给大家推荐一款IDEA插件&#xff1a;Apipost Helper&#xff0c;写完代码就可以调试接口并一键生成接口文档&#xff01;而且还…

.Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)

机缘 不知不觉,.NET8都已经面世,而我们一直还停留在.netframework4.5开发阶段,最近准备抽空研究一下.Net6,一是为了提高技术积累,一方面想着通过这次的学习,看有没有可能将老的FX版本替换到.Net6开发上,经过查找官方资料,对.Net6支持的系统版本做一个分享,方便大家后期…

数据库事务

Innodb引擎支持以事务的方式执行SQL&#xff0c;事务包含ACID四个特性&#xff0c;分别是原子性、一致性、隔离性和持久化。 原子性 原子性是指开启事务后&#xff0c;使用commit提交事务或rollback回滚事务&#xff0c;使事务内的多条修改语句同时成功或失败。 原子性是通过…

图中点的层次(图的BFS)

给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环。 所有边的长度都是 1&#xff0c;点的编号为 1∼n。 请你求出 1 号点到 n 号点的最短距离&#xff0c;如果从 1 号点无法走到 n 号点&#xff0c;输出 −1。 输入格式 第一行包含两个整数 n 和 m。 接…

SQL Sever 基础知识 - 限制行数

SQL Sever 基础知识 - 三、限制行数 三、限制行数第1节 OFFSET FETCH - 限制查询返回的行数1.1 OFFSET 和 FETCH 子句1.2 SQL Server OFFSET 和 FETCH 示例 第2节 SELECT TOP - 限制查询结果集中返回的行数或行的百分比2.1 SELECT TOP 子句2.2 PERCENT2.3 WITH TIES2.4 SELECT …

React全站框架Next.js使用入门

Next.js是一个基于React的服务器端渲染框架&#xff0c;它可以帮助我们快速构建React应用程序&#xff0c;并具有以下优势&#xff1a; 1. 支持服务器端渲染&#xff0c;提高页面渲染速度和SEO&#xff1b; 2. 自带webpack开发环境&#xff0c;实现即插即用的特性&#xff1b;…

ROS报错:RLException:Invalid roslaunch XML Syntax: mismatched tag:

运行roslaunch文件提示&#xff1a; RLException:Invalid roslaunch XML Syntax: mismatched tag: line 45&#xff0c; column 2 The traceback for the exception was written to the log file. j 解决办法&#xff1a; line45 行多了标签&#xff1a;</node> 另外…