Seurat standard pipeline(10核心流程)
創建Seurat對象 Read10X CreateSeuratObjecet
質控 PercentageFeatureSubject subset
標準化Normalization NormalizeData
高變基因選擇 FindVariableFeatures
數據縮放 ScaleData
線性降維 RunPCA
維數選擇 FindNeighbors
細胞聚類 FindClusters
非線性降維(UMAP/tSNE)RunUMAP
DimPlot
鑒定差異表達特征(cluster markers)
細胞注釋 CellMarker---FeaturePlot
---RenameIdents
下載示例數據:
Peripheral Blood Mononuclear Cells (PBMC) 是10X Genomics dataset page提供的一個數據,包含2700個單細胞,出自Illumina NextSeq 500平臺。
PBMCs是來自健康供體具有相對少量RNA(around 1pg RNA/cell)的原代細胞。在Illumina NextSeq 500平臺,檢測到2700個單細胞,每個細胞獲得69000 reads。
tar -xvf pbmc3k_filtered_gene_bc_matrices.tar
文件夾下包含3個文件
barcodes.tsv
genes.tsv
matrix.mtx
一、創建 Seurat 分析對象
1.1 Read10X() 函數可以自動讀入和解析數據
library(dplyr)
library(Seurat)
library(patchwork)
#讀取PBMC數據
pbmc.data <- Read10X(data.dir = "./filtered_gene_bc_matrices/hg19/")
#查看數據
dim(pbmc.data)
# 32738 2700
pbmc.data[c("CD3D", "TCL1A", "MS4A1"), 1:30]
# 3 x 30 sparse Matrix of class "dgCMatrix"
# CD3D 4 . 10 . . 1 2 3 1 . . 2 7 1 . . 1 3 . 2 3 . . . . . 3 4 1 5
# TCL1A . . . . . . . . 1 . . . . . . . . . . . . 1 . . . . . . . .
# MS4A1 . 6 . . . . . . 1 1 1 . . . . . . . . . 36 1 2 . . 2 . . . .
#.表示0
summary(colSums(pbmc.data))
# Min. 1st Qu. Median Mean 3rd Qu. Max.
# 548 1758 2197 2367 2763 15844
查看每個細胞有多少基因被檢測到
at_least_one <- apply(pbmc.data, 2, function(x) sum(x>0))
hist(at_least_one, breaks = 100,
main = "Distribution of detected genes",
xlab = "Genes with at least one tag")
hist(colSums(pbmc.data), breaks = 100,
main = "Expression sum per cell",
xlab = "Sum expression")
1.2 pbmc 數據初始化 Seurat 對象
使用 CreateSeuratObject 創建對象。
sce<- CreateSeuratObject(counts = pbmc.data, project = "pbmc3k", min.cells = 3, min.features = 200)
sce
# An object of class Seurat
# 13714 features across 2700 samples within 1 assay
# Active assay: RNA (13714 features, 0 variable features)
head(sce$RNA@data[,1:5])
6 x 5 sparse Matrix of class "dgCMatrix"
AAACATACAACCAC-1 AAACATTGAGCTAC-1 AAACATTGATCAGC-1 AAACCGTGCTTCCG-1 AAACCGTGTATGCG-1
AL627309.1 . . . . .
AP006222.2 . . . . .
RP11-206L10.2 . . . . .
RP11-206L10.9 . . . . .
LINC00115 . . . . .
NOC2L . . . . .
#過濾檢測
min.features = 200:一個細胞最少要檢測到200個基因,
min.cells = 3:一個基因最少得在4個細胞中表達
其他參數解釋
-
counts
:未標準化的數據,如原始計數或TPMs -
project = "CreateSeuratObject"
:設置Seurat對象的項目名稱 -
assay = "RNA"
:與初始輸入數據對應的分析名稱 -
names.field = 1
:對于每個cell的初始標識類,從cell的名稱中選擇此字段。例如,如果cell在輸入矩陣中被命名為BARCODE_CLUSTER_CELLTYPE,則設置名稱。字段設置為3以將初始標識設置為 #CELLTYPE。 -
names.delim = "_"
:對于每個cell的初始標識類,從cell的列名中選擇此分隔符。例如,如果cell命名為bar - cluster - celltype,則將此設置為“-”,以便將cell名稱分離到其組成部分中,以選擇相關字段。 -
meta.data = NULL
:要添加到Seurat對象的其他單元級元數據。應該是data.frame,其中行是單元格名稱,列 #是附加的元數據字段。
這里還涉及到的知識點是R data中的S3類和S4類。
list一般情況下被認為是S3類,S4是指使用slots儲存數據的格式。
> sce
An object of class Seurat
13714 features across 2700 samples within 1 assay
Active assay: RNA (13714 features, 0 variable features)
#1個數據集,包含2700個細胞,13714個基因。
.
在矩陣中的值表示0(未檢測到分子)。
由于scRNA-seq矩陣中的大多數值為0,因此Seurat在任何可能的情況下都使用稀疏矩陣表示。這為Drop-seq/inDrop/10x數據節省了大量內存和速度。
所謂稀疏矩陣,也就是在矩陣中,若數值為0的元素數目遠多于非0元素的數目,并且非0元素分布沒有規律時,則稱該矩陣為稀疏矩陣;與之相反,若非0元素數目占大多數時,則稱該矩陣為稠密矩陣。
二、數據預處理
這部分是基于數據質控方法,標準化和檢測到的變化基因對數據進行篩選。
1. 對細胞的質控 subset()
可以參考文章:Classification of low quality cells from single-cell RNA-seq data
常用的質控指標:
(1)每個細胞在檢測到的特異基因數
- 低質量的細胞以及空泡油滴中一般檢測到很少的基因
- 包含多個細胞的油滴會檢測到異常多的基因
(2)每個細胞檢測到的分子總數(與基因密切相關)
(3)每個細胞的線粒體基因比例。低質量/瀕死細胞常表現出廣泛的線粒體污染
使用PercentageFeatureSet()
函數計算線粒體QC指標,使用所有以MT-開頭的基因作為一組線粒體基因
(1)線粒體基因占比計算
PercentageFeatureSet()參數意義:
pattern = "^MT-"為正則表達式寫法,意為匹配"MT-"開頭的基因,即線粒體基因。區分MT大小寫,此處如果小寫則代表另一個物種。
為什么將線粒體基因作為一個過濾條件?“因為線粒體是參與細胞凋亡啟動和執行的主要細胞器之一。線粒體基因高表達意為著樣品質量差,導致大量細胞凋亡或裂解。以及特定樣本的生物學,例如腫瘤活檢,可能由于代謝活動和/或壞死而增加線粒體基因表達。對于線粒體基因比例過高的細胞,會干擾細胞分群,在分析過程中為了避免這些細胞的影響,通常會根據實際情況設計一個閾值進行細胞的過濾
###向 sce 新增一列 percent.mt 數據
sce[['percent.mt']] <- PercentageFeatureSet(sce,pattern='^MT-')
#展示前5個細胞的QC指標
head(sce@meta.data, 5)
orig.ident nCount_RNA nFeature_RNA percent.mt
AAACATACAACCAC-1 pbmc3k 2419 779 3.0177759
AAACATTGAGCTAC-1 pbmc3k 4903 1352 3.7935958
AAACATTGATCAGC-1 pbmc3k 3147 1129 0.8897363
AAACCGTGCTTCCG-1 pbmc3k 2639 960 1.7430845
AAACCGTGTATGCG-1 pbmc3k 980 521 1.2244898
QC指標儲存在哪?
每個細胞基因數和總分子數在建立seurat對象時就已經自動計算好了。
可以使用sce@meta.data$percent.mt
或者 sce['percent.mt']
查看每個細胞的線粒體比例
(2)畫圖查看基因數目, UMI數目, 線粒體基因占比
# 使用小提琴圖可視化QC指標
VlnPlot(sce,
features = c("nFeature_RNA", "nCount_RNA", "percent.mt"),
ncol = 3)
nFeature_RNA: 代表每個細胞測到的基因數目。
nCount_RNA :代表每個細胞測到所有基因的表達量之和。
percent.mt:代表測到的線粒體基因的比例
(3)查看基因數目, 線粒體基因占比與UMI數目的關系
FeatureScatter通常用于可視化 feature-feature 相關性,
#nCount_RNA 與 percent.mt的相關性
plot1 <- FeatureScatter(sce,
feature1 = "nCount_RNA",
feature2 = "percent.mt")
#nCount_RNA 與 nFeature_RNA的相關性
plot2 <- FeatureScatter(sce,
feature1 = "nCount_RNA",
feature2 = "nFeature_RNA")
plot1 + plot2 #合并兩圖
拿 nCounts_RNA 與 nFeature_RNA 的散點圖(scatter)來說:
- 每個點代表一個細胞,斜率代表隨著count的增加gene的增加程度。
- count和gene一般呈現線性關系,斜率越大也就是較少的count就可以檢出較多的gene,說明這批細胞基因的豐度偏低(普遍貧窮);反之,斜率較小,說明這批細胞基因豐度較高(少數富有)。
- 有的時候不是一條可擬合的線,或者是兩條可擬合的線,也反映出細胞的異質性。
- 總之,他就是一個散點圖,描述的是兩個變量的關系**。
過濾線粒體基因表達比例過高的細胞,和一些極值細胞(可以根據小提琴圖判斷,查看兩端離群值)。
(4)質控 subset()
sce<- subset(sce, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)
nCount_RNA:每個細胞的UMI數量
nFeature_RNA:每個細胞的基因數
選取 2500 > nFeature_RNA >200 和percent.mt < 5的數據
三、數據標準化 NormalizeData()
因為在測序之前會對抓取到的RNA進行PCR擴增,所以需要考慮文庫深度對測序的影響。例:細胞A中總reads數10,基因a的reads數為2;細胞B中總reads數1000,基因a的reads數為20。并不能說基因a在細胞B中表達量大于A,故需要進行標準化。所以需要對上一步得到的稀疏矩陣進行Normalize。
Normalize方式:每個細胞每個基因的特征計數除以該細胞(一列)的特征總計數,再乘以scale.factor(默認10,000),然后對結果進行log1p對數轉換(log1p=log(n+1))。標準化的數值存儲在sce[["RNA"]]@data中。
scale.factor = 10,000 的原因是
進行log轉換的原因是:
以bulk-rna-seq為例,用FPKM或者TPM繪制熱圖的時候,因為數值變化的范圍太過巨大,都需要進行一個log轉換,讓數據壓縮在一個區間內。其次,也是最重要的改變數據分布:測序數值本身不符合正態分布,log轉換能讓數據趨近于正態分布,以便于后續進一步分析
默認使用數據標準化方法是LogNormalize
, 每個細胞總的表達量都標準化到10000,然后log取對數;標準化后的數據保存在結果存放于sce[["RNA"]]@data
。,原始數保存在sce[["RNA"]]@counts
中
標準化前,每個細胞總的表達量
hist(colSums(sce$RNA@data),
breaks = 100,
main = "Total expression before normalisation",
xlab = "Sum of expression")
標準化
sce<- NormalizeData(sce,
normalization.method = "LogNormalize",
scale.factor = 10000)
Performing log-normalization
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
若所有調用的參數都是默認值,則可省去
sce <- NormalizeData(sce)
標準化后,每個細胞總的表達量
hist(colSums(sce$RNA@data),
breaks = 100,
main = "Total expression after normalisation",
xlab = "Sum of expression")
四、 鑒定高變基因 FindVariableFeatures()
接下來,鑒定在細胞間表達高度變化的基因 (即,它們在某些細胞中高表達,而在其他細胞中低表達)。后續研究需要集中于這部分基因這些基因有助于突出單細胞數據集中的生物信號。
用FindVariableFeatures()
函數實現,首先計算每一個基因的均值和方差,并且直接模擬其關系。默認返回2000個features 。這些將用于下游分析,如PCA。
高變基因方法選擇vst
1.使用loss(局部加權回歸)擬合平滑曲線模型
2.獲取模型計算的值作為y = var.exp值
3.var.standarlized = get variance after feature standardization: (每個基因-mena)/sd后取var(),注意sd=sqrt(var.exp)
4.按照var.standalized降序排列,取前n(比如2000)個基因作為高變基因
sce <- FindVariableFeatures(sce, selection.method = "vst", nfeatures = 2000)
Calculating gene variances
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
# 查看最高變的10個基因
top10 <- head(VariableFeatures(sce), 10)
#head(sce$RNA@var.features,10)
# "PPBP" "LYZ" "S100A9" "IGLL5" "GNLY" "FTL" "PF4" "FTH1" "GNG11" "S100A8"
# 畫出不帶標簽或帶標簽基因點圖
plot1 <- VariableFeaturePlot(sce)
plot2 <- LabelPoints(plot = plot1, points = top10, repel = TRUE)
plot1 + plot2
五、數據縮放(歸一化)
線性變換(“縮放”),是在PCA降維之前的一個標準預處理步驟。最終每個基因均值為0,方差為1。
ScaleData()函數功能:
- 轉換每個基因的表達值,使每個細胞的平均表達為0
- 轉換每個基因的表達值,使細胞間的方差為1
此步驟在下游分析中具有相同的權重,因此高表達的基因不會占主導地位
結果存儲在sce[["RNA"]]@scale.data
中
all.genes <- rownames(sce)
sce<- ScaleData(sce, features = all.genes)
Centering and scaling data matrix
|================================================================| 100%
做了 Normalize 還做 scale 的原因是:
normalize改變的是數據的分布,scale改變的是數據的范圍。
normalize是將偏態分布轉換成趨近于正態分布,sclae是將數據的分布限定在一個范圍內。
R語言的Z score計算是通過[scale()]函數求得,Seurat包中ScaleData()函數也基本參照了scale()函數的功能。
scale方法中的兩個參數:center和scale
- center和scale默認為真,即T或者TRUE
- center為真表示數據中心化:數據集中的各項數據減去數據集的均值。如有數據集1, 2, 3, 6, 3,其均值為3 那么中心化之后的數據集為1-3,2-3,3-3,6-3,3-3,即:-2,-1,0,3,0 *scale為真表示數據標準化:指中心化之后的數據在除以數據集的標準差,即數據集中的各項數據減去數據集的均值再除以數據集的標準差。如有數據集1, 2, 3, 6, 3,其均值為3,其標準差為1.87 那么標準化之后的數據集為(1-3)/1.87,(2-3)/1.87,(3-3)/1.87,(6-3)/1.87,(3-3)/1.87,即:-1.069,-0.535,0,1.604,0
Z score的概念是指原始數據距離均值有多少個標準差。當以標準差為單位進行測量時,Z score 衡量的是一個數值偏離總體均值以上或以下多少個標準差。如果原始數值高于均值,則 Z score得分為正,如果低于均值,則Z score為負。Z score其實是標準正態分布(Standard Normal Distribution),即平均值μ=0,標準差 σ=1 的正態分布。SND標準正態分布的直方圖如下所示:
六、線性降維
1、PCA
接下來,對縮放的數據執行PCA。默認情況下,只使用前面確定的變量特性作為輸入,但是如果想選擇不同的子集,可以使用features參數來定義(選擇高變基因)。
> sce <- RunPCA(sce,features = VariableFeatures(object = sce))
PC_ 1
Positive: CST3, TYROBP, LST1, AIF1, FTL, FTH1, LYZ, FCN1, S100A9, TYMP
FCER1G, CFD, LGALS1, S100A8, CTSS, LGALS2, SERPINA1, IFITM3, SPI1, CFP
PSAP, IFI30, SAT1, COTL1, S100A11, NPC2, GRN, LGALS3, GSTP1, PYCARD
Negative: MALAT1, LTB, IL32, IL7R, CD2, B2M, ACAP1, CD27, STK17A, CTSW
CD247, GIMAP5, AQP3, CCL5, SELL, TRAF3IP3, GZMA, MAL, CST7, ITM2A
MYC, GIMAP7, HOPX, BEX2, LDLRAP1, GZMK, ETS1, ZAP70, TNFAIP8, RIC3
PC_ 2
Positive: CD79A, MS4A1, TCL1A, HLA-DQA1, HLA-DQB1, HLA-DRA, LINC00926, CD79B, HLA-DRB1, CD74
HLA-DMA, HLA-DPB1, HLA-DQA2, CD37, HLA-DRB5, HLA-DMB, HLA-DPA1, FCRLA, HVCN1, LTB
BLNK, P2RX5, IGLL5, IRF8, SWAP70, ARHGAP24, FCGR2B, SMIM14, PPP1R14A, C16orf74
Negative: NKG7, PRF1, CST7, GZMB, GZMA, FGFBP2, CTSW, GNLY, B2M, SPON2
CCL4, GZMH, FCGR3A, CCL5, CD247, XCL2, CLIC3, AKR1C3, SRGN, HOPX
TTC38, APMAP, CTSC, S100A4, IGFBP7, ANXA1, ID2, IL32, XCL1, RHOC
PC_ 3
Positive: HLA-DQA1, CD79A, CD79B, HLA-DQB1, HLA-DPB1, HLA-DPA1, CD74, MS4A1, HLA-DRB1, HLA-DRA
HLA-DRB5, HLA-DQA2, TCL1A, LINC00926, HLA-DMB, HLA-DMA, CD37, HVCN1, FCRLA, IRF8
PLAC8, BLNK, MALAT1, SMIM14, PLD4, LAT2, IGLL5, P2RX5, SWAP70, FCGR2B
Negative: PPBP, PF4, SDPR, SPARC, GNG11, NRGN, GP9, RGS18, TUBB1, CLU
HIST1H2AC, AP001189.4, ITGA2B, CD9, TMEM40, PTCRA, CA2, ACRBP, MMD, TREML1
NGFRAP1, F13A1, SEPT5, RUFY1, TSC22D1, MPP1, CMTM5, RP11-367G6.3, MYL9, GP1BA
PC_ 4
Positive: HLA-DQA1, CD79B, CD79A, MS4A1, HLA-DQB1, CD74, HLA-DPB1, HIST1H2AC, PF4, TCL1A
SDPR, HLA-DPA1, HLA-DRB1, HLA-DQA2, HLA-DRA, PPBP, LINC00926, GNG11, HLA-DRB5, SPARC
GP9, AP001189.4, CA2, PTCRA, CD9, NRGN, RGS18, GZMB, CLU, TUBB1
Negative: VIM, IL7R, S100A6, IL32, S100A8, S100A4, GIMAP7, S100A10, S100A9, MAL
AQP3, CD2, CD14, FYB, LGALS2, GIMAP4, ANXA1, CD27, FCN1, RBP7
LYZ, S100A11, GIMAP5, MS4A6A, S100A12, FOLR3, TRABD2A, AIF1, IL8, IFI6
PC_ 5
Positive: GZMB, NKG7, S100A8, FGFBP2, GNLY, CCL4, CST7, PRF1, GZMA, SPON2
GZMH, S100A9, LGALS2, CCL3, CTSW, XCL2, CD14, CLIC3, S100A12, CCL5
RBP7, MS4A6A, GSTP1, FOLR3, IGFBP7, TYROBP, TTC38, AKR1C3, XCL1, HOPX
Negative: LTB, IL7R, CKB, VIM, MS4A7, AQP3, CYTIP, RP11-290F20.3, SIGLEC10, HMOX1
PTGES3, LILRB2, MAL, CD27, HN1, CD2, GDI2, ANXA5, CORO1B, TUBA1B
FAM110A, ATP1A1, TRADD, PPA1, CCDC109B, ABRACL, CTD-2006K23.1, WARS, VMO1, FYB
查看對每個主成分影響比較大的基因集
> print(sce [["pca"]], dims = 1:5, nfeatures = 5)
PC_ 1
Positive: CST3, TYROBP, LST1, AIF1, FTL
Negative: MALAT1, LTB, IL32, IL7R, CD2
PC_ 2
Positive: CD79A, MS4A1, TCL1A, HLA-DQA1, HLA-DQB1
Negative: NKG7, PRF1, CST7, GZMB, GZMA
PC_ 3
Positive: HLA-DQA1, CD79A, CD79B, HLA-DQB1, HLA-DPB1
Negative: PPBP, PF4, SDPR, SPARC, GNG11
PC_ 4
Positive: HLA-DQA1, CD79B, CD79A, MS4A1, HLA-DQB1
Negative: VIM, IL7R, S100A6, IL32, S100A8
PC_ 5
Positive: GZMB, NKG7, S100A8, FGFBP2, GNLY
Negative: LTB, IL7R, CKB, VIM, MS4A7
VizDimLoadings(sce , dims = 1:2, reduction = "pca")
VizDimReduction
, DimPlot
, 和 DimHeatmap
可以從基因或細胞角度可視化pca結果
可視化對每個主成分影響比較大的基因集
VizDimLoadings(sce, dims = 1:2, reduction = "pca")
DimPlot(sce , reduction = "pca")
DimHeatmap繪制基于單個主成分的熱圖,細胞和基因的排序都是基于他們的PCA分數。對于數據異質性的探索是很有幫助的,可以幫助用戶選擇哪些PC維度可以用于下一步的下游分析。
DimHeatmap(sce, dims = 1, cells = 500, balanced = TRUE) #1個PC 500個細胞
展示多個主成分
DimHeatmap(sce,dims = 1:15,cells = 500,balanced = TRUE) #15個PC
2、數據維度
主成分分析的原理非常簡單,概括來說就是選擇包含信息量大的維度(features),去除信息量少的“干擾”維度。所以這里會有個問題——如何知道保留幾個維度是最佳的呢?我們希望通過保留盡可能少的維度來留存盡可能多的信息。Seurat有兩種方法來確定維度。
JackStrawPlot()函數提供可視化方法,用于比較每一個主成分的p-value的分布,虛線是均勻分布;顯著的主成分富集有小p-Value基因,實線位于虛線左上方。下圖表明保留10個pca主成分用于后續分析是比較合理的。
JackStraw && Elboew plot
sce <- JackStraw(sce,num.replicate = 100)
sce <- ScoreJackStraw(sce,dims = 1:20)
> JackStrawPlot(sce,dims = 1:15)
Warning message:
Removed 23516 rows containing missing values (`geom_point()`).
主要看在哪個PC之后,顯著性大幅下降,也就是前多少個維度包含了大部分的樣本信息。可以看出,在10-12個PC之后,顯著性大幅下降,也就是前10-12個維度包含了大部分的樣本信息。
ElbowPlot(sce)
主要看PC在哪個附近有拐點(“elbow”),拐點表明大部分真實信號是在前多少個pc中捕獲的。
可以看出,PC9-10附近有一個拐點(“elbow”),這表明大部分真實信號是在前10個pc中捕獲的。
綜合以上方法,選擇10個主成成分作為參數用于后續分析。
啟發式評估方法生成一個Elbow plot圖。在圖中展示了每個主成分對數據方差的解釋情況(百分比表示),并進行排序。根據自己需要選擇主成分,圖中發現第9個主成分是一個拐點,后續的主成分(PC)變化都不大了。
注意:鑒別數據的真實維度不是件容易的事情;除了上面兩種方法,Serat官當文檔還建議將主成分(數據異質性的相關來源有關)與GSEA分析相結合。Dendritic cell 和 NK aficionados可能識別的基因與主成分 12 和 13相關,定義了罕見的免疫亞群 (i.e. MZB1 is a marker for plasmacytoid DCs)。如果不是事先知道的情況下,很難發現這些問題。
Serat官當文檔因此鼓勵用戶使用不同數量的PC(10、15,甚至50)重復下游分析。其實也將觀察到的,結果通常沒有顯著差異。因此,在選擇此參數時,可以盡量選大一點的維度,維度太小的話對結果會產生不好的影響。
七、 細胞聚類
Seurat v3 應用基于圖形的聚類方法,例如KNN方法。具有相似基因表達模式的細胞之間繪制邊緣,然后將他們劃分為一個內聯群體。
在PhenoGraph中,首先基于pca維度中(先前計算的pca數據)計算歐式距離(the euclidean distance),然后根據兩個細胞在局部的重合情況(Jaccard 相似系數)優化兩個細胞之間的邊緣權值。此步驟內置于FindNeighbors函數,輸入時先前確定的pc數據。
為了聚類細胞,接下來應用模塊化優化技術迭代將細胞聚集在一起。(the Louvain algorithm (default) or SLM [SLM, Blondel et al., Journal of Statistical Mechanics]),FindClusters
函數實現這一功能,其中需要注意resolution參數,該參數設置下游聚類分析的“granularity”,更大的resolution會導致更多的細胞類群。3000左右的細胞量,設置resolution為0.4-1.2是比較合適的。細胞數據集越大,需要更大的resolution參數, 會獲得更多的細胞聚類。
查看細胞屬于那個類群可以使用函數Idents。
> sce<- FindNeighbors(sce, dims = 1:10) #選取前10個主成分來分類細胞
Computing nearest neighbor graph
Computing SNN
> sce<- FindClusters(sce, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
Number of nodes: 2638
Number of edges: 95965
Running Louvain algorithm...
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8723
Number of communities: 9
Elapsed time: 0 seconds
#查看細胞屬于那個類群
head(Idents(sce), 5)
AAACATACAACCAC-1 AAACATTGAGCTAC-1 AAACATTGATCAGC-1 AAACCGTGCTTCCG-1 AAACCGTGTATGCG-1
0 3 2 5 6
Levels: 0 1 2 3 4 5 6 7 8
八、非線性降維(UMAP/tSNE)
Seurat 提供了一些非線性降維度分析的方法,如 tSNE 和 UMAP,以可視化和探索這些數據集;這一步使用的數據建議與聚類分析使用的pc維度一致。
# install UMAP: reticulate::py_install(packages ='umap-learn')
sce <- RunUMAP(sce,dims = 1:20)
DimPlot(sce,reduction = 'umap')
# 添加細胞類群 的標簽
DimPlot(sce,reduction = 'umap', label = TRUE)
LabelClusters(DimPlot(sce, reduction = "umap"),id = 'ident')
此時可以保存數據,方便下次直接導入數據修改圖形。
saveRDS(sce, file = "../output/pbmc_tutorial.rds")
九、找差異表達基因 ( 聚類標志cluster biomarkers )
利用 FindMarkers
命令,可以找到各個細胞類型中與其他類別的差異表達基因,作為該細胞類型的生物學標記基因。
-
ident.1
:設置待分析的細胞類別 -
min.pct
:設定在兩個細胞群中任何一個被檢測到的百分比,通過此設定不檢測很少表達基因來縮短程序運行時間。默認0.1。 -
thresh.test
:設定在兩個細胞群中基因差異表達量(平均)。可以設置為0 ,程序運行時間會更長。 -
max.cells.per.ident
:每個類群細胞抽樣設置;也可以縮短程序運行時間。通過降低每個類的采樣值,提高計算速度
# find all markers of cluster 1
cluster1.markers <- FindMarkers(sce, ident.1 = 1, min.pct = 0.25)
head(cluster1.markers, n = 5)
p_val avg_logFC pct.1 pct.2 p_val_adj
IL32 1.894810e-92 0.8373872 0.948 0.464 2.598542e-88
LTB 7.953303e-89 0.8921170 0.981 0.642 1.090716e-84
CD3D 1.655937e-70 0.6436286 0.919 0.431 2.270951e-66
IL7R 3.688893e-68 0.8147082 0.747 0.325 5.058947e-64
LDHB 2.292819e-67 0.6253110 0.950 0.613 3.144372e-63
# find all markers distinguishing cluster 5 from clusters 0 and 3
cluster5.markers <- FindMarkers(sce, ident.1 = 5, ident.2 = c(0, 3), min.pct = 0.25)
head(cluster5.markers, n = 5)
p_val avg_logFC pct.1 pct.2 p_val_adj
FCGR3A 7.583625e-209 2.963144 0.975 0.037 1.040018e-204
IFITM3 2.500844e-199 2.698187 0.975 0.046 3.429657e-195
CFD 1.763722e-195 2.362381 0.938 0.037 2.418768e-191
CD68 4.612171e-192 2.087366 0.926 0.036 6.325132e-188
RP11-290F20.3 1.846215e-188 1.886288 0.840 0.016 2.531900e-184
# 找出每個cluster的標記與所有剩余的細胞相比較,只報告陽性細胞
# find markers for every cluster compared to all remaining cells, report only the positive ones
sce.markers <- FindAllMarkers(sce, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
sce.markers %>% group_by(cluster) %>% top_n(n = 2, wt = avg_log2FC)
p_val avg_logFC pct.1 pct.2 p_val_adj cluster gene
<dbl> <dbl> <dbl> <dbl> <dbl> <fct> <chr>
1 1.96e-107 0.730 0.901 0.594 2.69e-103 0 LDHB
2 1.61e- 82 0.922 0.436 0.11 2.20e- 78 0 CCR7
3 7.95e- 89 0.892 0.981 0.642 1.09e- 84 1 LTB
4 1.85e- 60 0.859 0.422 0.11 2.54e- 56 1 AQP3
5 0\. 3.86 0.996 0.215 0\. 2 S100A9
6 0\. 3.80 0.975 0.121 0\. 2 S100A8
7 0\. 2.99 0.936 0.041 0\. 3 CD79A
8 9.48e-271 2.49 0.622 0.022 1.30e-266 3 TCL1A
9 2.96e-189 2.12 0.985 0.24 4.06e-185 4 CCL5
10 2.57e-158 2.05 0.587 0.059 3.52e-154 4 GZMK
11 3.51e-184 2.30 0.975 0.134 4.82e-180 5 FCGR3A
12 2.03e-125 2.14 1 0.315 2.78e-121 5 LST1
13 7.95e-269 3.35 0.961 0.068 1.09e-264 6 GZMB
14 3.13e-191 3.69 0.961 0.131 4.30e-187 6 GNLY
15 1.48e-220 2.68 0.812 0.011 2.03e-216 7 FCER1A
16 1.67e- 21 1.99 1 0.513 2.28e- 17 7 HLA-DPB1
17 7.73e-200 5.02 1 0.01 1.06e-195 8 PF4
18 3.68e-110 5.94 1 0.024 5.05e-106 8 PPBP
Seurat可以通過參數test.use設定檢驗差異表達的方法(詳情見 DE vignett)。
cluster1.markers <- FindMarkers(sce, ident.1 = 0, logfc.threshold = 0.25, test.use = "roc", only.pos = TRUE)
head(cluster1.markers, n = 5)
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s
myAUC avg_diff power avg_log2FC pct.1 pct.2
RPS12 0.824 0.5094804 0.648 0.7350248 1.000 0.991
RPS6 0.821 0.4712446 0.642 0.6798622 1.000 0.995
RPS27 0.819 0.4996079 0.638 0.7207819 0.999 0.992
RPL32 0.815 0.4238952 0.630 0.6115515 0.999 0.995
RPS14 0.808 0.4296946 0.616 0.6199183 1.000 0.994
FindAllMarkers()參數意義:
- only.pos = TRUE:只尋找上調的基因
- min.pct = 0.1:某基因在細胞中表達的細胞數占相應cluster細胞數最低10%
- logfc.threshold = 0.25 :fold change倍數為0.25
該函數是決速步,執行比較耗時。
有多種方法可視化標記基因的方法
- VlnPlot: 基于細胞類群的基因表達概率分布
- FeaturePlot:在tSNE 或 PCA圖中畫出基因表達情況
- RidgePlot,CellScatter,DotPlot
VlnPlot(sce, features = c("MS4A1", "CD79A"))
# you can plot raw counts as well
VlnPlot(sce, features = c("NKG7", "PF4"), slot = "counts", log = TRUE)
FeaturePlot(sce, features = c("MS4A1", "GNLY", "CD3E", "CD14", "FCER1A", "FCGR3A", "LYZ", "PPBP",
"CD8A"))
DoHeatmap為指定的細胞和基因花表達熱圖。每個類群默認展示top 10 標記基因。
#每個聚類前10個差異基因表達熱圖(如果小于10,則繪制所有標記)
top10 <- sce.markers %>% group_by(cluster) %>% top_n(n = 10, wt = avg_log2FC)
DoHeatmap(sce, features = top10$gene) + NoLegend()
十、鑒定細胞類型
數據集的 markers 可以通過查閱相關文獻及網站 (CellMarker) 人工注釋,或者利用singleR自動注釋。singleR 比較雞肋,最好的辦法目前還是查閱文件和cellmarker(http://biocc.hrbmu.edu.cn/CellMarker/)進行區分,比較考驗個人及課題組經驗及搜索能力。
比如研究多形性膠質母細胞瘤(GBM),下圖中的文獻給出了利用單細胞轉錄組測序確定膠質母細胞瘤中腫瘤、基質及免疫細胞亞群:通過scRNA測序確定了GBM中CD45-和CD45+細胞(即非免疫和免疫細胞群)。表達EGFR和iCre的簇定為腫瘤細胞。采取Johnson-Verhaak命名法標記EGFR+腫瘤簇。通過marker確定細胞類型,如Oligodendrocytes(Mog,Plp1),Microglia(P2ry12,Tmem119),Astrocytes(Aqp4),Perivascular macrophages(Cd163,Mrc1),cDC1(Xcr1)等。
那我們就可以根據文中的基因試一下:
FeaturePlot(sce,
features = c('MOG','PIP1','AQP4','CD163','P2RY12','TMEM119','XCR1'),
reduction = 'umap')
列表
Cluster ID Markers Cell Type
8 P2ry12 Microglia
十一、細胞注釋
Assigning cell type identity to clusters
根據已知細胞類型與基因標記的對應關系,可以為細胞類群找到對應的細胞類型。
Cluster ID | Markers | Cell Type |
---|---|---|
0 | IL7R, CCR7 | Naive CD4+ T |
1 | IL7R, S100A4 | Memory CD4+ |
2 | CD14, LYZ | CD14+ Mono |
3 | MS4A1 | B |
4 | CD8A | CD8+ T |
5 | FCGR3A, MS4A7 | FCGR3A+ Mono |
6 | GNLY, NKG7 | NK |
7 | FCER1A, CST3 | DC |
8 | PPBP | Platelet |
new.cluster.ids <- c("Naive CD4 T", "CD14+ Mono", "Memory CD4 T", "B", "CD8 T", "FCGR3A+ Mono",
"NK", "DC", "Platelet")
names(new.cluster.ids) <- levels(sce)
sce<- RenameIdents(sce, new.cluster.ids)
DimPlot(sce, reduction = "umap", label = TRUE, pt.size = 0.5) + NoLegend()
# 保存分析的結果
saveRDS(sce, file = "../output/sce_final.rds")
官網此部分介紹:
https://satijalab.org/seurat/articles/pbmc3k_tutorial.html
參考:
http://www.lxweimin.com/p/728125be7c53
http://www.lxweimin.com/p/5b26d7bc37b7
https://zhuanlan.zhihu.com/p/359020041
http://www.lxweimin.com/p/728125be7c53
http://www.lxweimin.com/nb/52917361
http://www.lxweimin.com/p/fef17a1babc2
Single cell