Official release of Seurat 3.0的学习过程

2018年8月份的时候,我也使用过seurat来分析单细胞测序数据,然后最近也需要使用seurat包来分析实验室的单细胞测序数据,在R中安装完seurat的包后,我到网站上下载了pbmc3k_tutorial.Rmd的指导文件,下载下来按着这个markdown文件执行,发现好像跟我暑期的代码不大一样啊,然后我又返回到网站上重新看了下,发现原来是“On April 16, 2019 - we officially updated the Seurat CRAN repository to release 3.0!” 在2019年4月16的时候更新版本啦。好吧,R包更新的话,那么之前的代码就是以前的版本了,如果使用新的版本,那么代码就不能用,但是呢,原理是一样的,而且发现新版本更好用了,自己敲代码都少了哈哈哈。

一、总的分析流程

image.png

Note:自己的一个理解但是可能并不准确

二、具体的步骤

使用的数据是Seurat提供的pbmc_3k的10x单细胞数据,共有32738基因和2700x细胞

1.Setup the Seurat Object(创建Seurat对象)

library(dplyr)
library(Seurat)
rm(list = ls())
pbmc.data <- Read10X(data.dir = "~/seurat/filtered_gene_bc_matrices/hg19/")
# Initialize the Seurat object with the raw (non-normalized data).
pbmc <- CreateSeuratObject(counts = pbmc.data, project = "pbmc3k", min.cells = 3, min.features = 200) # gene:13714,cells:2700
#比较稀疏矩阵和普通矩阵使用的内存大小
dense.size <- object.size(x = as.matrix(x = pbmc.data))
dense.size
sparse.size <- object.size(x = pbmc.data)
sparse.size
dense.size / sparse.size

1)先是用Read10x读入数据,10xGenomics得到的数据是用稀疏矩阵存放的,因为单细胞数据又很多0,也就是很多未检测到的数据,稀疏矩阵存放的话可以节省内存
2)接着用CreateSeuratObject创建Seurat对象,min.cells = 3, min.features = 200筛选的条件是min.cells = 3基因至少在3个细胞中表达, min.features=200,每个细胞中至少表达200个基因

2.Standard pre-processing workflow(数据预处理流程)

可以分为四个部分:

  • Selection and filtration of the cells based on the QC metrics 基于QC的结果选择和过滤细胞
  • Data normalization 数据标准化
  • scaling 量化(中心化)
  • Detection of the highly variable feature 高变异基因的检测

(1)Selection and filtration of the cells based on the QC metrics 基于QC的结果选择和过滤细胞

1)QC的标准

  • The number of unique genes detected in each cell 每个细胞中的唯一基因的数目
  • Similarly, the total number of molecules detected within a cell (correlates strongly with unique genes) 每个细胞中的UMI数目
  • The percentage of reads that map to the mitochondrial genome 比对到线粒体基因中的read数的百分比(因为低质量/将死的细胞通常表现出广泛的线粒体污染)

2)代码实现

pbmc[["percent.mt"]] <- PercentageFeatureSet(object = pbmc, pattern = "^MT-") #线粒体基因以MT开头的选择出来
##nFeature_RNA就是每个细胞检测到的基因数目;nCount_RNA就是这些基因数目一共测到的count数目,也就是总的UMI数目;percent.mt(使用'PercentageFeatureSet`函数计算线粒体QC指标,该函数计算源自一组特征的计数百分比)
# Show QC metrics for the first 5 cells
head(x = pbmc@meta.data, 5)

#Visualize QC metrics as a violin plot 用小提琴图可视化QC特征
VlnPlot(object = pbmc, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3) 

# FeatureScatter is typically used to visualize feature-feature relationships, but can be used for anything calculated by the object, i.e. columns in object metadata, PC scores etc.
# FeatureScatter通常用于可视化特征 - 特征关系

plot1 <- FeatureScatter(object = pbmc, feature1 = "nCount_RNA", feature2 = "percent.mt") 
plot2 <- FeatureScatter(object = pbmc, feature1 = "nCount_RNA", feature2 = "nFeature_RNA") 
CombinePlots(plots = list(plot1,plot2))
#选择gene数目小于2500 以及大于200 以及 线粒体数目小于5%的细胞 #可以基于violin图来选择你要卡的阈值
#过滤完之后还剩余 genes:13714,cells:2638
pbmc <- subset(x = pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)

3)结果

image.png

image.png

4)解释

对于小提琴图的几个参数的解释:nFeature_RNA就是每个细胞检测到的基因数目,就是以前版本的nGene;nCount_RNA就是这些基因数目一共测到的count数目,也就是以前版本的UMI数目;percent.mt(使用'PercentageFeatureSet`函数计算线粒体QC指标,该函数计算源自一组特征的计数百分比)。
对于QC标准的选择:根据小提琴图中的总的基因数目的分布以及线粒体所占的百分比,比如这边大多数基因落在200-2500之间,线粒体所占百分比小于5%这些是要保留下来的。

(2)数据标准化

1)对于数据标准化的理解

