Seurat 3.X版本能夠整合scRNA-seq和scATAC-seq, 主要體現(xiàn)在:
- 基于scRNA-seq的聚類結(jié)果對scATAC-seq的細(xì)胞進(jìn)行聚類
- scRNA-seq和scATAC-seq共嵌入(co-embed)分析
整合步驟包括如下步驟:
- 從ATAC-seq中估計RNA-seq表達(dá)水平,即從ATAC-seq reads定量基因表達(dá)活躍度
- 使用LSI學(xué)習(xí)ATAC-seq數(shù)據(jù)的內(nèi)部結(jié)構(gòu)
- 鑒定ATAC-seq和RNA-seq數(shù)據(jù)集的錨點
- 數(shù)據(jù)集間進(jìn)行轉(zhuǎn)移,包括聚類的標(biāo)簽,在ATAC-seq數(shù)據(jù)中推測RNA水平用于共嵌入分析
數(shù)據(jù)下載
可以復(fù)制下載鏈接到瀏覽器下載,也可以直接在R語言用download.file中進(jìn)行下載。
# 下載peak
atac_peak <- "http://cf.10xgenomics.com/samples/cell-atac/1.0.1/atac_v1_pbmc_10k/atac_v1_pbmc_10k_filtered_peak_bc_matrix.h5"
atac_peak_file <- "atac_v1_pbmc_10k_filtered_peak_bc_matrix.h5"
download.file(atac_peak, atac_peak_file)
# 下載singlecell.csv
singlecell <- "http://cf.10xgenomics.com/samples/cell-atac/1.0.1/atac_v1_pbmc_10k/atac_v1_pbmc_10k_singlecell.csv"
singlecell_file <- "atac_v1_pbmc_10k_singlecell.csv"
download.file(singlecell, singlecell_file)
# 下載rna-seq
rna_seq <- "http://cf.10xgenomics.com/samples/cell-exp/3.0.0/pbmc_10k_v3/pbmc_10k_v3_filtered_feature_bc_matrix.h5"
rna_seq_file <- "pbmc_10k_v3_filtered_feature_bc_matrix.h5"
download.file(rna_seq, rna_seq_file)
# 下載GTF
gtf <- "ftp://ftp.ensembl.org/pub/grch37/release-82/gtf/homo_sapiens/Homo_sapiens.GRCh37.82.gtf.gz"
gtf_file <- "Homo_sapiens.GRCh37.82.gtf.gz"
download.file(gtf, gtf_file)
基因活躍度定量
首先,先將peak矩陣轉(zhuǎn)成基因活躍度矩陣。Seurat做了一個簡單的假設(shè),基因活躍度可以通過簡單的將落在基因區(qū)和其上游2kb的count相加得到基因活躍度,并且這個結(jié)果Cicero等工具返回gene-by-cell矩陣是類似的。
library(Seurat)
library(ggplot2)
# 讀取peak
peaks <- Read10X_h5(atac_peak_file)
activity.matrix <- CreateGeneActivityMatrix(peak.matrix = peaks,
annotation.file = gtf_file,
seq.levels = c(1:22, "X", "Y"),
upstream = 2000,
verbose = TRUE)
activity.matrix是一個dgCMatrix對象,其中行為基因,列為細(xì)胞。因此如果對于Cicero的輸出結(jié)果,只要提供相應(yīng)的矩陣數(shù)據(jù)結(jié)構(gòu)即可。
設(shè)置對象
下一步,我們要來設(shè)置Seurat對象,將原始的peak counts保存到assay中,命名為"ATAC"
pbmc.atac <- CreateSeuratObject(counts = peaks, assay = "ATAC", project = "10x_ATAC")
增加基因活躍度矩陣,命名為"ACTIVITY".
pbmc.atac[["ACTIVITY"]] <- CreateAssayObject(counts = activity.matrix)
增加細(xì)胞的元信息,該信息來自于scATAC-seq的CellRanger處理的singlecell.csv
meta <- read.table(singlecell_file, sep = ",", header = TRUE, row.names = 1,
stringsAsFactors = FALSE)
meta <- meta[colnames(pbmc.atac), ]
pbmc.atac <- AddMetaData(pbmc.atac, metadata = meta)
過濾掉scATAC-seq數(shù)據(jù)中總count數(shù)低于5000的細(xì)胞,這個閾值需要根據(jù)具體實驗設(shè)置
pbmc.atac <- subset(pbmc.atac, subset = nCount_ATAC > 5000)
pbmc.atac$tech <- "atac"
數(shù)據(jù)預(yù)處理
為了找到scATAC-seq數(shù)據(jù)集和scRNA-seq數(shù)據(jù)集之間的錨定點,我們需要對基因活躍度矩陣進(jìn)行預(yù)處理
設(shè)置pbmc.atac的默認(rèn)Assay為"ACTIVITY", 然后尋找高表達(dá)的基因,對基因活躍度矩陣進(jìn)行標(biāo)準(zhǔn)化和Scale。
DefaultAssay(pbmc.atac) <- "ACTIVITY"
pbmc.atac <- FindVariableFeatures(pbmc.atac)
pbmc.atac <- NormalizeData(pbmc.atac)
pbmc.atac <- ScaleData(pbmc.atac)
同樣的,我們還需要對peak矩陣進(jìn)行處理。這里我們用的隱語義(Latent semantic indexing, LSI)方法對scATAC-seq數(shù)據(jù)進(jìn)行降維。該步驟學(xué)習(xí)scRNA-seq數(shù)據(jù)的內(nèi)部結(jié)構(gòu),并且在轉(zhuǎn)換信息時對錨點恰當(dāng)權(quán)重的決定很重要。
根據(jù) Cusanovich et al, Science 2015提出的LSI方法,他們搞了一個RunLSI函數(shù)。LSI的計算方法為TF-IDF加SVD。
我們使用在所有細(xì)胞中至少有100個read的peak,然后降維到50。該參數(shù)的選擇受之前的scATAC-seq研究啟發(fā),所以沒有更改,當(dāng)然你你可以把它改了。
DefaultAssay(pbmc.atac) <- "ATAC"
VariableFeatures(pbmc.atac) <- names(which(Matrix::rowSums(pbmc.atac) > 100))
pbmc.atac <- RunLSI(pbmc.atac, n = 50, scale.max = NULL)
#pbmc.atac <- RunUMAP(pbmc.atac, reduction = "lsi", dims = 1:50)
pbmc.atac <- RunTSNE(pbmc.atac, reduction = "lsi", dims = 1:50)
注: 要將pbmc.atac的默認(rèn)assay切換成"ATAC", 非線性降維可以選擇UMAP或者t-SNE。
我們之前使用過Seurat對scRNA-seq數(shù)據(jù)進(jìn)行預(yù)處理和聚類,下載地址為Dropbox
pbmc.rna <- readRDS("pbmc_10k_v3.rds")
pbmc.rna$tech <- "rna"
將scRNA-seq和scATAC-seq共同展示,對一些骨髓(myeloid)和淋巴(lymphoid)PBMC中比較常見的聚類,其實是能從圖中看出來。
p1 <- DimPlot(pbmc.atac, reduction = "tsne") +
NoLegend() +
ggtitle("scATAC-seq")
p2 <- DimPlot(pbmc.rna, group.by = "celltype", reduction = "tsne", label = TRUE, repel = TRUE) +
NoLegend() +
ggtitle("scRNA-seq")
CombinePlots(plots = list(p1, p2))

