学习记录 -- Accurate and fast cell marker gene identification with COSG

news2025/1/31 18:11:15

文章目录

  • brief
  • 代码演示
      • 安装
      • 实操
  • 个人感受

brief

单细胞数据分析当中,细胞聚类分群完成之后,我们希望得知每一个细胞类群是什么细胞,也就是细胞类型注释。

通常情况下,我们可以找到细胞类群间表达量存在差异的基因,我们认为可以标识细胞类的marker 基因就在 DE之中 ,最好是只在这一个细胞类群中表达的DE,大概率就是marker。

当利用 top rank DE 作为 marker gene 对照现存的marker list或相关数据库来做我们自己的细胞类型注释,可能存在一些问题。比如一个细胞数目比较多的类群和一个细胞数目比较少的类群都表达XXX gene,XXX gene在统计学意义上是 细胞数目较多类群的DE,rank也会比较靠前。如果XXX gene是maker ,那对应的小类群细胞也应该是某种意义上的相同细胞,不过在统计学意义上XXX gene不是小类群的DE,更不会被识别为marker。

COSG的作者认为,如果细胞类群特异性表达的基因为marker,那么其他的marker gene应该存在类似的表达模式,同时目标细胞类群和其它细胞类群之间呈现出不同的表达模式。个人认为这里的表达模式可以简单理解为是共表达或者高度线性相关。


下面是COSG工具的内部工作历程以及其思想:
在这里插入图片描述
在这里插入图片描述
原理简述:

  • 第一步:基于现有的分群情况,COSG首先对每个细胞类群 Gk 鉴定出一个 artificial gene λk,这个基因的表达特征是:只在目标细胞类群中表达,且不在其它任何一个细胞类群中有表达。

  • 第二步:假设一共有k个细胞,那么每个基因的表达情况就是一个 k维的向量 gi(在每个细胞中的表达量作为一个维度,对于k维向量的大部分元素值为0,对于计算余弦值好像没多少影响)。

  • 第三步计算 gi 在目标细胞类群中与该目标类群artificial gene λk 的表达向量之间的夹角;再计算 gi 与 其它细胞类群的artificial gene λt 的表达向量之间的夹角。

  • 第四步:循环计算细胞类群 Gk 中的每个 gi 与 **λk**之间的余弦值,选取余弦值小的 gi 作为待选marker。

  • 第五步:在其他细胞类群中循环上述第三四步的过程。


代码演示

安装

# install.packages('remotes')
remotes::install_github(repo = 'genecell/COSGR')

实操

# 先利用 ifnb单细胞数据集走一道 seurat提供的分析流程

# split the dataset into a list of two seurat objects (stim and CTRL)
ifnb.list <- SplitObject(ifnb, split.by = "stim")

# normalize and identify variable features for each dataset independently
ifnb.list <- lapply(X = ifnb.list, FUN = function(x) {
  x <- NormalizeData(x)
  x <- FindVariableFeatures(x, selection.method = "vst", nfeatures = 2000)
})

# select features that are repeatedly variable across datasets for integration
features <- SelectIntegrationFeatures(object.list = ifnb.list)
immune.anchors <- FindIntegrationAnchors(object.list = ifnb.list, anchor.features = features)
immune.combined <- IntegrateData(anchorset = immune.anchors)

DefaultAssay(immune.combined) <- "integrated"

# Run the standard workflow for visualization and clustering
immune.combined <- ScaleData(immune.combined, verbose = FALSE)
immune.combined <- RunPCA(immune.combined, npcs = 30, verbose = FALSE)
immune.combined <- RunUMAP(immune.combined, reduction = "pca", dims = 1:30)
immune.combined <- FindNeighbors(immune.combined, reduction = "pca", dims = 1:30)
immune.combined <- FindClusters(immune.combined, resolution = 0.5)

# For performing differential expression after integration, we switch back to the original data
DefaultAssay(immune.combined) <- "RNA"

seurat_marker_to_all <- FindMarkers(immune.combined, ident.1 = 1, verbose = FALSE,only.pos = T)
head(seurat_marker_to_all[order(seurat_marker_to_all$avg_log2FC,decreasing = T),], n = 15)
seurat_marker_to_sub <- FindMarkers(immune.combined, ident.1 = 1, ident.2 = 2, verbose = FALSE,only.pos = T)
head(seurat_marker_to_sub[order(seurat_marker_to_sub$avg_log2FC,decreasing = T),], n = 15)

在这里插入图片描述
在这里插入图片描述

# 我们利用Seurat的聚类结果以及COSG工具试试看 marker gene的结果
library(COSG)
# Run COSG:
marker_cosg_all <- cosg(
  immune.combined,
  groups='all',
  assay='RNA',
  slot='data',
  mu=10,
  remove_lowly_expressed=TRUE,
  expressed_pct=0.25,
  n_genes_user=100)