其实原先我已经忘了数据标准化是干啥的了,我搞不明白为什么要用Log转化,与我们的FPKM有什么区别,之后到网上去看了下,发现数据标准化消除数据量纲之间的不同;消除数量级之间差别很大;避免数值问题:太大的数会引发数值问题;平衡各特征的贡献;一些模型求解的需要:加快了梯度下降求最优解的速度等需要
Seurat: 从数据集中删除不需要的cell后,下一步是标准化数据。 默认情况下,Seurat采用全局标准化方法“LogNormalize”,通过总表达式对每个cell的表达值进行标准化,将其乘以比例因子(默认为10,000),并对结果进行对数转换。 归一化值存储在pbmc [[“RNA”]] @ data中。

2)代码实现

#使用log转化,度量单位是10000
pbmc <- NormalizeData(object = pbmc, normalization.method = "LogNormalize", scale.factor = 1e4)

(3)Identification of highly variable features (feature selection) 识别高度变异基因(特征选择的过程)

1)解释

seurat: a subset of features that exhibit high cell-to-cell variation in the dataset 在数据集中表现出细胞间高变异的特征子集

2)代码实现

pbmc <- FindVariableFeatures(object = pbmc,selection.method = 'vst', nfeatures = 2000)
# Identify the 10 most highly variable genes 取前十个变化最大的基因
top10 <- head(x = VariableFeatures(object = pbmc), 10)
# plot variable features with and without labels 画出2000个高变异基因
plot1 <- VariableFeaturePlot(object = pbmc)
plot2 <- LabelPoints(plot = plot1, points = top10, repel = TRUE)
CombinePlots(plots = list(plot1, plot2))

3) 结果展示

高变异基因

4)解释

q其实我不是很理解这边的高变异基因和差异基因的区别,变异基因是说在每个细胞之间变异比较大的基因吗?其实不是很理解,这边是什么意思,而且我觉得变异最大的基因会不会是系统误差导致的呢,并不是真正的生物学变异。我对这步选择高变异基因认为是在做特征选择的过程,选出变异比较大的基因用于后续分析。

(4)Scaling 中心化

1)理解

应用线性变换('缩放'),这是在PCA等降维技术之前的标准预处理步骤(目的:所谓去中心化,就是将样本X中的每个观测值都减掉样本均值,这样做的好处是能够使得求解协方差矩阵变得更容易。)。 ScaleData函数
该步骤在下游分析中给予相同的权重,因此高表达的基因不占优势

2)代码

all.genes <- rownames(x = pbmc)
pbmc <- ScaleData(object = pbmc, features = all.genes)
#- `ScaleData` function to remove unwanted sources of variation from a single-cell dataset, 比如mitochondrial contamination线粒体污染
pbmc <- ScaleData(object = pbmc, vars.to.regress = 'percent.mt')

3)结果展示

image.png

3.Perform linear dimensional reduction线性降维 + Cluster the cells 对细胞进行聚类分析

(1) 线性降维:主成分分析

1)代码实现
#接下来,我们对中心化的数据执行PCA。 默认情况下,只有先前确定的变量要素用作输入,但如果要选择其他子集,则可以使用`features`参数定义。
pbmc <- RunPCA(object = pbmc, features = VariableFeatures(object = pbmc))

# Examine and visualize PCA results a few different ways
print(x = pbmc[['pca']], dims = 1:5, nfeatures = 5)
VizDimLoadings(object = pbmc, dims = 1:2, reduction = 'pca')
DimPlot(object = pbmc, reduction = 'pca') #每个细胞在PC1 和 PC2中的位置图
# Doheatmap 画热图
DimHeatmap(object = pbmc, dims = 1, cells = 500, balanced = TRUE) #可以选择所要呈现的细胞数目
DimHeatmap(object = pbmc, dims = 1:3, cells = 500, balanced = TRUE) 
# Determine the 'dimensionality' of the dataset 决定选取多少主成分
# 使用jackStraw方法 来估计多少主成分比较合适
# We identify 'significant' PCs as those who have a strong enrichment of low p-value features. 显著的主成分是强烈富集 低P值的特征
pbmc <- JackStraw(object = pbmc, num.replicate = 100)
pbmc <- ScoreJackStraw(object = pbmc, dims = 1:20)
# JackStrawplot
JackStrawPlot(object = pbmc, dims = 1:15) #JackStrawPlot功能提供了一个可视化工具,用于比较每个PC的p值分布和均匀分布
# 碎石图
ElbowPlot(object = pbmc) #基于每一个解释的方差百分比(“ElbowPlot”函数)对主成分进行排序
2)结果展示
VizDimLoadings

