在我之前的帖子单细胞分析实录(7): 差异表达分析/细胞类型注释里面,我已经介绍了如何使用SingleR给单细胞数据做注释,当时只讲了SingleR配套的参考集。这次就讲讲如何使用自己定义/找到的基因集做注释,使用场景还是比较多的,比如想根据某篇论文里面的注释结果,给自己的数据做注释。本文配套的视频讲解已上传到B站,新手UP: TOP菌。gongzhong号后台回复20211023可获取本文所用到的示例数据和代码。

本次演示用到的数据集来自2020年发表在Nature Genetics的一篇结直肠癌研究。文中用到了韩国患者(SMC)和比利时患者(KUL3)两套数据集,两套数据平行分析,相互印证。

我以里面的髓系细胞为例,用KUL3数据集中的髓系细胞为参考,来注释SMC里面的髓系细胞

两套数据集中髓系细胞部分的数据,已经跑完Seurat标准流程并整理成rds文件:SMC_mye.rdsKUL3_mye.rds。代码存放在0.R中,这里就不展示了,很简单。代码中fread()用于快速读取4G矩阵文件是可以学习的地方。

mat=fread("GSE132465_GEO_processed_CRC_10X_raw_UMI_count_matrix.txt",select = c("Index",SMC.mye.anno$Index))

之后就是创建参考集,被存储为SummarizedExperiment对象

library(Seurat)
library(tidyverse)
library(SummarizedExperiment)
library(scuttle) KUL3_mye=readRDS("KUL3_mye.rds")

属性数据框中主要用到cell index和cell annotation这两个信息,此外还需导入表达矩阵

KUL3_mye_count=KUL3_mye[["RNA"]]@counts

pdata=KUL3_mye@meta.data[,c("Index","Cell_subtype")]
rownames(pdata)=pdata$Index
pdata$Index=NULL
colnames(pdata)="ref_label" KUL3_mye_SE <- SummarizedExperiment(assays=list(counts=KUL3_mye_count),colData = pdata)
#创建SummarizedExperiment对象

KUL3_mye_SE <- logNormCounts(KUL3_mye_SE)
#Compute log-transformed normalized expression values,要有这一行,对于单细胞数据normalize之后会再算一个log
saveRDS(KUL3_mye_SE,"KUL3_mye_SE.ref.rds")

log normalize之后就多了一个logcounts的assay,singleR的官网示例都是基于logcounts这种数据

将这个参考对象保存为rds文件,方便以后多次调用

现在导入我们的待注释数据集和参考数据集

library(tidyverse)
library(Seurat)
library(SingleR)
library(scuttle)
library(SummarizedExperiment) KUL3_mye_SE=readRDS("KUL3_mye_SE.ref.rds")
SMC_mye=readRDS("SMC_mye.rds")
SMC_mye_count=SMC_mye[["RNA"]]@counts #需要取不同数据集的基因交集
common_gene <- intersect(rownames(SMC_mye_count), rownames(KUL3_mye_SE))
KUL3_mye_SE <- KUL3_mye_SE[common_gene,]
SMC_mye_count <- SMC_mye_count[common_gene,] #也要创建SummarizedExperiment对象,以及log normalize
SMC_mye_SE <- SummarizedExperiment(assays=list(counts=SMC_mye_count))
SMC_mye_SE <- logNormCounts(SMC_mye_SE) #注释代码
singleR_res <- SingleR(test = SMC_mye_SE, ref = KUL3_mye_SE, labels = KUL3_mye_SE$ref_label)
#导出注释结果
anno_df <- as.data.frame(singleR_res$labels)
anno_df$Index <- rownames(singleR_res)
colnames(anno_df)[1] <- 'ref_label_from_KUL3' #将注释信息添加到Seurat对象
SMC_mye@meta.data=SMC_mye@meta.data%>%inner_join(anno_df,by="Index")
rownames(SMC_mye@meta.data)=SMC_mye@meta.data$Index
DimPlot(SMC_mye, reduction = "tsne", group.by = "Cell_subtype", pt.size=2)+
DimPlot(SMC_mye, reduction = "tsne", group.by = "ref_label_from_KUL3", pt.size=2)

左图是原文给的注释,右图是依据KUL3来注释SMC数据集,可以看出还是有一些不一致的。

像这种依据某个参考集来做注释,对参考集质量要求很高,原文KUL3只有两千髓系细胞,考虑到10X单细胞数据的稀疏性,这个数量是不够的。也可能是软件的限制,在做小类注释时,类与类之间的表达特征其实是比较相似的,软件不一定能精确给出合适的label,相比之下,软件做大类注释一般比较准。

因水平有限,有错误的地方,欢迎批评指正!

