利用Seurat包Transfer数据集(FindTransferAnchors和TransferData)2022-6-09

关键词

  • FindTransferAnchors函数
  • TransferData函数
  • 细胞类型注释
  • 映射数据集/Transfer 数据集

适用背景

细胞注释的标准一直备受争议,就目前来说仍没有一种统一的工具能实现让大多数人都信服的自动注释工具,主要还是靠人工根据不同细胞类型的经典marker基因来定义特定细胞类型。当然,这些软件注释出来的结果也可以当做一种辅助参考,可以同时结合软件和经验来更好注释细胞类型。
而Seurat作为一个专业的单细胞数据分析工具包,也推出了类似细胞类型注释的流程。与大多数细胞注释工具类似,其原理也是基于参考数据集的注释结果,通过找到待查数据集与参考数据集的锚点,然后给待查数据集的每一个细胞打上预测的细胞类型标签,然后可以根据最终结果进行人工校正。如果根据一下比较经典的marker基因也无法确定具体的细胞类型,则可以考虑通过transfer来进行鉴定。另外空间组数据与单细胞数据也可以直接通过transfer进行映射。

主函数

因为主函数有用到我用的比较多的调色板cor和快速可视化聚类的函数dimplot_2groups,需要先运行以下代码:

library(Seurat)
library(dplyr)
library(RColorBrewer)
cor<-c(brewer.pal(8, "Dark2"),brewer.pal(12, "Paired"),brewer.pal(8, "Set2"),brewer.pal(9, "Set1"))
dimplot_2groups <- function(obj,
                            group1="seurat_clusters", group2="orig.ident",
                            split.by=NULL,
                            wid=1800,hei=1000,
                            raster=NULL) {
if (is.null(raster)) {
png(paste0(group1,"_",group2,".png"),width = 1800, height = 1000)
print(DimPlot(obj, reduction = "umap", label = T, label.size = 5,repel =T)+scale_color_manual(values=cor) -
                   (DimPlot(obj, reduction = "umap", label = T, group.by = group2, label.size = 5,repel =T)+scale_color_manual(values=cor)))
dev.off()

if (!is.null(split.by)) {
png(paste0(split.by, "_split.png"),width = wid, height = hei)
print(DimPlot(obj, reduction = "umap", label = T, split.by = split.by, label.size = 5,repel =T)+scale_color_manual(values=cor))
dev.off()

}
}else{
png(paste0(group1,"_",group2,".png"),width = 1800, height = 1000)
print(DimPlot(obj, reduction = "umap", label = T, label.size = 5,repel =T,raster=FALSE)+scale_color_manual(values=cor) -
                   (DimPlot(obj, reduction = "umap", label = T, group.by = group2, label.size = 5,repel =T,raster=FALSE)+scale_color_manual(values=cor)))
dev.off()

if (!is.null(split.by)) {
png(paste0(split.by, "_split.png"),width = wid, height = hei)
print(DimPlot(obj, reduction = "umap", label = T, split.by = split.by, label.size = 5,repel =T,raster=FALSE)+scale_color_manual(values=cor))
dev.off()
}
}
}

我把流程封装在一个函数transfer_cell里,主要用到两个Seurat的函数FindTransferAnchorsTransferData,然后进行可视化。以下是参数介绍:

  • ref 参考数据集,Seurat对象
  • que 询问数据集,Seurat对象
  • assay1 参考数据集的assay,默认为RNA
  • assay2 询问数据集的assay,默认为RNA
  • sct 是否对数据集进行SCTransform处理,默认为NULL,不作处理
  • group1参考数据集进行映射的分组列名,默认为seurat_clusters
  • group2参考数据集进行可视化的分组列名,默认为seurat_clusters,可不指定
  • features FindTransferAnchors函数使用的基因集,默认为NULL,使用所有基因
  • nor 是否对数据集使用NormalizeData,默认为NULL,会进行标准化处理
  • nor_method 如果既没有SCTransform处理也没有NormalizeData,则需指定标准化方法,默认为LogNormalize
