單細(xì)胞交響樂12-檢測Doublet

劉小澤寫于2020.7.15
為何取名叫“交響樂”挤茄?因為單細(xì)胞分析就像一個大樂團(tuán)德澈,需要各個流程的協(xié)同配合
單細(xì)胞交響樂1-常用的數(shù)據(jù)結(jié)構(gòu)SingleCellExperiment
單細(xì)胞交響樂2-scRNAseq從實驗到下游簡介
單細(xì)胞交響樂3-細(xì)胞質(zhì)控
單細(xì)胞交響樂4-歸一化
單細(xì)胞交響樂5-挑選高變化基因
單細(xì)胞交響樂6-降維
單細(xì)胞交響樂7-聚類分群
單細(xì)胞交響樂8-marker基因檢測
單細(xì)胞交響樂9-細(xì)胞類型注釋
單細(xì)胞交響樂10-數(shù)據(jù)集整合后的批次矯正
單細(xì)胞交響樂11-多樣本間差異分析

1 前言

scRNA中,doublets指的就是一個文庫中存在兩個細(xì)胞的情況译隘。一般是由于技術(shù)誤差導(dǎo)致的(比如細(xì)胞分選亲桥、捕獲),尤其在基于液滴的技術(shù)中(例如10X)比較突出固耘。它干擾了對單個細(xì)胞表達(dá)量以及細(xì)胞形態(tài)的判斷题篷,比如一個液滴中有兩個細(xì)胞,會通過誤導(dǎo)我們這個細(xì)胞可能處于分化的“過渡態(tài)”厅目。因此檢測和去除這部分的影響至關(guān)重要番枚。

一個比較通用的檢測方法是:單純根據(jù)表達(dá)量(Dahlin et al. 2018)法严。下面將利用一個10X數(shù)據(jù)來展示兩種檢測方法,它們的主要區(qū)別是我們是否需要提前知道分群的信息

數(shù)據(jù)準(zhǔn)備

#--- loading ---#
library(scRNAseq)
sce.mam <- BachMammaryData(samples="G_1")

#--- gene-annotation ---#
library(scater)
rownames(sce.mam) <- uniquifyFeatureNames(
    rowData(sce.mam)$Ensembl, rowData(sce.mam)$Symbol)

library(AnnotationHub)
ens.mm.v97 <- AnnotationHub()[["AH73905"]]
rowData(sce.mam)$SEQNAME <- mapIds(ens.mm.v97, keys=rowData(sce.mam)$Ensembl,
    keytype="GENEID", column="SEQNAME")

#--- quality-control ---#
is.mito <- rowData(sce.mam)$SEQNAME == "MT"
stats <- perCellQCMetrics(sce.mam, subsets=list(Mito=which(is.mito)))
qc <- quickPerCellQC(stats, percent_subsets="subsets_Mito_percent")
sce.mam <- sce.mam[,!qc$discard]

#--- normalization ---#
library(scran)
set.seed(101000110)
clusters <- quickCluster(sce.mam)
sce.mam <- computeSumFactors(sce.mam, clusters=clusters)
sce.mam <- logNormCounts(sce.mam)

#--- variance-modelling ---#
set.seed(00010101)
dec.mam <- modelGeneVarByPoisson(sce.mam)
top.mam <- getTopHVGs(dec.mam, prop=0.1)

#--- dimensionality-reduction ---#
library(BiocSingular)
set.seed(101010011)
sce.mam <- denoisePCA(sce.mam, technical=dec.mam, subset.row=top.mam)
sce.mam <- runTSNE(sce.mam, dimred="PCA")

#--- clustering ---#
snn.gr <- buildSNNGraph(sce.mam, use.dimred="PCA", k=25)
colLabels(sce.mam) <- factor(igraph::cluster_walktrap(snn.gr)$membership)

sce.mam
## class: SingleCellExperiment 
## dim: 27998 2772 
## metadata(0):
## assays(2): counts logcounts
## rownames(27998): Xkr4 Gm1992 ... Vmn2r122 CAAA01147332.1
## rowData names(3): Ensembl Symbol SEQNAME
## colnames: NULL
## colData names(5): Barcode Sample Condition sizeFactor label
## reducedDimNames(2): PCA TSNE
## altExpNames(0):

或者直接加載做好的數(shù)據(jù):https://share.weiyun.com/ReZZnAMw

2 兩種檢測方法

2.1 基于分群結(jié)果的檢測

