前言
自学生信半载有余,跌跌撞撞,不敢和大佬同称萌新,勉强算得上菜鸡。根据课题组进展,马上要接手一个单细胞课题,适逢jimmy老师在B站发布了《单细胞公开课2021》,结合课程以及公众号推文,上手了一下单细胞基础分析流程。 先说一下感悟吧:安装R包最为痛苦???,相同代码在不同版本的R包上运行结果可能不同。
以Seruat官方教程和数据为练习,地址:https://satijalab.org/seurat/articles/pbmc3k_tutorial.html, 那下面我们就开始吧。
首先在官网下载原始数据(方法如下)
image-20210603161643501
下载解压后得到如下3个文件,这3个文件就是分析要用的原始数据。
image-20210603162355112
基础分析流程
参考:可视化单细胞亚群的标记基因的5个方法
读取数据
这里非常感谢健明老师让我学会了使用project管理R代码,非常方便。将解压的文件拷贝到project根目录的data目录下。
代码语言:javascript复制## 魔幻清空
rm(list=ls())
## 加载R包
library(dplyr)
library(Seurat)
library(patchwork)
## 读取数据
pbmc.data <- Read10X(data.dir = "data/pbmc3k_filtered_gene_bc_matrices/filtered_gene_bc_matrices/hg19")
## 创建Seruat对象
pbmc <- CreateSeuratObject(counts = pbmc.data,
project = "pbmc3k",
min.cells = 3, # min.cell:每个feature至少在多少个细胞中表达(feature=gene)
min.features = 200) # min.features:每个细胞中至少有多少个feature被检测到
这个 pbmc
就是全部单细胞数据分析所需要的,查看变量pbmc
如下:
pbmc
# An object of class Seurat
# 13714 features across 2700 samples within 1 assay
# Active assay: RNA (13714 features, 0 variable features)
可见一共有13714个基因,2700个细胞。有了这个构建好的Seurat 对象,也可参考官网代码对数据进行探索(此处不再赘述),后续分析代码相对来说非常标准,如下:
数据质控
通常使用的QC指标:
- 每个细胞被检测到的unique genes数量(低质量的细胞或空的液滴含有unique genes较少;细胞双重态或多重态检测到异常高unique genes);
- 细胞内被检测到的features的总数目(与unique genes高度相关);
- 线粒体基因占比(低质量/将要死去的细胞经常出现线粒体基因占比过高)。
接下来,根据每个细胞线粒体基因占比、检测到的基因数进行简单的过滤。先计算细胞内线粒体基因占比,类似的核糖体基因(大多为RP开头)也可以这样计算,但是注意线粒体基因的MT-
,其中-
不能少,不然容易把别的基因也计算在内。
## 计算细胞中线粒体基因比例
pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")
## 使用小提琴图可视化QC指标
VlnPlot(pbmc, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)
image-20210603165510787
代码语言:javascript复制## FeatureScatter于可视化特征-特征关系
plot1 <- FeatureScatter(pbmc, feature1 = "nCount_RNA", feature2 = "percent.mt")
plot2 <- FeatureScatter(pbmc, feature1 = "nCount_RNA", feature2 = "nFeature_RNA")
plot1 plot2
image-20210603165839056
代码语言:javascript复制## 过滤
## 官方推荐过滤掉独特特征计数超过2500或小于200的细胞,或者过滤掉超过5%线粒体基因比例的细胞
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
# Active assay: RNA (13714 features, 0 variable features)
可见过滤掉了62个细胞,继续后续分析
数据标准化
各种组学的原始数据普遍存在数据量不统一,数据变化范围过大,数据变化幅度不统一等问题。各种测序数据的分析流程都要对原始数据进行“标准化”,以符合下游分析的需求,单细胞数据也不例外。
代码语言:javascript复制## 标准化
pbmc <- NormalizeData(pbmc, normalization.method = "LogNormalize", scale.factor = 1e4)
识别高变基因
高变基因:在一些细胞中表达高,另一些细胞中表达低的基因。单细胞表达矩阵为稀疏矩阵(很多0,且为了压缩文件大小,0用.表示),选高变基因可以找到包含信息最多的基因
代码语言:javascript复制pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000) #返回两千个高变基因
## 提取前10的高变基因
top10 <- head(VariableFeatures(pbmc), 10)
top10
# [1] "PPBP" "LYZ" "S100A9" "IGLL5" "GNLY" "FTL" "PF4" "FTH1" "GNG11" "S100A8"
## 展示高变基因
plot1 <- VariableFeaturePlot(pbmc)
plot2 <- LabelPoints(plot = plot1, points = top10, repel = TRUE)
plot1 plot2
image-20210603173533463
数据归一化
数据归一化是将每个基因在所有细胞中的均值变为0,方差标为1,即零-均值归一化(z-score归一化)。是组学数据常用的一种降维前处理方法。
代码语言:javascript复制pbmc <- ScaleData(pbmc, vars.to.regress = "percent.mt")
降维
PCA降维,默认使用前面2000个高变基因的scale矩阵用于降维。Run开头的函数降维,Find开头的函数聚类。resolution参数表达聚类的分辨率,值越大得到的cluster越多,对于3K细胞的单细胞数据0.4-1.2 通常会得到较好的结果。
代码语言:javascript复制pbmc <- RunPCA(pbmc, features = VariableFeatures(object = pbmc)) ##默认会输出5个主成分
pbmc <- FindNeighbors(pbmc, dims = 1:10)
pbmc <- FindClusters(pbmc, resolution = 0.5)
## 查看前5分析细胞聚类数ID
head(Idents(pbmc), 5)
# AAACATACAACCAC-1 AAACATTGAGCTAC-1 AAACATTGATCAGC-1 AAACCGTGCTTCCG-1 AAACCGTGTATGCG-1
# 3 2 8 4 3
# Levels: 0 1 2 3 4 5 6 7 8 9
## 查看每个类别多少个细胞
table(pbmc@meta.data$seurat_clusters)
# 0 1 2 3 4 5 6 7 8 9
# 598 483 345 324 300 214 159 106 96 13
上述结果可见,分为10类,由0-9,细胞数依次递减。
UMAP/tSNE可视化
降维可以将相似的细胞放置在低维度的空间
代码语言:javascript复制pbmc <- RunUMAP(pbmc, dims = 1:10)
p1 <- DimPlot(pbmc, reduction = "umap", label = T, label.size = 5)
pbmc <- RunTSNE(pbmc, dims = 1:10)
p2 <- DimPlot(pbmc, reduction = "tsne", label = T, label.size = 5)
p1 p2
image-20210604103226376
在umap图中,cluster之间的距离更明显,图形也更美观。
Marker鉴定细胞
根据生物学背景知识,将表达相应Marker基因的各个单细胞亚群的重命名,官网给出的marker基因和细胞对应关系如下所示,本人该部分生物学知识较浅,暂不深究,待后续深入了解。
image-20210604112303673
代码语言:javascript复制VlnPlot(pbmc, features = c("MS4A1", "CD79A")) #查看B细胞marker基因在不同聚类中表达情况
image-20210604104231005
可视化展示marker基因的坐标映射分布
代码语言:javascript复制FeaturePlot(pbmc, features = c("MS4A1", "GNLY", "CD3E",
"CD14", "FCER1A", "FCGR3A",
"LYZ", "PPBP", "CD8A"))
image-20210604104302335
上图结合UMAP可视化中的聚类对聚类重命名,会得到如下所示的分群情况。
代码语言:javascript复制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(pbmc)
pbmc <- RenameIdents(pbmc, new.cluster.ids)
DimPlot(pbmc, reduction = 'umap',
label = TRUE, pt.size = 0.5) NoLegend()
image-20210604104402113
这个时候有5个可视化方法选择,分别是:小提琴图,坐标映射图,峰峦图,气泡图,热图。代码参见可视化单细胞亚群的标记基因的5个方法
代码语言:javascript复制## 小提琴图
VlnPlot(pbmc, features = c("MS4A1", "CD79A"))
image-20210604110750655
代码语言:javascript复制## 坐标映射图
FeaturePlot(pbmc, features = c("MS4A1", "CD79A"))
image-20210604110931075
代码语言:javascript复制## 峰峦图
RidgePlot(pbmc, features = c("MS4A1", "CD79A"), ncol = 1)
image-20210604111025409
代码语言:javascript复制features= c('IL7R', 'CCR7','CD14', 'LYZ', 'IL7R', 'S100A4',"MS4A1", "CD8A",'FOXP3',
'FCGR3A', 'MS4A7', 'GNLY', 'NKG7',
'FCER1A', 'CST3','PPBP')
## 气泡图
DotPlot(pbmc, features = unique(features)) RotatedAxis()
image-20210604111130904
我个人比较喜欢这个气泡图,看的很清楚,也可以根据气泡图来重命名聚类名。
代码语言:javascript复制## 热图
DoHeatmap(subset(pbmc ), features = features, size = 3)
image-20210604111356852
代码语言:javascript复制save(pbmc,file = 'basic.sce.pbmc.Rdata') #保存用于后续分析
至此,单细胞基础流程分析就结束了。接下来根据健明老师解答的问题,来加深一下理解。特别是seurat对象的结构,在R语言中同一变量重复赋值,则会覆盖,而创建的Seruat对象pbmc则不会。查阅资料才知道Seruat对象是S4结构,会记录所执行的计算及其信息。在此献上周运来老师总结的一幅Seruat对象结构图。