現(xiàn)在,我們用FindTransferAnchors鑒定scATAC-seq數(shù)據(jù)集和scRNA-seq數(shù)據(jù)集的錨點,然后根據(jù)這些錨點將 10K scRNA-seq數(shù)據(jù)中鑒定的細(xì)胞類型標(biāo)記轉(zhuǎn)移到scATAC-seq細(xì)胞中。
transfer.anchors <- FindTransferAnchors(reference = pbmc.rna,
query = pbmc.atac,
features = VariableFeatures(object = pbmc.rna),
reference.assay = "RNA",
query.assay = "ACTIVITY",
reduction = "cca")
Seurat比較的是scRNA-seq表達(dá)量矩陣和scATAC-seq中基因活躍度矩陣,利用CCA降維方法比較兩者在scRNA-seq中的高變異基因的關(guān)系
為了轉(zhuǎn)移細(xì)胞類群的編號,我們需要一組之前注釋過的細(xì)胞類型,作為TransferData的 refdata 參數(shù)輸入。TransferData本質(zhì)上采用的是KNN算法,利用距離未知類型細(xì)胞的最近N個已知細(xì)胞所屬的類型來定義該細(xì)胞。weight.reduction參數(shù)是用來選擇設(shè)置權(quán)重的降維。
celltype.predictions <- TransferData(anchorset = transfer.anchors,
refdata = pbmc.rna$celltype,
weight.reduction = pbmc.atac[["lsi"]])
pbmc.atac <- AddMetaData(pbmc.atac, metadata = celltype.predictions)
我們可以檢查每個細(xì)胞預(yù)測得分的分布情況,選擇性的過濾哪些得分比較低的細(xì)胞。我們發(fā)現(xiàn)超過95%的細(xì)胞得分大于或等于0.5.
hist(pbmc.atac$prediction.score.max)
abline(v = 0.5, col = "red")