marker_cosg_sub <- cosg(
  immune.combined,
  groups=c(1,2),
  assay='RNA',
  slot='data',
  mu=10,
  remove_lowly_expressed=TRUE,
  expressed_pct=0.25,
  n_genes_user=100)

head(cbind(marker_cosg_all$names[,2],marker_cosg_all$scores[,2]),n = 15)
head(cbind(marker_cosg_sub$names[,2],marker_cosg_sub$scores[,2]),n = 15)

在这里插入图片描述
在这里插入图片描述


个人感受

从上面的结果来看呢!!!

我们使用了seurat中FindMarkers函数,
结果1是 把gene from target cluster 与 gene from all others cells进行比较,
结果2 把gene from target cluster 与 gene from other subcluster 进行比较,
结果1和 结果2 相比很稳定。

使用COSG时,把group设置为all,表示gene from target cluster 与 gene from all others cells进行比较,结果与seurat的结果也蛮相似的。
但是当我把group 设置为c(1,2)时,类似于 gene from target cluster 与 gene from other subcluster 进行比较,得到的结果完全不一样了。
相同软件内部结果不一样,不同软件的结果更不一样了,所以这个COSG工具的group设置蛮重要的。
究其根本原因,笔者认为是 group变少了 所以那个 cluster unique gene 或者说是前文提到的 λk 选择变了,导致结果差异很大。

那为什么Seurat 中 gene from target cluster 与 gene from other subcluster 进行比较与 gene from target cluster 与 gene from all others cells进行比较的结果稳定呢?

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

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

相关文章

爆款视频生成器-视频批量剪辑系统源码开发分享

创建视频 该接口用于创建抖音视频&#xff08;支持话题, 小程序等功能&#xff09;。该接口适用于抖音。 使用限制 抖音的 OAuth API 以https://open.douyin.com/ 开头。挂载小程序请先完成注册开发者平台账号。创建抖音视频后, 会有一个审核过程, 期间只有自己可见。如果发…

【C/C++】带你快速掌握 使用—增强for(范围for循环)

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

Cefsharp-Winform114.2.100(5735)最新版本体验

版本说明: 官方仓库最新版本体验,114.2.100 (分支5735),支持MP3,WEBGL,不支持H264 视频体验H264参阅109版本(CSDN中搜索) Cefsharp109.1.110(winfrom)最新支持H264-MP3-MP4功能体验,导出pdf和下载方法有变调整_cef h264_久爱物联网的博客-CSDN博客 效果预览: 一…

LinuxC编程——高级文件操作

目录 一、查询文件信息1、stat2、stat fstat lstat区别 二、目录操作2.1 opendir2.2 readdir2.3 closedir例练习&#xff1a;实现ls操作 三、库3.1 库的定义3.2 库的分类3.2.1 静态库3.2.2 动态库 3.3 创建库3.3.1 静态库制作3.3.2 动态库制作 一、查询文件信息 1、stat int …

TLD7002学习笔记(二)-使用S32K144驱动TLD7002

文章目录 1. 前言2. 评估板简介3. 官方驱动3.1 官网驱动的介绍3.2 官方驱动的移植3.3 官方驱动的使用 4. 参考资料 1. 前言 本篇文章是TLD7002学习笔记的第二篇&#xff0c;主要是介绍如何使用S32K144驱动TLD7002-16ES。为此&#xff0c;笔者做了一套基于TLD7002-16ES的评估板…

重学Java的第一章

1.写在前面 今年的行情很差&#xff0c;差到很多人都没有办法找到工作&#xff0c;博主也是一个菜逼&#xff0c;找了一家小破公司&#xff0c;导致我那段时间很迷茫&#xff0c;也是也很焦虑&#xff0c;思考了很多&#xff0c;觉得我自己学的已经够多了&#xff0c;但是每一…

《Lua程序设计》--学习7

数据结构 数组 矩阵和多维数组 不规则数组&#xff1a;数组的数组&#xff0c;也就是所有元素均是另一个表的表 将两个索引合并为一个&#xff1a;声明一个长数组&#xff0c;然后根据 行数*行所拥有的元素个数列数来访问这样 链表 因为表是动态对象&#xff0c;所以在Lua语…

4.7 wait notify - 4.11 多把锁

目录 4.7 wait notify1、为什么需要wait2、原理之wait/notify3、API的介绍 4.8 wait notify 的正确姿势4.9 Park & Unpark4.10 重新理解线程状态转换4.11 多把锁 4.7 wait notify 1、为什么需要wait 当持有锁的线程因为某种条件不能满足不能执行时&#xff0c;由于其持有…

usb的传输类型