DimPlot

heatmap

heatmap

JackStrawPlot

image.png
3)PCA中RunPCA时遇到的坑
pbmc <- RunPCA(object = pbmc, features = VariableFeatures(object = pbmc))
Error in irlba(A = t(x = object), nv = npcs, ...) : 
  max(nu, nv) must be strictly less than min(nrow(A), ncol(A))
image.png

心中纳闷啊,为啥报错啊,然后打开RunPCA的帮助文档


RunPCA

发现是npcs的选择是默认为50的。而我的矩阵是2000基因*24细胞的矩阵。我心中纳闷,我不是有2000个基因可以供选择吗?怎么我选取个主成分等于50就不行嘛?后来明白了PC的选择是小于你给的矩阵的行数或列数中的最小值的。因为PC计算过程是要计算奇异矩阵的,然后奇异矩阵是个对称矩阵哦。


image.png

(2)Cluster the cells 对细胞进行聚类分析

1)理解
  • 在这里是对数据降维后在聚类,这里使用的是KNN聚类方法
  • 与PhenoGraph一样,我们首先根据PCA空间中的欧氏距离构建KNN图,并根据其局部邻域中的共享重叠(Jaccard相似性)细化任意两个单元之间的边权重。 此步骤使用FindNeighbors函数执行,并将先前定义的数据集维度(前10个PC)作为输入。
  • FindClusters函数实现了此过程,并包含一个分辨率参数,用于设置下游群集的“簇数目”,增加的值会导致更多的簇。
  • 对于大约3000数目的单细胞数据集,我们发现将此参数设置在0.4-1.2之间结果较为良好。 较大的数据集通常会增加最佳分辨率。 可以使用Idents函数找到簇。

2)代码

pbmc <- FindNeighbors(object = pbmc, dims = 1:10)
pbmc <- FindClusters(object = pbmc, resolution = 0.5)
# Look at cluster IDs of the first 5 cells
head(x = Idents(object = pbmc), 5)

3)结果

The first 5 cells

4.Run non-linear dimensional reduction (UMAP/tSNE) 非线性降维: tSNE and UMAP

1)理解

  • The goal of these algorithms is to learn the underlying manifold of the data in order to place similar cells together in low-dimensional space.
    -算法的目的:了解数据的多样性,以便在低维空间中将相似的细胞放在一起
  • 作为UMAP和tSNE的输入,我们建议使用相同的PC作为聚类分析的输入。
  • 降维有助于数据可视化
  • UMAP(Uniform Manifold Approximation and Projection)是一种用于降维的新型流形学习技术。 UMAP由基于黎曼几何和代数拓扑的理论框架构成。 结果是适用于现实世界数据的实用可扩展算法。 UMAP算法与t-SNE竞争可视化质量,并且可以保留更多的全局结构,具有出色的运行时性能。 此外,UMAP对嵌入维度没有计算限制,使其可用作机器学习的通用降维技术

UMAP(https://github.com/lmcinnes/umap)

2)代码实现

reticulate::py_install(packages = "umap-learn") #安装UMAP
# UMAP
pbmc <- RunUMAP(object = pbmc, dims = 1:10)
DimPlot(object = pbmc, reduction = 'umap',label = TRUE )
# TSNE
pbmc <- RunTSNE(object = pbmc, dims = 1:10)
DimPlot(object = pbmc, reduction = 'tsne',label = TRUE )
# 您可以在此时保存对象,以便可以轻松地将其重新加载,而无需重新运行上面执行的计算密集型步骤,或者可以轻松地与协作者共享
saveRDS(pbmc, file = "G:/Ajitongjiuniversity/Bioinformatics/Single cell sequencing/scRNA_seq workflow/seurat/pbmc_tutorial.rds")

3)结果

UMAP图
TSNE图

4)收获

哈哈无意中指导了UMAP方法开心

5. Finding differentially expressed features 寻找差异表达的特征(聚类生物标志物)

1)理解

  • Seurat可以帮助您找到通过差异表达定义聚类的标记。
  • 默认情况下,它标识单个cluster的正marker和负marker(在ident.1中指定),与所有其他cluster进行比较。
  • FindAllMarkers为所有cluster自动执行此过程,但您也可以测试集群彼此之间或所有cluster。
  • FindAllMarkers参数:min.pct参数在两组cluster中的任意一组中以最小百分比检测到特征;ident.1:用于定义标记的标识类;ident.2:用于和ident.1比较的标识类;logfc.threshold: Log FC的倍数值
  • FindAllMarkers(参数是test.use)中用于找两个cluster之间的差异基因的方法有:wilcox(默认);bimod;roc;t;negbinom;poisson;LR;MAST;DESeq2
  • %>% R中的管道传输函数

2)代码实现