SingleR如何使用自定义的参考集的更多相关文章

  1. Android 自定义View合集

    自定义控件学习 https://github.com/GcsSloop/AndroidNote/tree/master/CustomView 小良自定义控件合集 https://github.com/ ...

  2. MyBatis 多表联合查询及优化 以及自定义返回结果集

    下面就来说一下 mybatis 是通过什么来实现多表联合查询的.首先看一下表关系,如图: 这 里,我已经搭好了开发的环境,用到的是 SpringMVC + Spring + MyBatis,当然,为了 ...

  3. VB6文件操作自定义函数合集之一

    '--与文件及文件夹操作相关的函数 '--必须引用FSO的ACTIVE OBJECT Dim strList As String '--列表串,返回文件列表 '================ '-- ...

  4. Sublime Text3学习参考集

    1.如何优雅地使用Sublime Text: http://jeffjade.com/2015/12/15/2015-04-17-toss-sublime-text/#three 持续更新中..... ...

  5. Struts学习之自定义结果集

    转自:http://blog.csdn.net/hanxuemin12345/article/details/38763057 项目中我们经常遇到这样的需求——页面部分刷新,例如:添加用户,转到添加用 ...

  6. 制作ACK集群自定义节点镜像的正确姿势

    随着云原生时代的到来,用户应用.业务上云的需求也越来越多,不同的业务场景对容器平台的需求也不尽相同,其中一个非常重要的需求就是使用自定义镜像创建ACK集群. ACK支持用户使用自定义镜像创建Kuber ...

  7. Linq to Sql:N层应用中的查询(上) : 返回自定义实体

    原文:Linq to Sql:N层应用中的查询(上) : 返回自定义实体 如果允许在UI层直接访问Linq to Sql的DataContext,可以省去很多问题,譬如在处理多表join的时候,我们使 ...

  8. mongodb副本集原理及部署记录

    工作原理 1.副本集之间的复制是通过oplog日志现实的.备份节点通过查询这个集合就可以知道需要进行复制的操作 2.oplog是节点中local库中的一个固定的集合,在默认情况下oplog初始化大小为 ...

  9. CentOS7.5搭建ELK6.2.4集群及插件安装

    一 简介 Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎.它允许您快速,近实时地存储,搜索和分析大量数据.它通常用作支持具有复杂搜索功能和需求的应用程序的底层引擎/技术. 下载地址 ...

随机推荐

  1. 洛谷P2424 约数和 题解

    题目 约数和 题解 此题可以说完全就是一道数学题,不难看出这道题所求的是 \(\sum\limits_{i=x}^{y}{\sum\limits_{d|i}{d}}\) 的值. 很显然,用暴力枚举肯定 ...

  2. Python网编之简单的聊天小程序

    服务端: import socket sock = socket.socket() sock.bind(("127.0.0.1",8899)) sock.listen(5) whi ...

  3. Docker(34)- 如何修改 docker 容器的目录映射

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 问题背景 docker run ...

  4. squid缓存代理

    目录: 一.Squid 代理服务器 二.Squid 代理安装 三.搭建传统代理 四.搭建透明代理 五.ACL访问控制 六.Squid日志分析 七.反向代理 一.Squid 代理服务器Squid 主要提 ...

  5. golang sync.noCopy 类型 —— 初探 copylocks 与 empty struct

    问题引入 学习golang(v1.16)的 WaitGroup 代码时,看到了一处奇怪的用法,见下方类型定义: type WaitGroup struct { noCopy noCopy ... } ...

  6. BF算法(串模式匹配算法)

    主串和子串 主串与子串:如果串 A(如 "shujujiegou")中包含有串 B(如 "ju"),则称串 A 为主串,串 B 为子串.主串与子串之间的关系可简 ...

  7. DP之背包经典三例

    0/1背包 HDU2602 01背包(ZeroOnePack): 有N件物品和一个容量为V的背包,每种物品均只有一件.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大 ...

  8. 10.6Java学习

    1.类,对象,方法的定义.2.标识符分为两类:关键字/常见的基本类型:boolean(布尔型),byte(字节型),char(字符型),double(双精度),float(浮点),int(整型),lo ...

  9. Android学习记录(三)——安装SQLite

    这次学习安装SQLite. 一.SQLite简介 重要特性:零配置,即不需要复杂的配置即可使用 详细:https://www.runoob.com/sqlite/sqlite-intro.html 二 ...

  10. dedecms编辑器不能复制word格式的处理方法

    在word文档中编辑一篇文章,格式段落都整理好后,粘贴到dede编辑器里面却发现,格式都无效了,可能dede有自己的打算,比如这样可以文章字体大小统一,样色统一,整体比较整洁.但是用惯了word编辑文 ...