usb的传输类型 usb的四种传输类型: 批量传输同步传输(或等时传输)中断传输控制传输 其中的批量,同步,中断,三种传输中,每完整传输一次数据都称做一个事务(主要的数据传输是靠这三种传输) 事务的具体表现(批量,同步,中断) ​ 上图说说的输入事务是以主机来说的, 主机需要先发…

EMC学习笔记(三)滤波

滤波 1.概述2.滤波器件2.1 电阻2.2 电感2.3 电容2.4 铁氧体磁珠2.5 共模电感 3.滤波电路3.1 滤波电路的形式3.2 滤波电路的布局与布线 4.电容在PCB的EMC设计中的应用4.1 滤波电容的种类4.2 电容自谐振问题4.3 ESR对并联电容幅频特性的影响4.4 ESL对并联电容幅频特性的影响4.5 电…

JVM原理:JVM运行时内存模型(通俗易懂)

目录 前言正文虚拟机栈局部变量表操作数栈动态链接方法返回地址 本地方法栈本地方法存在的意义本地方法的调用 虚拟机堆堆结构Eden区Survivor区域老年代Old区常用参数指令 方法区常量池 运行时常量池方法信息类信息域信息JDK1.7前的方法区JDK1.7时的方法区JDK1.7后的方法区 程序…

Spring-2

DI 依赖注入 所谓依赖注入&#xff0c;是指程序运行过程中&#xff0c;如果需要调用另一个对象协助时&#xff0c;无须在代码中创建被调用者&#xff0c;而是依赖于外部的注入<bean id”” class”” p:属性名称-ref”另外受管 bean 的名称”/> IoC 实际上有 2 种实现 …

探索Python工具库合集:提高开发效率的秘密武器

前言&#x1f680;&#x1f680; 在开发过程中&#xff0c;笔者积累了许多实用的Python工具函数和模块&#xff0c;决定将它们整理成一个工具库集合&#xff0c;并与大家分享。本文将介绍笔者的Python工具库集合的核心功能和用途&#xff0c; 在日常的Python开发中&#xff0c;…

Selenium Python教程第6章:使用页面对象

6. Page Objects 页面对象 6.1 什么是页面对象模型(POM)&#xff1f; 页面对象模型(Page Objects Model, POM )是一组旨在表示一个或多个网页的类, 用1个类来保存1个网页上所有的元素&#xff0c;相似的网页可以重用此类。 1个网站通常有多个页面&#xff0c;可以用多个页面类…

(opencv)图像几何变换——缩放

图像缩放是指将图像的尺寸变小或变大的过程&#xff0c;也就是减少或增加源图像数据的像素个数。图像缩放一定程度上会造成信息的丢失&#xff0c;因此需要考虑适宜的方法进行操作。 下面介绍两种常用的图像缩放方法的原理及实现 1.基于等间隔提取图像缩放 等间隔提取图像缩…

多线程目录

基础概念篇 001线程状态图示_存在,及合理的博客-CSDN博客例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了学习机器学习&#xff0c;本文就介绍了机器学习的基础内容。提示&#xff1a;以下是本篇文章正文内容&…

机器学习 day16(前向传播算法,Tensorflow的实现代码)

1. 手写数字识别的神经网络模型 为简单起见&#xff0c;仅区分手写0和1&#xff0c;并用8*8的像素矩阵&#xff0c;共有64个像素&#xff08;特征&#xff09;&#xff0c;展开写成向量x&#xff0c;即该神经网络模型的输入特征向量x的维数为64&#xff0c;设该模型有两层隐藏…

一文打通:从字节码指令的角度解读前置后置自增自减(加加++减减--)

文章目录 1.前置了解的知识1.1 栈这种数据结构1.2 局部变量表和操作数栈1.3 三个字节码指令 2.单独使用后置与前置2.1 后置字节码指令2.2 前置字节码指令2.3 总结 3.需要返回值的情况下使用后置与前置3.1 后置字节码指令3.2 前置字节码指令3.3 总结3.4 练习&#x1f340; 练习一…

npm i安装依赖包报错proxy‘ config is set properly. See: ‘npm help config‘

npm i 报错proxy‘ config is set properly. See: ‘npm help config‘ 网上搜了解决方法&#xff1a; https://blog.csdn.net/zz00008888/article/details/127852233 但是执行完还是报错&#xff0c;查代理已经是false了 看到是cnpm镜像&#xff0c;于是用cnpm i 就运行成功…

设计模式篇---原型模式

文章目录 概念Java中的克隆方法实例使用场景 概念 定义&#xff1a;使用原型实例指定待创建对象的类型&#xff0c;并通过复制这个原型来创建新的对象。 原型模式主要有以下几部分组成&#xff1a; Prototype(抽象原型类):具体原型类的接口或者抽象类。 ConcretePrototype(具体…