#- (1)找出所有cluster中的marker
# find all markers of cluster 1 找出cluster1 的所有marker
cluster1.markers <- FindMarkers(object = pbmc, ident.1 = 1, min.pct = 0.25)
head(x = cluster1.markers, n = 5)
# find all markers distinguishing cluster 5 from clusters 0 and 3 找到cluster 5 和cluster(0,3)比较的所有marker
cluster5.markers <- FindMarkers(object = pbmc, ident.1 = 5, ident.2 = c(0, 3), min.pct = 0.25)
head(x = cluster5.markers, n = 5)
# find markers for every cluster compared to all remaining cells, report only the positive ones 找所有cluster的marker
pbmc.markers <- FindAllMarkers(object = pbmc, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
pbmc.markers %>% group_by(cluster) %>% top_n(n = 2, wt = avg_logFC) #将pbmc.markers传给group_by,group_by按cluster 排序,再将结果传给top_n,top_n按avg_logFC排序,显示每个类中的前两个

#- (2)可视化这些marker在这些集群中的表达情况

#--1)用VlnPlot(显示跨集群的表达概率分布)
#--2)FeaturePlot(在tSNE或PCA图上可视化特征表达)这两种是比较常用的
#--3)还可以用`RidgePlot`,`CellScatter`和`DotPlot`这几种方法查看数据集情况

# VlnPlot
VlnPlot(object = pbmc, features = c("MS4A1", "CD79A"))
# you can plot raw counts as well
VlnPlot(object = pbmc, features = c("NKG7", "PF4"), slot = 'counts', log = TRUE)

# FeaturePlot
FeaturePlot(object = pbmc, features = c("MS4A1", "GNLY", "CD3E", "CD14", "FCER1A", "FCGR3A", "LYZ", "PPBP", "CD8A"))

#RidgePlot
RidgePlot(object = pbmc, features = c("MS4A1", "CD79A"))

#CellScatter
CellScatter(object = pbmc, features = c("MS4A1", "GNLY", "CD3E", "CD14", "FCER1A", "FCGR3A", "LYZ", "PPBP", "CD8A"),cell1 = "CATTACACGGAGTG", cell2 = "CATTACACCAACTG")

# DotPlot
DotPlot(object = pbmc, features = c("MS4A1", "CD79A"))

# DoHeatmap 热图

# 观察每个cluster中的TOP10的基因在每个cluster中的表达情况
pbmc.markers %>% group_by(cluster) %>% top_n(n = 10, wt = avg_logFC) -> top10
DoHeatmap(object = pbmc, features = top10$gene) + NoLegend()

3)结果

VlnPlot 图1

VlnPlot 图2

FeaturePlot

RidgePlot

CellScatter

DotPlot

DoHeatmap

6.Assigning cell type identity to clusters 鉴定每个cluster的身份

(1)使用经典的marker

1)代码实现

#我们可以使用经典的标记轻松地将无偏聚类与已知细胞类型相匹配
new.cluster.ids <- c("Memory CD4 T", "CD14+ Mono", "Naive CD4 T", "B", "CD8 T", "FCGR3A+ Mono", "NK", "DC", "Mk")
names(x = new.cluster.ids) <- levels(x = pbmc)
pbmc <- RenameIdents(object = pbmc, new.cluster.ids)
DimPlot(object = pbmc, reduction = 'umap', label = TRUE, pt.size = 0.5) + NoLegend()

library(ggplot2)
plot <- DimPlot(object = pbmc, reduction = "umap", label = TRUE, label.size = 4.5) + xlab("UMAP 1") + ylab("UMAP 2") + 
  theme(axis.title = element_text(size = 18), legend.text = element_text(size = 18)) + 
  guides(colour = guide_legend(override.aes = list(size = 10)))
ggsave(filename = "G:/Ajitongjiuniversity/Bioinformatics/Single cell sequencing/scRNA_seq workflow/seurat/pbmc3k_umap.png", height = 7, width = 12, plot = plot)
saveRDS(pbmc, file = "G:/Ajitongjiuniversity/Bioinformatics/Single cell sequencing/scRNA_seq workflow/seurat/pbmc_tutorial.rds")

2)结果展示

Dimplot 好漂亮

(2)全自动细胞注释-SingleR(暂未跑通)

7.总结

  • 今天下午13.30到晚上20.26的收获吧,算是把seurat搞清楚了,比之前刚用得时候清楚。
  • 收获的点在于:再写一遍笔记的时候会比较着急,我自己是用notepaid写了一遍了,然后想着用简书也整理一遍,才发现原来自己很着急哦,很多笔记都是直接copy自己写在notepaid中的,希望自己下次能够把简书和Notepaid同步起来,开心
  • 不理解的地方:高度变异基因和差异基因的区别?还有SingleR是如何注释的还是需要搞清楚,这个还是很有用的
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容