使用doubletCluster() 將任一cluster與其他另外兩個clusters的表達(dá)量進(jìn)行比較葫笼,即3個cluser為一組深啤,其中一個是query,另外兩個是source路星∷萁郑基于的原假設(shè)是:query cluster的細(xì)胞中如果包含doublet,那么它是來自兩個source clusters洋丐。 (Bach et al. 2017)

參考幫助文檔呈昔,它的具體做法是:
For each “query” cluster, we examine all possible pairs of “source” clusters, hypothesizing that the query consists of doublets formed from the two sources.

If so, gene expression in the query cluster should be strictly intermediate between the two sources after library size normalization.

library(scran)
# sce.mam一共分了10群,所以下面的結(jié)果也是10行友绝,每一群都做了一次檢測
> table(sce.mam$label)

  1   2   3   4   5   6   7   8   9  10 
550 799 716 452  24  84  52  39  32  24 

dbl.out <- doubletCluster(sce.mam)
> dim(dbl.out)
[1] 10  9

返回的結(jié)果包括:

  • 基因數(shù)量N:query cluster與另外兩個source cluster相比特有的差異基因堤尾,它的數(shù)量多少可以為拒絕原假設(shè)提供依據(jù)。這個基因數(shù)量越少迁客,query越有可能是doublets
  • 文庫大小比例 lib.size:每個source cluster的各個細(xì)胞文庫大小中位數(shù) / query cluster中的各個細(xì)胞文庫大小中位數(shù)郭宝,因此兩個source就對應(yīng)兩個lib.size。我們知道doublets是一個文庫包含兩個細(xì)胞掷漱,因此它會比單個細(xì)胞的文庫更大粘室。這個值越小,query越可能是doublets
  • 占全部細(xì)胞的百分比 prop:query中的細(xì)胞數(shù)量占全部細(xì)胞的百分比切威,一般這個值小于5%,不過也取決于10X機(jī)器上樣的數(shù)量

最后主要還是看N的數(shù)量丙号,可以將這個結(jié)果按照N排個序

library(scater)
chosen.doublet <- rownames(dbl.out)[isOutlier(dbl.out$N, 
    type="lower", log=TRUE)]
chosen.doublet
## [1] "6"

挑出來懷疑對象先朦,可以對cluster6進(jìn)一步檢查

比如找到cluster6的marker基因

markers <- findMarkers(sce.mam, direction="up")
dbl.markers <- markers[[chosen.doublet]]
> dim(dbl.markers)
[1] 27998    13
# 然后找Top10基因
library(scater)
chosen <- rownames(dbl.markers)[dbl.markers$Top <= 10]
> length(chosen)
[1] 43
# 最后熱圖
plotHeatmap(sce.mam, order_columns_by="label", features=chosen, 
    center=TRUE, symmetric=TRUE, zlim=c(-5, 5))

看到這個cluster的marker基因,是不是在它的source cluster(即cluster1犬缨、2)中也有類似的表達(dá)模式喳魏?

另外,基于背景知識怀薛,沒有細(xì)胞會同時表達(dá)basal cells (Acta2) and alveolar cells (Csn2) 這兩個基因刺彩,但是看到cluster6中這兩個基因表達(dá)量都較高,再一次證明了我們的假設(shè):cluster6是一個doublet混合體枝恋,而不是純粹的一個細(xì)胞類型

plotExpression(sce.mam, features=c("Acta2", "Csn2"), 
    x="label", colour_by="label")
注意

從上面也能看到创倔,doubletCluster()的優(yōu)點就是方便操作,并且結(jié)果比較好理解焚碌。一旦有懷疑的cluster畦攘,就可以立即檢查。但缺點是高度依賴分群的質(zhì)量十电,如果分群不好知押,那么這個結(jié)果的可信度就會大打折扣叹螟。另外,如果真的有某個亞群中細(xì)胞數(shù)量很少台盯,帶來的結(jié)果就是:N小罢绽,讓這個亞群很有可能成為懷疑對象。

不過静盅,隨著scRNA的技術(shù)改進(jìn)良价,這個doublets情況會逐漸好轉(zhuǎn)

2.2 基于模擬推斷的檢測

將利用來自scran包的doubletCells() ,它基于的假設(shè)是:模擬的doublets和真實的doublets接近

它的算法是:

  • 隨機(jī)選取兩個原始單細(xì)胞表達(dá)量温亲,加和棚壁,當(dāng)做一個模擬的doublet,這樣操作上千次
  • 對每一個原始細(xì)胞栈虚,看看它附近有多少的模擬的doublet袖外,并計算密度
  • 對每一個原始細(xì)胞,同時計算它附近的其他原始細(xì)胞的數(shù)量魂务,并計算密度
  • 對每一個細(xì)胞曼验,計算兩個密度的比值,作為“doublet score”

