scRNA-Seq | 多樣本Seurat+CCA整合

一、前言

左邊的圖簡(jiǎn)單地把多個(gè)單細(xì)胞的數(shù)據(jù)合并在一起,不考慮去除批次效應(yīng),樣本之間有明顯的分離現(xiàn)象。右邊的圖是使用算法校正批次效應(yīng),不同的樣本基本融和在一起了。scRNA數(shù)據(jù)校正批次效應(yīng)的算法有很多:MNN, CCA+MNN, Harmony, Scanorama, scMerge等,本文推薦發(fā)表在Cell上的CCA+MNN方法,通過Seurat包就可以實(shí)現(xiàn)。

1. Seurat數(shù)據(jù)整合功能簡(jiǎn)介

Seurat早期版本整合數(shù)據(jù)的核心算法是CCA,文章發(fā)表在2018年的nature biotechnology,作者是Seurat的開發(fā)者Andrew Butler。同年Haghverdi等人開發(fā)了MNN算法校正批次效應(yīng),文章也發(fā)表在了nature biotechnology。2019年Andrew等人將CCA與MNN算法結(jié)合起來(lái),并參考SNN算法的理念設(shè)計(jì)了“錨點(diǎn)”評(píng)分體系,使Seurat整合數(shù)據(jù)更強(qiáng)大更穩(wěn)健。它不僅可以校正實(shí)驗(yàn)的批次效應(yīng),還能跨平臺(tái)整合數(shù)據(jù),例如將10x單細(xì)胞數(shù)據(jù)、BD單細(xì)胞數(shù)據(jù)和SMART單細(xì)胞數(shù)據(jù)整合在一起;也能整合單細(xì)胞多組學(xué)數(shù)據(jù),例如將單細(xì)胞ATAC、空間轉(zhuǎn)錄組與單細(xì)胞轉(zhuǎn)錄組數(shù)據(jù)整合在一起。本文只討論多樣本數(shù)據(jù)的合并與校正批次效應(yīng),多組學(xué)數(shù)據(jù)的整合以后專門寫篇文章介紹。

2. Seurat整合流程與原理

(1)使用CCA分析將兩個(gè)數(shù)據(jù)集降維到同一個(gè)低維空間,因?yàn)镃CA降維之后的空間距離不是相似性而是相關(guān)性,所以相同類型與狀態(tài)的細(xì)胞可以克服技術(shù)偏倚重疊在一起。CCA分析效果見下圖:

左圖使用PCA降維,細(xì)胞之間的距離體現(xiàn)的是轉(zhuǎn)錄特征相似性,批次效應(yīng)引入的系統(tǒng)誤差會(huì)使樣本分離。右圖使用CCA降維,細(xì)胞之間的距離體現(xiàn)的是轉(zhuǎn)錄特征相關(guān)性,因此同類型且同狀態(tài)的細(xì)胞可以跨越技術(shù)差異重疊在一起。

(2)CCA降維之后細(xì)胞在低維空間有了可以度量的“距離”,MNN(mutual nearest neighbor)算法以此找到兩個(gè)數(shù)據(jù)集之間互相“距離”最近的細(xì)胞,Seurat將這些相互最近鄰細(xì)胞稱為“錨點(diǎn)細(xì)胞”。我們用兩個(gè)數(shù)據(jù)集A和B來(lái)說(shuō)明錨點(diǎn),假設(shè):

  • A樣本中的細(xì)胞A3與B樣本中距離最近的細(xì)胞有3個(gè)(B1,B2,B3)
  • B樣本中的細(xì)胞B1與A樣本中距離最近的細(xì)胞有4個(gè)(A1,A2,A3,A4)
  • B樣本中的細(xì)胞B2與A樣本中距離最近的細(xì)胞有2個(gè)(A5,A6)
  • B樣本中的細(xì)胞B3與A樣本中距離最近的細(xì)胞有3個(gè)(A1,A2,A7)

那么A3與B1是相互最近鄰細(xì)胞,A3與B2、B3不是相互最近鄰細(xì)胞,A3+B1就是A、B兩個(gè)數(shù)據(jù)集中的錨點(diǎn)之一。實(shí)際數(shù)據(jù)中,兩個(gè)數(shù)據(jù)集之間的錨點(diǎn)可能有幾百上千個(gè),如下圖所示:

圖中每條線段連接的都是相互最近鄰細(xì)胞

(3)理想情況下相同類型和狀態(tài)的細(xì)胞才能構(gòu)成配對(duì)錨點(diǎn)細(xì)胞,但是異常的情況也會(huì)出現(xiàn),如上圖中query數(shù)據(jù)集中黑色的細(xì)胞團(tuán)。它在reference數(shù)據(jù)集沒有相同類型的細(xì)胞,但是它也找到了錨點(diǎn)配對(duì)細(xì)胞(紅色連線)。Seurat會(huì)通過兩步過濾這些不正確的錨點(diǎn):

  1. 在CCA低維空間找到的錨點(diǎn),返回到基因表達(dá)數(shù)據(jù)構(gòu)建的高維空間中驗(yàn)證,如果它們的轉(zhuǎn)錄特征相似性高則保留,否則過濾此錨點(diǎn)。

  2. 檢查錨點(diǎn)細(xì)胞所在數(shù)據(jù)集最鄰近的30個(gè)細(xì)胞,查看它們重疊的錨點(diǎn)配對(duì)細(xì)胞的數(shù)量,重疊越多分值越高,代表錨點(diǎn)可靠性更高。原理見下圖:

左邊query數(shù)據(jù)集的一個(gè)錨點(diǎn)細(xì)胞能在reference數(shù)據(jù)集鄰近區(qū)域找到多個(gè)配對(duì)錨點(diǎn)細(xì)胞,可以得到更高的錨點(diǎn)可靠性評(píng)分;右邊一個(gè)錨點(diǎn)細(xì)胞只能在reference數(shù)據(jù)集鄰近區(qū)域找到一個(gè)配對(duì)錨點(diǎn)細(xì)胞,錨點(diǎn)可靠性評(píng)分則較低。

4、經(jīng)過層層過濾剩下的錨點(diǎn)細(xì)胞對(duì),可以認(rèn)為它們是相同類型和狀態(tài)的細(xì)胞,它們之間的基因表達(dá)差異是技術(shù)偏倚引起的。Seurat計(jì)算它們的差異向量,然后用此向量校正這個(gè)錨點(diǎn)錨定的細(xì)胞子集的基因表達(dá)值。校正后的基因表達(dá)值即消除了技術(shù)偏倚,實(shí)現(xiàn)了兩個(gè)單細(xì)胞數(shù)據(jù)集的整合。

深究技術(shù)細(xì)節(jié)的朋友可以參閱原文:Tim S, Andrew Butler, Paul Hoffman , et al. Comprehensive integration of single cell data[J].Cell,2019.

二、整合

1. 讀入數(shù)據(jù)

GSE162631,4個(gè)膠質(zhì)瘤樣本,總計(jì)5萬(wàn)多個(gè)細(xì)胞。

library(dplyr)
library(Seurat)
library(patchwork)



dirs = dir(pattern = "^R")
f = "dat.Rdata"
if(!file.exists(f)){
  scelist = list()
}

2. 讀取樣本,創(chuàng)建 Seurat 對(duì)象

在讀取樣本的同時(shí)直接設(shè)置樣本的篩選條件,如RNA,UMI,線粒體等。

for(i in 1:length(dirs)){
  x = Read10X(data.dir = dirs[[i]])
  scelist[[i]] <- CreateSeuratObject(counts = x, project = paste0("R",i))
  scelist[[i]][["percent.mt"]] <- PercentageFeatureSet(scelist[[i]], pattern = "^MT-")
  scelist[[i]] <- subset(scelist[[i]], subset = percent.mt < 10)
}
names(scelist)  = paste0("R",1:4)
sum(sapply(scelist, function(x)ncol(x@assays$RNA@counts)))

3. 對(duì)數(shù)據(jù)先進(jìn)行標(biāo)準(zhǔn)化,并識(shí)別 variable feature

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

4. 整合數(shù)據(jù)

Seurat提供了一組Integration方法來(lái)去除批次效應(yīng),這些方法首先識(shí)別處于匹配生物學(xué)狀態(tài)(anchors)的跨數(shù)據(jù)集細(xì)胞對(duì),然后基于這些anchors校正數(shù)據(jù)集之間的批次效應(yīng)