transfer_cell <- function(ref,que,assay1="RNA",assay2="RNA",sct=NULL,
                         group1="seurat_clusters",group2="seurat_clusters",
                         features=NULL, nor=NULL, nor_method= "LogNormalize"){
DefaultAssay(que) <- assay1
DefaultAssay(ref) <- assay2
#首先确保两者的基因名和总基因数一致,如果是跨物种则需要进行同源基因转换
c1 <- which(rownames(ref) %in% rownames(que))
ref <- subset(ref,features=rownames(ref)[c1])
c1 <- which(rownames(que) %in% rownames(ref))
que <- subset(que,features=rownames(que)[c1])
group1 <- group1
group2 <- group2
#查看参考数据集的细胞分组情况
ref$celltype.l1 <- ref[[group1]]
ref$celltype.l2 <- ref[[group2]]
p1 <- DimPlot(object = ref, reduction = "umap", group.by = "celltype.l2", label = TRUE, label.size = 3, repel = TRUE) + NoLegend() + ggtitle(group2)
+scale_color_manual(values=cor)
p2 <- DimPlot(object = ref, reduction = "umap", group.by = "celltype.l1", label = TRUE, label.size = 3, repel = TRUE) + NoLegend() + ggtitle(group1)
+scale_color_manual(values=cor)
p1 <- p1 - p2
pf <- paste0(group1,"_",group2,'_ref_umap.jpg')
jpeg(pf,1800,1000)
print(p1)
dev.off()
#对数据集进行标准化,建议提前做好标准化,因为这一步十分消耗时间和内存,容易报错
if (is.null(nor)) {
if (!is.null(sct)) {
que <- SCTransform(que, verbose = FALSE, vars.to.regress = "percent.mt")
ref <- SCTransform(ref, verbose = FALSE, vars.to.regress = "percent.mt")
nor_method <- "SCT"
}else{
que <- NormalizeData(que, normalization.method = "LogNormalize", scale.factor = 10000)
ref <- NormalizeData(ref, normalization.method = "LogNormalize", scale.factor = 10000)
nor_method <- "LogNormalize"
}
saveRDS(que,"query_nor.rds")
saveRDS(ref,"ref_nor.rds")
}else{
nor_method <- nor_method
}
#如果指定了基因集,则使用指定的基因集进行映射
if (is.null(features)) {
features <- rownames(que)
}
#以下进行映射的常规流程
anchors <- FindTransferAnchors(
  reference = ref,
  query = que,
  features = features,
  normalization.method = nor_method,
  #normalization.method = "SCT",
  #reference.reduction = "pca",
  #reference.reduction = "spca",
  dims = 1:30
)
#给询问数据集加上映射信息
predictions.assay <- TransferData(anchorset = anchors, refdata = ref@meta.data[,group1], prediction.assay = TRUE,
    weight.reduction = que[["pca"]], dims = 1:30)
que[["predictions"]] <- predictions.assay
DefaultAssay(que) <- "predictions"
#保存映射信息
predictions <- TransferData(anchorset = anchors, refdata = ref@meta.data[,group1], prediction.assay = FALSE,
    weight.reduction = que[["pca"]], dims = 1:30)
predic_mtrx <- as.data.frame(predictions)
write.table(predic_mtrx,"predic_mtrx.tsv",sep = '\t',row.names = T,col.names = T,quote = F)
#可视化映射结果1
gene <- unique(ref@meta.data[,group1])
png(paste0(group1,"_transfer.png"),width = 2100, height = 1500)
p1 <- FeaturePlot(que,features = gene,ncol=3)
print(p1)
dev.off()
#可视化映射结果2
que$predict_Celltype <- predic_mtrx$predicted.id
dimplot_2groups(que,group2="predict_Celltype")
#返回存有映射结果的Seurat对象
return(que)
}

使用示例

没有特殊要求的话,可以直接传入三个参数即可
ob1 <- transfer_cell(ref=ob1,que=ob2,group1="Celltype")
saveRDS(ob1,"final_result.rds")
参考数据集可视化图

ref

可视化结果1(有点类似于FeaturePlot)
结果1

可视化结果2
结果2

此外,还有一个predic_mtrx.tsv文件和final_result.rds文件。predic_mtrx.tsv文件第二列为预测的细胞类型,其它列存了预测分数;final_result.rds是包含预测信息的询问数据集Seurat对象,预测信息在predict_Celltype列。

小结与补充

根据实践结果来看,Seurat的映射结果还是比较可靠的,也可以根据结果进行人工修正。一般,我们会去掉线粒体基因进行映射,另外参考数据集如果太大,可以取子集,不然好很耗内存,而且运行很慢

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容