引言
本系列開(kāi)啟R中單細(xì)胞RNA-seq數(shù)據(jù)分析教程,持續(xù)更新,歡迎關(guān)注,轉(zhuǎn)發(fā)!
導(dǎo)入Seurat包
首先,請(qǐng)確認(rèn)你的R軟件已經(jīng)安裝了Seurat這個(gè)包。
library(Seurat)
這會(huì)將您已安裝的Seurat包載入您當(dāng)前的R環(huán)境中。通常不會(huì)出現(xiàn)錯(cuò)誤,但可能會(huì)有一些詳細(xì)信息顯示。如果提示您該包無(wú)法找到,請(qǐng)先進(jìn)行Seurat的安裝。
install.packages("Seurat")
library(Seurat)
1. 創(chuàng)建Seurat對(duì)象
Seurat 引入了一種新的數(shù)據(jù)類型,稱為“ Seurat ”。這種數(shù)據(jù)類型使得 Seurat 能夠記錄整個(gè)分析過(guò)程中的所有步驟和結(jié)果。因此,首要步驟是導(dǎo)入數(shù)據(jù)并構(gòu)建一個(gè) Seurat 對(duì)象。對(duì)于通過(guò) 10x Genomics 平臺(tái)產(chǎn)生的數(shù)據(jù),Seurat 提供了一種便捷的處理方式。
counts <- Read10X(data.dir = "data/DS1/")
seurat <- CreateSeuratObject(counts, project="DS1")
Read10X
函數(shù)的功能是導(dǎo)入數(shù)據(jù)矩陣,并將其行名和列名分別按照基因名稱和細(xì)胞條碼進(jìn)行重新命名。當(dāng)然,如果數(shù)據(jù)不是通過(guò) 10x 平臺(tái)生成的,人們也可以選擇手動(dòng)進(jìn)行這些操作。
library(Matrix)
counts <- readMM("data/DS1/matrix.mtx.gz")
barcodes <- read.table("data/DS1/barcodes.tsv.gz", stringsAsFactors=F)[,1]
features <- read.csv("data/DS1/features.tsv.gz", stringsAsFactors=F, sep="\t", header=F)
rownames(counts) <- make.unique(features[,2])
colnames(counts) <- barcodes
seurat <- CreateSeuratObject(counts, project="DS1")
如果您瀏覽Seurat教程,您會(huì)發(fā)現(xiàn)在CreateSeuratObj
函數(shù)中增加了一些額外的參數(shù),比如min.cells
和min.features
。當(dāng)設(shè)置這些參數(shù)后,會(huì)對(duì)數(shù)據(jù)進(jìn)行初步篩選,從一開(kāi)始就排除那些在太少細(xì)胞中被檢測(cè)到的基因,以及那些檢測(cè)到基因數(shù)量過(guò)少的細(xì)胞。這種做法是可行的,但建議保留所有基因(即保持默認(rèn)設(shè)置或?qū)?code>min.cells設(shè)為0)。
2. 質(zhì)量控制
在創(chuàng)建Seurat對(duì)象之后,接下來(lái)的步驟是對(duì)數(shù)據(jù)進(jìn)行質(zhì)量控制。最常見(jiàn)的質(zhì)量控制包括篩選掉:
- 檢測(cè)到的基因數(shù)量過(guò)少的細(xì)胞。這些通常意味著細(xì)胞的測(cè)序深度不足以進(jìn)行可靠的特征描述。
- 檢測(cè)到的基因數(shù)量過(guò)多的細(xì)胞。這些可能代表雙細(xì)胞或多細(xì)胞(即同一液滴中的兩個(gè)或多個(gè)細(xì)胞,因此具有相同的細(xì)胞條碼)。
- 線粒體轉(zhuǎn)錄本百分比過(guò)高的細(xì)胞。由于大多數(shù)單細(xì)胞RNA測(cè)序?qū)嶒?yàn)使用寡T來(lái)捕獲mRNA,線粒體轉(zhuǎn)錄本應(yīng)該因?yàn)槿鄙賞oly-A尾而較少,但不可避免地會(huì)捕獲一些線粒體轉(zhuǎn)錄本。同時(shí),也有證據(jù)顯示一些線粒體轉(zhuǎn)錄本中存在穩(wěn)定的poly-A尾,但它們是降解的標(biāo)志。總的來(lái)說(shuō),線粒體轉(zhuǎn)錄本百分比高的細(xì)胞可能代表處于壓力狀態(tài)的細(xì)胞(例如缺氧),這些細(xì)胞產(chǎn)生大量的線粒體,或者產(chǎn)生異常高數(shù)量的截短線粒體轉(zhuǎn)錄本。
雖然Seurat在創(chuàng)建Seurat對(duì)象時(shí)會(huì)自動(dòng)統(tǒng)計(jì)檢測(cè)到的基因數(shù)量(其中nFeature_RNA代表檢測(cè)到的基因/特征數(shù)量;nCount_RNA代表檢測(cè)到的轉(zhuǎn)錄本數(shù)量),但線粒體轉(zhuǎn)錄本的百分比需要手動(dòng)計(jì)算。不過(guò),Seurat提供了一個(gè)便捷的解決方案來(lái)處理這個(gè)問(wèn)題。
seurat[["percent.mt"]] <- PercentageFeatureSet(seurat, pattern = "^MT[-\\.]")
請(qǐng)留意,篩選標(biāo)準(zhǔn)并非一成不變,因?yàn)檫@些指標(biāo)的正常值范圍可能因?qū)嶒?yàn)而異,這取決于樣本來(lái)源、使用的試劑以及測(cè)序深度。這里建議僅排除異常值細(xì)胞,也就是那些在某些質(zhì)量控制指標(biāo)上明顯偏離大多數(shù)細(xì)胞的少數(shù)細(xì)胞。為了做到這一點(diǎn),首先需要了解這些值在數(shù)據(jù)中的分布情況。可以通過(guò)為每個(gè)指標(biāo)繪制小提琴圖來(lái)觀察它們的分布。
VlnPlot(seurat, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)
VlnPlot(seurat, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3, pt.size=0)
正如所料,細(xì)胞中檢測(cè)到的基因數(shù)量與轉(zhuǎn)錄本數(shù)量之間存在較強(qiáng)的相關(guān)性,但線粒體轉(zhuǎn)錄本的百分比卻并非如此。
library(patchwork)
plot1 <- FeatureScatter(seurat, feature1 = "nCount_RNA", feature2 = "percent.mt")
plot2 <- FeatureScatter(seurat, feature1 = "nCount_RNA", feature2 = "nFeature_RNA")
plot1 + plot2
鑒于基因數(shù)量與轉(zhuǎn)錄本數(shù)量之間存在相關(guān)性,只需針對(duì)其中一個(gè)指標(biāo)設(shè)定一個(gè)閾值,并結(jié)合線粒體轉(zhuǎn)錄本百分比的上限來(lái)進(jìn)行質(zhì)量控制。以這個(gè)數(shù)據(jù)集為例,將檢測(cè)到的基因數(shù)量設(shè)定在500到5000之間,線粒體轉(zhuǎn)錄本百分比低于5%是一個(gè)合理的選擇,但根據(jù)具體情況調(diào)整閾值也是完全可以的。
seurat <- subset(seurat, subset = nFeature_RNA > 500 & nFeature_RNA < 5000 & percent.mt < 5)
需要指出的是,有時(shí)候可能需要執(zhí)行更嚴(yán)格的質(zhì)量控制。其中一個(gè)可能的問(wèn)題是細(xì)胞雙重捕獲(doublets)。由于不同細(xì)胞捕獲的RNA量差異很大,雙重捕獲的細(xì)胞并不總是表現(xiàn)出更高的基因或轉(zhuǎn)錄本檢測(cè)數(shù)量。目前有幾個(gè)工具可以預(yù)測(cè)一個(gè)“細(xì)胞”是否為單個(gè)細(xì)胞,或者實(shí)際上是雙重捕獲/多重捕獲。例如,DoubletFinder 通過(guò)在數(shù)據(jù)中隨機(jī)平均細(xì)胞構(gòu)建人工雙重捕獲,然后測(cè)試每個(gè)細(xì)胞是否與人工雙重捕獲更相似來(lái)預(yù)測(cè)雙重捕獲。這有助于判斷一個(gè)細(xì)胞是否有可能是雙重捕獲。同樣,線粒體轉(zhuǎn)錄本的百分比也許不足以篩選出處于壓力或不健康的細(xì)胞。有時(shí),可能需要進(jìn)行額外的篩選,比如基于機(jī)器學(xué)習(xí)的預(yù)測(cè)。
3. 數(shù)據(jù)標(biāo)準(zhǔn)化
與批量RNA-seq類似,由于不同細(xì)胞捕獲的RNA量存在差異,不能直接比較不同細(xì)胞中每個(gè)基因的捕獲轉(zhuǎn)錄本數(shù)量。因此,需要進(jìn)行標(biāo)準(zhǔn)化處理,以使不同細(xì)胞間的基因表達(dá)水平可以相互比較。單細(xì)胞RNA-seq數(shù)據(jù)分析中最常用的標(biāo)準(zhǔn)化方法與TPM(每百萬(wàn)讀數(shù)的轉(zhuǎn)錄本數(shù))概念類似 - 即對(duì)每個(gè)細(xì)胞的特征表達(dá)量進(jìn)行標(biāo)準(zhǔn)化,然后乘以一個(gè)縮放因子(默認(rèn)為10000)。最后,將得到的表情水平進(jìn)行對(duì)數(shù)轉(zhuǎn)換,以便表達(dá)值更符合正態(tài)分布。值得一提的是,在進(jìn)行對(duì)數(shù)轉(zhuǎn)換之前,每個(gè)值都會(huì)加上一個(gè)偽計(jì)數(shù),這樣即使在某個(gè)細(xì)胞中未檢測(cè)到轉(zhuǎn)錄本的基因,在對(duì)數(shù)轉(zhuǎn)換后仍然可以顯示為零值。
seurat <- NormalizeData(seurat)
通常,NormalizeData
函數(shù)中有幾個(gè)參數(shù)可以設(shè)置,但大多數(shù)時(shí)候使用默認(rèn)設(shè)置就足夠了。
4. 特征選擇
與批量RNA-seq相比,單細(xì)胞RNA-seq的最大優(yōu)勢(shì)在于其能夠探究樣本的細(xì)胞異質(zhì)性,即通過(guò)識(shí)別具有獨(dú)特分子特征的細(xì)胞群體。然而,并非所有基因在識(shí)別不同細(xì)胞群體時(shí)都具有同等的信息量和貢獻(xiàn)。例如,表達(dá)水平低的基因以及在所有細(xì)胞中表達(dá)水平相似的基因,它們提供的信息量較少,可能會(huì)模糊不同細(xì)胞群體之間的差異。因此,在深入分析scRNA-seq數(shù)據(jù)之前,進(jìn)行恰當(dāng)?shù)奶卣鬟x擇是非常必要的。
在Seurat或者更廣泛地說(shuō),在單細(xì)胞RNA-seq數(shù)據(jù)分析中,這一步通常涉及到識(shí)別表達(dá)水平在細(xì)胞間變化最大的高變異性特征/基因。
seurat <- FindVariableFeatures(seurat, nfeatures = 3000)
通常,Seurat 會(huì)計(jì)算每個(gè)基因在不同細(xì)胞中的標(biāo)準(zhǔn)化方差,并挑選出變異性最大的2000個(gè)基因作為高變異特征。你可以通過(guò)設(shè)置nfeatures
參數(shù)(例如,這里選擇了前3000個(gè)基因)來(lái)輕松調(diào)整高變異特征的數(shù)量。
關(guān)于應(yīng)該使用多少高變異特征,并沒(méi)有一個(gè)固定的標(biāo)準(zhǔn)。有時(shí)需要嘗試幾次,以確定哪個(gè)數(shù)量能夠提供最清晰和最容易解釋的結(jié)果。大多數(shù)情況下,選擇2000到5000之間的數(shù)值是合適的,而且使用不同的數(shù)值對(duì)結(jié)果的影響不會(huì)太大。
此外,你可以選擇在變量特征圖中展示這些結(jié)果,但這并不是必需的步驟。
top_features <- head(VariableFeatures(seurat), 20)
plot1 <- VariableFeaturePlot(seurat)
plot2 <- LabelPoints(plot = plot1, points = top_features, repel = TRUE)
plot1 + plot2
未完待續(xù),歡迎關(guān)注!
動(dòng)動(dòng)您發(fā)財(cái)?shù)男∈贮c(diǎn)個(gè)贊吧!歡迎轉(zhuǎn)發(fā)!
本文由mdnice多平臺(tái)發(fā)布