首先提取用來(lái)進(jìn)行Integration的基因,然后找到anchors,基于anchors進(jìn)行批次效應(yīng)矯正

使用FindIntegrationAnchors函數(shù)識(shí)別錨點(diǎn)。參數(shù)默認(rèn)。

然后我們將這些錨點(diǎn)傳遞給IntegrateData函數(shù),該函數(shù)返回一個(gè)Seurat對(duì)象。

features <- SelectIntegrationFeatures(object.list = scelist)
immune.anchors <- FindIntegrationAnchors(object.list = scelist, anchor.features = features)
immune.combined <- IntegrateData(anchorset = immune.anchors)
DefaultAssay(immune.combined) <- "integrated"

immune.combined 是兩個(gè)樣品經(jīng)過批次效應(yīng)矯正后合并的Seurat 對(duì)象,對(duì)這個(gè)對(duì)象進(jìn)行分群分析

然后我們可以使用這個(gè)新的表達(dá)矩陣進(jìn)行下游分析和可視化。

5. 下游分析

按照單樣本的流程繼續(xù)分析,包括進(jìn)行標(biāo)準(zhǔn)化,運(yùn)行PCA,并使用UMAP可視化結(jié)果。

# 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)
save(immune.combined,file = f)


load(f)
p1 <- DimPlot(immune.combined, reduction = "umap", group.by = "orig.ident")
p2 <- DimPlot(immune.combined, reduction = "umap", label = TRUE, repel = TRUE)
p1 + p2

可以看到經(jīng)過批次矯正后,4個(gè)樣品的大部分細(xì)胞在UMAP上都是重疊的。

6. 注釋

測(cè)試樣品經(jīng)過批次矯正后,相同類型的細(xì)胞都聚到了一起,這樣更有利于對(duì)細(xì)胞類型進(jìn)行鑒定。實(shí)際分析時(shí),我們可以對(duì)自己的樣品同時(shí)做這兩種分析,根據(jù)結(jié)果來(lái)判斷是否需要進(jìn)行批次矯正。

library(celldex)
library(SingleR)
#ref <- celldex::HumanPrimaryCellAtlasData()
ref <- get(load("../single_ref/ref_Human_all.RData"))
library(BiocParallel)
pred.scRNA <- SingleR(test = immune.combined@assays$integrated@data, 
                      ref = ref,
                      labels = ref$label.main, 
                      clusters = immune.combined@active.ident)
pred.scRNA$pruned.labels
##  [1] "Macrophage"        "Macrophage"        "Monocyte"         
##  [4] "Macrophage"        "Macrophage"        "Macrophage"       
##  [7] "Macrophage"        "Monocyte"          "Neutrophils"      
## [10] "Neutrophils"       "Endothelial_cells" "Monocyte"         
## [13] "Macrophage"        "Macrophage"        "Tissue_stem_cells"
## [16] "NK_cell"           "Monocyte"          "B_cell"
plotScoreHeatmap(pred.scRNA, clusters=pred.scRNA@rownames, fontsize.row = 9,show_colnames = T)

image
new.cluster.ids <- pred.scRNA$pruned.labels
names(new.cluster.ids) <- levels(immune.combined)
levels(immune.combined)
##  [1] "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13" "14"
## [16] "15" "16" "17"
immune.combined <- RenameIdents(immune.combined,new.cluster.ids)
levels(immune.combined)
## [1] "Macrophage"        "Monocyte"          "Neutrophils"      
## [4] "Endothelial_cells" "Tissue_stem_cells" "NK_cell"          
## [7] "B_cell"
UMAPPlot(object = immune.combined, pt.size = 0.5, label = TRUE)

代碼主要來(lái)自:https://satijalab.org/seurat/articles/integration_introduction.html

參考:
http://www.lxweimin.com/p/9d798e95fb65
https://www.bilibili.com/read/cv15514134
http://www.lxweimin.com/p/d323d0291dd4
https://baijiahao.baidu.com/s?id=1707789923750679171&wfr=spider&for=pc
https://mp.weixin.qq.com/s/PA_xTrqVYiZCOscP43CgUw
https://mp.weixin.qq.com/s/FWvOEJSNb9epNZmxwFkhkg
https://www.genenergy.cn/news/156/2379.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。