table(pbmc.atac$prediction.score.max > 0.5)
# FALSE TRUE
# 383 7483
之后,我們就可以在UMAP上檢查預(yù)測的細(xì)胞類型的分布,檢查細(xì)胞類型在scRNA-seq和scATAC-seq中的相對位置
pbmc.atac.filtered <- subset(pbmc.atac,
subset = prediction.score.max > 0.5)
pbmc.atac.filtered$predicted.id <- factor(pbmc.atac.filtered$predicted.id,
levels = levels(pbmc.rna)) # to make the colors match
p1 <- DimPlot(pbmc.atac.filtered,
group.by = "predicted.id",
label = TRUE,
repel = TRUE) +
ggtitle("scATAC-seq cells") +
NoLegend() +
scale_colour_hue(drop = FALSE)
p2 <- DimPlot(pbmc.rna, group.by = "celltype", label = TRUE, repel = TRUE) +
ggtitle("scRNA-seq cells") +
NoLegend()
CombinePlots(plots = list(p1, p2))

在轉(zhuǎn)移細(xì)胞類型標(biāo)記之后,我們就可以進(jìn)行細(xì)胞特意水平上的下有分析。舉個例子,我們可以去找一些某些細(xì)胞類型特異的增強(qiáng)子,尋找富集的motif。目前這些分析Seurat還不直接支持,還在調(diào)試中。
共嵌入(co-embedding)
最后,如果你想將所有的細(xì)胞一同展示,可以將scRNA-seq和scATAC-seq數(shù)據(jù)嵌入到相同的低維空間。
我們使用之前的錨點從scATAC-seq細(xì)胞中推斷RNA-seq的值,后續(xù)分析就相當(dāng)于兩個單細(xì)胞數(shù)據(jù)的分析流程。
注意: 這一步只是為了可視化,其實不做也行。
選擇用于估計的基因,可以是高變動基因,也可以是所有基因。
# 只選擇高變動的基因作為參考
genes.use <- VariableFeatures(pbmc.rna)
data <- GetAssayData(pbmc.rna, assay = "RNA", slot = "data")[genes.use, ]
之后利用TransferData推斷scATAC-seq在這些基因中的可能值,輸出結(jié)果就是ATAC細(xì)胞對應(yīng)的scRNA-seq矩陣
imputation <- TransferData(anchorset = transfer.anchors,
refdata = refdata,
weight.reduction = pbmc.atac[["lsi"]])
# this line adds the imputed data matrix to the pbmc.atac object
pbmc.atac[["RNA"]] <- imputation
合并兩個的結(jié)果,然后就是scRNA-seq的常規(guī)分析。
coembed <- merge(x = pbmc.rna, y = pbmc.atac)
# 標(biāo)準(zhǔn)化分析
coembed <- ScaleData(coembed, features = genes.use, do.scale = FALSE)
coembed <- RunPCA(coembed, features = genes.use, verbose = FALSE)
#coembed <- RunUMAP(coembed, dims = 1:30)
coembed <- RunTSNE(coembed, dims = 1:30)
coembed$celltype <- ifelse(!is.na(coembed$celltype), coembed$celltype, coembed$predicted.id)
在t-SNE上繪制結(jié)果
p1 <- DimPlot(coembed, reduction="tsne", group.by = "tech")
p2 <- DimPlot(coembed, reduction="tsne", group.by = "celltype", label = TRUE, repel = TRUE)
CombinePlots(list(p1, p2))

從上面的結(jié)果中,你可能會發(fā)現(xiàn)某些細(xì)胞只有在一類技術(shù)中存在。舉個例子,從巨噬細(xì)胞(megakaryocytes)到成熟的血小板細(xì)胞(pletelet)由于沒有細(xì)胞核,無法被scATAC-seq技術(shù)檢測到。我們可以單獨(dú)展示每個技術(shù),進(jìn)行檢查
DimPlot(coembed, reduction="tsne", split.by = "tech", group.by = "celltype", label = TRUE, repel = TRUE) + NoLegend()

此外,你還可以發(fā)現(xiàn)B細(xì)胞前體類型附近有一類細(xì)胞只由scATAC-seq的細(xì)胞構(gòu)成。通過展示這些細(xì)胞在CellRanger分析結(jié)果提供的黑名單位置所占read數(shù),可以推測出這類細(xì)胞可能是死細(xì)胞,或者是其他scRNA-seq無法檢測的人為因素。
coembed$blacklist_region_fragments[is.na(coembed$blacklist_region_fragments)] <- 0
FeaturePlot(coembed, features = "blacklist_region_fragments", max.cutoff = 500)

Seurat這種基于基因活躍度得分進(jìn)行細(xì)胞類型預(yù)測,是否靠譜,開發(fā)者提供了如下幾個證據(jù)
總體預(yù)測得分(pbmc.atac$prediction.score.max)高,意味著用scRNA-seq定義細(xì)胞類型比較可靠
我們可以在scATC-seq降維結(jié)果中
利用相同錨點的貢嵌入分析,發(fā)現(xiàn)兩類形態(tài)能很好的混合
將ATAC-seq數(shù)據(jù)根據(jù)聚類結(jié)果構(gòu)建pseduo bulk, 發(fā)現(xiàn)和真實的bulk數(shù)據(jù)近似