CHETAH-a selective, hierarchical cell type identification method for single-cell RNA sequencing

最近真的是懒得要死,很多东西真的是做了没有及时整理出来,像这篇文献已经读过了,方法也去尝试过了,但是就是没有整理出来,正所谓好记性不如烂笔头。因为自己一直在分析单细胞测序的数据,总是画了聚类图后,想着怎么鉴定出细胞类型来,然后刚好读到这篇文献,讲了用CHETAH,基于已发表的文献的鉴定出来的细胞类型来鉴定,这种感觉就像是以前用已知数据来训练未知数据一样,我感觉随着单细胞测序数据越来越多,这种鉴定方法将成为一种趋势,以后应该会用更好的算法来实现,我想想自己就是个菜鸟哈哈哈,能用能看懂就很开心呢了。

一、文章总体思路

文章总体思路

文章的思路:
A:利用已知的数据,构建一棵分类树。比如一套数据中有四种细胞类型 RP1 RP2 RP3 RP4,文章首先是计算这四种细胞类型的平均值,然后算着四种类型细胞的相关性,然后进行层次聚类,构建出分类树。
B: 拿到一个cell j,比如假定说属于RP1 类,那么久计算这个细胞和RP1的相关性,也要计算cell j与除RP1 以外的 【RP3 RP4】(将这两个当作一个整体)的相关性,为什么不计算RP2呢,因为我是这么想的,RP2 和RP1属于都一个根下,所以都加进去计算会不太好吧,具体原理不是很清楚。这里计算完之后,因为这个算法是对每个细胞选定前200个差异基因(RP1 对RP3 RP4的差异基因,文章说效果比较好)来计算相关性,因此每个细胞的200个基因是不一样,所以作者这边就计算RP1 【RP3 RP4】的理论分布,然后把相关性转化为落在理论分布的profile score,之后还计算了像p值一样的confidence score。
C:就是对每个细胞做上述过程,然后得到cell type.

细胞类型的鉴定过程取决于你所选的reference data的可靠性咯。


与其他方法的比较

作者还比较这个算法与其他方法的结果,与之前的SingleR的结果不相上下,但是SingleR是用bulk RNA数据。

二、代码实现

1. 网址

vignette("CHETAH_introduction")
整体介绍

2. 输入输出

1)输入

If you have your data stored as SingleCellExperiments, continue to the next step. Otherwise, you need the following data before you begin:

    1. 输入你要分析的单细胞数据矩阵【 input scRNA-seq count data of the cells to be classified a data.frame or matrix, with cells in the columns and genes in the rows】
    1. 标准化后的参考的单细胞数据矩阵(!) 【normalized scRNA-seq count data of reference cells in similar format as the input】
    1. 参考的单细胞数据的细胞类型【the cell types of the reference cells
      a named character vector (names corresponding to the colnames of the reference counts)】
    1. 可选用来可视化的要分析的单细胞数据的2维的TSNE PCA数值【(optional) a 2D reduced dimensional representation of your input data for visualization: e.g. t-SNE1, PCA,a two-column matrix/data.frame, with the cells in the rows and the two dimensions in the columns】

2)输出

CHETAH constructs a classification tree by hierarchically clustering the reference data. The classification is guided by this tree. In each node of the tree, input cells are either assigned to the right, or the left branch. A confidence score is calculated for each of these assignments. When the confidence score for an assignment is lower than the threshold (default = 0.1), the classification for that cell stops in that node.

This results in two types of classifications:

  • 1.最终的细胞类型【 final types: Cells that are classified to one of the leaf nodes of the tree (i.e. a cell type of the reference)】
    1. 中间细胞类型,其实就没办法细分的细胞类型,也就是处于根的时候,左右两边的细胞类型的得分相似。【intermediate types: Cells that had a confidence score lower than the threshold in a certain node are assigned to that intermediate node of the tree. This happens when a cell has approximately the same similarity to the cell types in right and the left branch of that node.】
  • 3.中间细胞类型在图中的显示就是Unassigned “Node1”, “Node2”等
    【CHETAH generates generic names for the intermediate types: Unassigned for cells that are classified to the very first node, and “Node1”, “Node2”, etc for the additional nodes】

2.代码实例

(1)安装加载包

if (!requireNamespace("BiocManager", quietly = TRUE))
    install.packages("BiocManager")
BiocManager::install("CHETAH")
vignette("CHETAH_introduction")
library(CHETAH)

(2) 构建reference data