為了加快密度的計算粘姜,這個函數(shù)會進(jìn)行一個PCA以及l(fā)og轉(zhuǎn)換

library(BiocSingular)
set.seed(100)

dbl.dens <- doubletCells(sce.mam, subset.row=top.mam, 
    d=ncol(reducedDim(sce.mam)))
summary(dbl.dens)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##     0.00     7.63    21.04   395.42    49.30 39572.52

然后把計算結(jié)果的doublet score畫出來鬓照,數(shù)值較高的細(xì)胞聚成一團(tuán)

sce.mam$DoubletScore <- log10(dbl.dens+1)
plotTSNE(sce.mam, colour_by="DoubletScore")

同時,結(jié)合之前doubletCluster()的結(jié)果看一眼:多么明顯的cluster6孤紧!

注意

doubletCells() 的優(yōu)點就是不需要依賴分群結(jié)果豺裆,降低了分群的影響。缺點是需要對doublets的模擬更精確号显,真的要保證它和真實的情況接近臭猜。

另外簡單去掉那些doublet scores較高的細(xì)胞有時也是不夠的,例如一個潛在的doublet cluster中只有一小部分的分值高押蚤,去掉它們剩下的細(xì)胞依然會干擾判斷蔑歌。那么問題來了,怎么樣才叫高的doublet scores呢揽碘?是不是得設(shè)置一個閾值次屠?就像剛才這種情況,如果把閾值降低會不會就多包括了一些潛在的doublets呢雳刺?其實這也是生信中的一個比較頭疼的問題劫灶,沒有一個固定的閾值或者范圍,一切都是相對的掖桦。

比較推薦的方法是將doubletCells() 的結(jié)果再用分群展示出來浑此,就像上面的圖,可以更直觀看到那些細(xì)胞影響較大滞详。

小結(jié)

  • 檢測doublet操作必須要求數(shù)據(jù)來自同一批次凛俱,因為doublet也不會來自兩次捕獲的細(xì)胞紊馏,它畢竟是一個文庫,只是包含兩個細(xì)胞蒲犬,因此也不需要擔(dān)心檢測doublet時怎么去除批次效應(yīng)之類的問題朱监。最好還是在分析前最好先清楚實驗設(shè)計
  • 如果數(shù)據(jù)中包含了細(xì)胞分化軌跡的信息,doublet就不好判斷了原叮,因為處于變化狀態(tài)的細(xì)胞就很像doublet赫编,容易被誤認(rèn)

歡迎關(guān)注我們的公眾號~_~  
我們是兩個農(nóng)轉(zhuǎn)生信的小碩,打造生信星球奋隶,想讓它成為一個不拽術(shù)語擂送、通俗易懂的生信知識平臺。需要幫助或提出意見請后臺留言或發(fā)送郵件到jieandze1314@gmail.com

Welcome to our bioinfoplanet!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唯欣,一起剝皮案震驚了整個濱河市嘹吨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌境氢,老刑警劉巖蟀拷,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異萍聊,居然都是意外死亡问芬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門寿桨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來此衅,“玉大人,你說我怎么就攤上這事亭螟〉舶埃” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵媒佣,是天一觀的道長匕累。 經(jīng)常有香客問我陵刹,道長默伍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任衰琐,我火速辦了婚禮也糊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘羡宙。我一直安慰自己狸剃,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布狗热。 她就那樣靜靜地躺著钞馁,像睡著了一般虑省。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上僧凰,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天探颈,我揣著相機(jī)與錄音,去河邊找鬼训措。 笑死伪节,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绩鸣。 我是一名探鬼主播怀大,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼呀闻!你這毒婦竟也來了化借?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤总珠,失蹤者是張志新(化名)和其女友劉穎屏鳍,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體局服,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡钓瞭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了淫奔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片山涡。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖唆迁,靈堂內(nèi)的尸體忽然破棺而出鸭丛,到底是詐尸還是另有隱情,我是刑警寧澤唐责,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布鳞溉,位于F島的核電站,受9級特大地震影響鼠哥,放射性物質(zhì)發(fā)生泄漏熟菲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一朴恳、第九天 我趴在偏房一處隱蔽的房頂上張望抄罕。 院中可真熱鬧,春花似錦于颖、人聲如沸呆贿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽做入。三九已至冒晰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間竟块,已是汗流浹背翩剪。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留彩郊,地道東北人前弯。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像秫逝,于是被迫代替她去往敵國和親恕出。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,700評論 2 345