单细胞测序--Seurat(上)--创建对象和数据预处理
参考:https://zhuanlan.zhihu.com/p/134124866
需要这三个文件:
1)barcodes.tsv:样本中所有的细胞的条码。这文件会按照 matrix.tsv 的顺序来排列
[图片上传失败...(image-b39475-1621137785277)]
2)genes.tsv:参照 (reference name)会按照Ensembl、NCBI、UCSC网站而有所不同, gene symbol会与 matrix.tsv 的顺序一致。
3)matrix.mtx:包含 count matrix,行名与gene.tsv上的行名对应,列名与barcodes.tsv相对应。
Seurat 内的【Read10X()
】函数可以将上述三文件 raw data整合为一个稀疏矩阵 (sparse matrix) ,
1、加载数据 Load the PBMC dataset
pbmc.data <- Read10X(data.dir = "filtered_gene_bc_matrices/hg19/")
dim(pbmc.data)
[1] 32738 2700
pbmc <- CreateSeuratObject(counts = pbmc.data, project = "pbmc3k", min.cells = 3, min.features = 200)
参数 :
counts: 未标准化的数据,如原始计数或TPMs
project: 设置Seurat对象的项目名称;默认为"SeuratProject"
assay: 与初始输入数据对应的分析名称。
meta.data: 添加到Seurat对象的其他细胞水平(cell-level)数据。一个matrix,其中行是cell name,列是附加的元数据字段。
min.cells --该feature至少在n个细胞内被覆盖; 该基因(feature)至少在3个细胞中被检测到
min.features--规定了至少检测到这些feature的细胞。即检测到的基因至少有200个细胞才被用于分析
看看 pbmc 里面有啥
pbmc
An object of class Seurat
13714 features across 2700 samples within 1 assay
Active assay: RNA (13714 features, 0 variable features)
dim(pbmc) #行,列
[1] 13714 2700
head(pbmc@assays))
$RNA
Assay data with 13714 features for 2700 cells
First 10 features:
AL627309.1, AP006222.2, RP11-206L10.2, RP11-206L10.9,
LINC00115, NOC2L, KLHL17, PLEKHN1, RP11-54O7.17, HES4
head([email protected])) QC指标存储
orig.ident nCount_RNA nFeature_RNA
AAACATACAACCAC-1 pbmc3k 2419 779
AAACATTGAGCTAC-1 pbmc3k 4903 1352
AAACATTGATCAGC-1 pbmc3k 3147 1129
AAACCGTGCTTCCG-1 pbmc3k 2639 960
AAACCGTGTATGCG-1 pbmc3k 980 521
AAACGCACTGGTAC-1 pbmc3k 2163 781
head([email protected]))
[1] "RNA"
head([email protected]))
AAACATACAACCAC-1 AAACATTGAGCTAC-1 AAACATTGATCAGC-1 AAACCGTGCTTCCG-1
pbmc3k pbmc3k pbmc3k pbmc3k
AAACCGTGTATGCG-1 AAACGCACTGGTAC-1
pbmc3k pbmc3k
Levels: pbmc3k
[1] "pbmc3k"
head(rownames(pbmc))
[1] "AL627309.1" "AP006222.2" "RP11-206L10.2" "RP11-206L10.9"
[5] "LINC00115" "NOC2L"
head(colnames(pbmc))
[1] "AAACATACAACCAC-1" "AAACATTGAGCTAC-1" "AAACATTGATCAGC-1"
[4] "AAACCGTGCTTCCG-1" "AAACCGTGTATGCG-1" "AAACGCACTGGTAC-1"
2、标准的预处理流程 Standard pre-processing workflow
1)基于质量控制指标(QC metrics)和删除不需要的细胞作进一步分析:
Seurat允许根据任何用户定义的标准过滤单元格(cells)。
通常使用的QC指标:
-
每个细胞内被检测到特有的基因(****unique genes****)的数目,unique feature会因为数据质量而调整。
▲低质量的细胞或空的液滴一般含有较少的基因;
▲细胞双重态或多重态可能呈现异常高的基因count值
细胞内被监测到的分子的总数目(与unique genes高度相关)
-
匹配到线粒体基因组的read的百分比
▲低质量/将要死去的细胞经常呈现过度的线粒体污染情况;
▲使用function计算线粒体QC metrics, 此function可以计算源于feature集的count值的百分比
▲使用所有以【MT-】为起始的基因集合,作为线粒体基因集
数据质控
质控的参数主要有两个:
1.每个细胞测到的unique feature数目(unique feature代表一个细胞检测到的基因的数目,可以根据数据的质量进行调整)
2.每个细胞检测到的线粒体基因的比例,理论上线粒体基因组与核基因组相比,只占很小一部分。所以线粒体基因表达比例过高的细胞会被过滤。
(参考:https://zhuanlan.zhihu.com/p/145991506)
pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")
"[[" 操作符可以向对象元数据添加列
QC metrics 在 Seurat :head([email protected])) QC指标存储
▲过滤掉拥有 feature count>2500, or < 200 的细胞;
▲过滤掉含有> 5% 的线粒体 count值的细胞
使用 VlnPlot()进行可视化****(基因表达、指标、PC分数等)
nFeature RNA: 每个细胞所检测到的基因数目,也就是以前版本的nGene;
nCount RNA: 每个细胞测到所有基因的表达量之和,即这些基因数目一共测到的count数目,也就是以前版本的UMI数目;
percent.mt: 每个细胞所检测到的线粒体基因,即测到的线粒体基因的比例。
VlnPlot(pbmc, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)
FeatureScatter 一般用于可视化 feature-feature 关系,使用点图查看两个数据之间的相关性,也可以用于计算对象的任何东西,i.e. 对象数据中的列,PC分数等。
plot1 <- FeatureScatter(pbmc, feature1 = "nCount_RNA", feature2 = "percent.mt")
plot2 <- FeatureScatter(pbmc, feature1 = "nCount_RNA", feature2 = "nFeature_RNA")
plot1 + plot2
选择 200< gene 数目 <2500(根据violin图1) & 线粒体数目 <5%的细胞(根据violin图2)
pbmc <- subset(pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)
pbmc
An object of class Seurat
13714 features across 2638 samples within 1 assay #genes:13714, cells:2638
Active assay: RNA (13714 features, 0 variable features)
2)数据标准化Normalizing the data
在去除了数据集中不需要的细胞后,下一步就是标准化数据。默认设置下,使用全局-规模(global-scaling)的标准化方法 "LogNormalize",这方法按总体表达量,对每一个细胞的特征表达量(feature expression)进行标准化,乘以一个比例因子(****scale factor****)(默认为10,000),然后log转换此结果。
标准化后的值储存在【pbmc[["RNA"]]@data】。
pbmc <- NormalizeData(pbmc, normalization.method = "LogNormalize", scale.factor = 10000)
Performing log-normalization
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
高可变度基因的鉴定(基因的选择) Identification of highly variable features (feature selection)
下一步,计算数据集里面基因子集,该子集呈现出高度的细胞间变异(在有些细胞内高表达,在其他细胞内低表达)。还发现了专注在下游分析内的基因可帮助突出单细胞数据内的生物信号。
Seurat3 ,根据旧有版本升级了一下,通过使用【FindVariableFeatures
】函数,直接对单细胞数据中固有内的均值方差(mean-variance)的关系建模。在默认设置下,每个数据集返回2,000个feature。这些数据会被用于下游数据分析,如PCA。
pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000)
#鉴定前10个高度可变的基因 Identify the 10 most highly variable genes
top10 <- head(VariableFeatures(pbmc), 10)
top10
[1] "PPBP" "LYZ" "S100A9" "IGLL5" "GNLY" "FTL" "PF4" "FTH1"
[9] "GNG11" "S100A8"
#在有label或无label下,画出2000个高变异的基因
plot1 <- VariableFeaturePlot(pbmc)
plot2 <- LabelPoints(plot = plot1, points = top10, repel = TRUE)
plot1 + plot2
或
CombinePlots(plots = list(plot1, plot2))
对数据去中心化 Scaling the data
使用线性转换(缩放'scaling'),它是一个降维技巧(如PCA)的标准预处理步骤,
目的:所谓去中心化,就是将样本X中的每个观测值都减掉样本均值,这样做的好处是能够使得求解协方差矩阵变得更容易。(参考:https://www.jianshu.com/p/c2850302b644)
【ScaleData】函数:
▲转换每个基因的表达量,使得细胞之间的平均表达量为0;
▲按比例缩小每个基因的表达量,使得细胞之间的方差(variance)为1;
☼此步骤给予了下游分析的同等权重(equal weight),使得高表达基因不会占主要地位;
▲改结果会被储存在【pbmc[["RNA"]]@scale.data】
all.genes <- rownames(pbmc)
pbmc <- ScaleData****(pbmc, features = all.genes)
▶ 在【Seurat v2
】里面,可以使用【ScaleData】函数来去除单细胞数据集里面一些不需要的变量来源。例如,我们可以“退回(regress out)”与例如细胞周期阶段相关的异质性,或与线粒体污染相关的异质性。
pbmc <- ScaleData(pbmc, vars.to.regress = "percent.mt")
单细胞测序--Seurat(下)--线性降维、识别差异基因、分配细胞类型标识
1、先跑 PCA 进行线性降维 Perform linear dimensional reduction
Seurat 在识别细胞亚型时,先用 PCA 挑出几个贡献率最大的主成分,再用已选出的主成分分值来将进一步聚类分析,而非全部细胞一次性进行聚类分析。
pbmc <- RunPCA(pbmc, features = VariableFeatures(object = pbmc))
多种可视化 PCA 结果的方法 Examine and visualize PCA results a few different ways
(1)
print(pbmc[["pca"]], dims = 1:5, nfeatures = 5) #将其分为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
(2)
VizDimLoadings(pbmc, dims = 1:2, reduction = "pca") #将其分成两个主成分
(3)
DimPlot(pbmc, reduction = "pca")
(4)
可使用【DimHeatmap】对数据集内的异质性的主要数据作简单探索,在决定哪个PC可包含在内被用作下有分析时,此函数显得特别有用。细胞和feature根据PCA的打分值来设置。设置【cells】为一数值绘制出范围两端的“极端”细胞,这可显著地加速大数据集图表的绘制。尽管这是一监督算法分析,发现这仍是用于探索相关feature特征的有价值的工具。
DimHeatmap(pbmc, dims = 1, cells = 500, balanced = TRUE)
DimHeatmap(pbmc, dims = 1:15, cells = 500, balanced = TRUE)
2、评估最显著的主成分,决定数据集的维数 Determine the 'dimensionality' of the dataset
使用了受JackStraw 程序启发的重新取样测试( resampling test )。鉴定了“显著的”PC作为那些拥有低P-value特征的强有力的富集。
bmc <- JackStraw(pbmc, num.replicate = 100) #此步耗时较长
pbmc <- ScoreJackStraw(pbmc, dims = 1:20)
【JackStrawPlot】函数为每一个PC的P-value的分布与一均匀分布( uniform distribution)的对比提供了可视化的工具(虚线)。“显著的”PC会显示带有较低的P-value的特征的强富集(实线上的虚线)。在此情况下,在第一个10~12 PC之后,有一个显著的断崖式下降。
JackStrawPlot(pbmc, dims = 1:15)
可见下图前5个PC 与后5个PC显著分开,挑选 p-value < 0.05的主成分。
3、细胞的聚类分析 Cluster the cells
【FindNeighbors】函数将细胞距离矩阵分区为小聚群,将一图划分为高度互通的“quasi-cliques”或“communities”内。该函数将先前定义好的数据集(起初10个PC)的维度作为输入。
pbmc <- FindNeighbors(pbmc, dims = 1:10)
pbmc <- F****indClusters(pbmc, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Ec
Number of nodes: 2638
Number of edges: 96033
Running Louvain algorithm...
Maximum modularity in 10 random starts: 0.8720
Number of communities: 9
Elapsed time: 0 seconds
查看前五个聚类ID结果:
head(Idents(pbmc), 5)
AAACATACAACCAC-1 AAACATTGAGCTAC-1 AAACATTGATCAGC-1 AAACCGTGCTTCCG-1
1 3 1 2
AAACCGTGTATGCG-1
6
Levels: 0 1 2 3 4 5 6 7 8
4、UMAP/tSNE的非线性降维分析 Run non-linear dimensional reduction (UMAP/tSNE)
非线性多降维的技巧,如 tSNE 和 UMAP,用于可视化和探索这些数据集。它们将相似的细胞放置在低维度的空间,使用相同的 PC 作为聚类分群分析的它们输入数据。可设置 【label = TRUE】或【LabelClusters】函数帮助标记细胞群。
pbmc <- RunUMAP(pbmc, dims = 1:10)
DimPlot(pbmc, reduction = "umap")
5、识别差异表达的 marker 基因 Finding differentially expressed features (cluster biomarkers)
Seurat可寻找通过差异表达决定分群的 markers。【FindAllMarkers】函数自动化完成所有小集群的分组,你可以测试小集群的分组,或其他细胞与细胞之间的,或针对所有细胞的分组。【ident.1】函数鉴定了单一群落里面的阳性和阴性细胞(positive and negative markers)。
【min.pct】需要检测到两组之间最小的差异,这差异必须是存在一定量的差异表达。
找出 cluster1 中所有的marker
cluster1.markers <- FindMarkers(pbmc, 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
找出区别于cluster 0 和cluster 3 与c luster 5的所有标记
cluster5.markers <- FindMarkers(pbmc, 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的标记,仅汇报阳性细胞
pbmc.markers <- FindAllMarkers(pbmc, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
pbmc.markers %>% group_by(cluster) %>% top_n(n = 2, wt = avg_logFC) #管道符号
Registered S3 method overwritten by 'cli':
method from
print.boxx spatstat
A tibble: 18 x 7
Groups: cluster [9]
p_val avg_logFC pct.1 pct.2 p_val_adj cluster gene
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有多种微分表达式测试(tests for differential expression),可以在【test.use】参数内被设置。例如,ROC 测试会给任何独立的maker(范围由0-随机,到1-完美)返回一个“分类能力”。
cluster1.markers <- FindMarkers(pbmc, ident.1 = 0, logfc.threshold = 0.25, test.use = "roc", only.pos = TRUE)
【VlnPlot】显示了集群里面表达量的概率分布,【FeaturePlot】(可用于可视化 tSNE 或 PCA图的特征表达量)是最经常使用的可视化工具。建议探索【 RidgePlot】、
【CellScatter
】和【DotPlot
】 作为另一种方法来探索数据集。
VlnPlot(pbmc, features = c("MS4A1", "CD79A"))
使用 raw counts 画图
VlnPlot(pbmc, features = c("NKG7", "PF4"), slot = "counts****", log = TRUE)
FeaturePlot(pbmc, features = c("MS4A1", "GNLY", "CD3E", "CD14", "FCER1A", "FCGR3A", "LYZ", "PPBP",
"CD8A"))
【DoHeatmap】对给定的细胞和特征生成一热图。在本例子中,我们对每个集群画出前20个marker(如果marker量少于20就全部的画上)
top10 <- pbmc.markers %>% group_by(cluster) %>% top_n(n = 10, wt = avg_logFC)
DoHeatmap(pbmc, features = top10$gene) + NoLegend()
6、给cluster 分配细胞类型标识 Assigning cell type identity to clusters
使用规范 marker ,以便匹配无偏倚的聚类到已知的细胞类型。
names(new.cluster.ids) <- levels(pbmc)
pbmc <- RenameIdents(pbmc, new.cluster.ids)
DimPlot(pbmc, reduction = "umap", label = TRUE, pt.size = 0.5) + NoLegend()
saveRDS(pbmc, file = "../pbmc3k_final.rds")
参考:单细胞测序--Seurat(下)--线性降维、识别差异基因、分配细胞类型标识 · 语雀 (yuque.com)