1) 首先你需要下载你要参考的单细胞的数据,我是从Mouse Cell Atlas中下载小鼠脑的数据,然后导入R中分析
setwd("数据存的路径/Mouse Cell Atls")
adult_brain_exp <- read.csv("adult_brain_cell_exp.csv",header=T)
adult_cell_type <- read.csv("adult_brain_cell.csv",header=T)
## filter gene by a gene is expressed at least in 50 cells 因为基因数目比较多,我就把在少于50个细胞中表达的基因过滤了
row_sum <- apply(adult_brain_exp[,-1],1,sum)
filter_exp <- adult_brain_exp[row_sum>50,]#一个基因至少在50个细胞中表达
genename <- as.character(filter_exp[,1])#genename中有两个2-Mar 基因名字
final_exp <- as.matrix(filter_exp[,-1])
index <- which(genename=="2-Mar")
genename[index[1]]<- "2-Mar.1"
rownames(final_exp)<-genename
final_exp <- na.omit(final_exp) # 我数据中不知道怎么有缺失值,然后之前跑一直不成功,我试了那么久才发现
2)我把数据进行标准化和中心化,我使用seurat来做的,可以自己写代码
#Normalization and Scale data and use the Top 3000 variable gene
library(Seurat)
exp_1 <- CreateSeuratObject(counts = final_exp)
exp_1 <- SCTransform(exp_1)
exp_2 <- exp_1@assays$SCT@scale.data
3) 因为参考的数据里面可能不同细胞类型的数目存在差异,作者认为细胞数目在10-200之间是比较好,计算量不会太大,所以有一步选择细胞的过程。我原始数据中有一类细胞有1000多,如果不选的话,会导致构建分类树的时候,结果不准确。
# Cell selction
cell_selection <- unlist(lapply(unique(adult_cell_type$cell.type), function(type) {
    type_cells <- which(adult_cell_type$cell.type == type)
    if (length(type_cells) > 200) {
        type_cells[sample(length(type_cells), 200)]
    } else type_cells
}))
4) 构建reference data 并用自身数据进行分类看看结果
## make reference data
ref_count <- exp_2[,cell_selection]
ref_cellid <- adult_cell_type$cell.id[cell_selection]
ref_celltype <- adult_cell_type$cell.type[cell_selection]
all.equal(as.character(ref_cellid), colnames(ref_count))

adult_brain_ref <-  SingleCellExperiment(assays = list(counts = ref_count),
                                     colData = DataFrame(celltypes = ref_celltype))

#Reference QC
CorrelateReference(ref_cells = adult_brain_ref)
ClassifyReference(ref_cells = adult_brain_ref)

(3) 导入自己的数据

虽然文章没有说自己的数据需不需要标准化,但是我还是做了,我感觉没有多大影响

## input data
input_count <- readsCountSM_TSNE@assays$RNA@counts
## Normalization
input_count <- apply(input_count,2,function(column) log2((column/sum(column) * 100000) + 1))
reduced_tsne <- Embeddings(readsCountSM_TSNE, reduction = "tsne")#使用embeddings 函数来调用tsne 值
all.equal(rownames(reduced_tsne), colnames(input_count))
input_drug <- SingleCellExperiment(assays = list(counts = input_count),
                                  reducedDims = SimpleList(TSNE = reduced_tsne))

(4)分类,然后把分类结果导入从Seurat得到的object中, 就可以了

## Classfication                              
input_drug <- CHETAHclassifier(input = input_drug,
                              ref_cells = adult_brain_ref)

PlotCHETAH(input_drug)      

input_drug <- Classify(input_drug, 0)
PlotCHETAH(input = input_drug, tree = FALSE)
pdf("cell_type_analyzed_by_adult_brain_type_from_Mouse_cell_atlas.pdf",8,8)
DimPlot(object = readsCountSM_TSNE, reduction = 'tsne',label = TRUE,group.by = 'ident',shape.by="orig.ident",repel=TRUE,label.size=5,pt.size=1.5)
dev.off()

levels(readsCountSM_TSNE$orig.ident)[1]="3-HB"
levels(readsCountSM_TSNE$orig.ident)[2]="Control"
Sample_cluster(readsCountSM_TSNE)

3. 总结

我感觉这个方法还是不错的,结果还是挺准的。但是还是取决于所参考的数据。

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

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,308评论 0 10
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,448评论 0 13
  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 9,435评论 0 23
  • 我自我中而凝固成石头 同时享受它的巨大的沉默 伫立于天地,而无世俗的烦忧 我自我中而融化成溪流 同时有感于它的无尽...
    木石散人阅读 522评论 4 20
  • 一个星期后以后放暑假了,我高兴的跳了起来。因为在十五天之前,妈妈和我说好了放假后就带我去海边。 等我们赶到...
    凤凰雅雅阅读 199评论 0 3