重生之我在剑桥大学学习单细胞RNA-seq分析——7. 使用Seurat进行单细胞RNA测序分析(1)

本章将介绍使用Seurat(V3)的一些典型任务。尽管Seurat目前已经更新至V5版本,但仍不妨碍我们从此教程中学习一些基本操作及分析思想。
现在让我们加载本教程所需的所有库。

> library(Seurat)
> library(ggplot2)
> library(SingleR)
> library(dplyr)
> library(celldex)
> library(RColorBrewer)
> library(SingleCellExperiment)

7.1 基本质控和过滤
在开始分析之前要进行两步操作:1)使用soupX进行环境RNA校正;2)使用scrublet进行双胞检测。但本教程不对soupXscrublet的使用做介绍。
首先读入SoupX校正矩阵。SoupX的输出仅包含可用的基因名称,所以不需要额外指定。如果从典型的Cell Ranger输出开始,则可以选择在表达矩阵中使用Ensemble ID或基因名称。这是通过gene.column选项实现的;默认值为“2”,即基因名称。

> adj.matrix <- Read10X("data/update/soupX_pbmc10k_filt")

在这之后,我们将创建一个Seurat对象。Seurat对象向我们展示了:1)细胞数量(samples)大致与每个数据集的描述(10,194)相匹配;2)有36,601个基因(features)。

> srat <- CreateSeuratObject(adj.matrix,project = "pbmc10k")
> srat
An object of class Seurat 
36601 features across 10194 samples within 1 assay 
Active assay: RNA (36601 features, 0 variable features)

让我们从内存中删除adj.matrix以节省RAM,并仔细查看Seurat对象。str命令允许我们查看该类的所有字段:

> adj.matrix <- NULL
> str(srat)
Formal class 'Seurat' [package "SeuratObject"] with 13 slots
  ..@ assays      :List of 1
  .. ..$ RNA:Formal class 'Assay' [package "SeuratObject"] with 8 slots
  .. .. .. ..@ counts       :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  .. .. .. .. .. ..@ i       : int [1:24330253] 25 30 32 42 43 44 51 59 60 62 ...
  .. .. .. .. .. ..@ p       : int [1:10195] 0 4803 7036 11360 11703 15846 18178 20413 22584 27802 ...
  .. .. .. .. .. ..@ Dim     : int [1:2] 36601 10194
  .. .. .. .. .. ..@ Dimnames:List of 2
  .. .. .. .. .. .. ..$ : chr [1:36601] "MIR1302-2HG" "FAM138A" "OR4F5" "AL627309.1" ...
  .. .. .. .. .. .. ..$ : chr [1:10194] "AAACCCACATAACTCG-1" "AAACCCACATGTAACC-1" "AAACCCAGTGAGTCAG-1" "AAACCCAGTGCTTATG-1" ...
  .. .. .. .. .. ..@ x       : num [1:24330253] 1 2 1 1 1 3 1 1 1 1 ...
  .. .. .. .. .. ..@ factors : list()
  .. .. .. ..@ data         :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  .. .. .. .. .. ..@ i       : int [1:24330253] 25 30 32 42 43 44 51 59 60 62 ...
  .. .. .. .. .. ..@ p       : int [1:10195] 0 4803 7036 11360 11703 15846 18178 20413 22584 27802 ...
  .. .. .. .. .. ..@ Dim     : int [1:2] 36601 10194
  .. .. .. .. .. ..@ Dimnames:List of 2
  .. .. .. .. .. .. ..$ : chr [1:36601] "MIR1302-2HG" "FAM138A" "OR4F5" "AL627309.1" ...
  .. .. .. .. .. .. ..$ : chr [1:10194] "AAACCCACATAACTCG-1" "AAACCCACATGTAACC-1" "AAACCCAGTGAGTCAG-1" "AAACCCAGTGCTTATG-1" ...
  .. .. .. .. .. ..@ x       : num [1:24330253] 1 2 1 1 1 3 1 1 1 1 ...
  .. .. .. .. .. ..@ factors : list()
  .. .. .. ..@ scale.data   : num[0 , 0 ] 
  .. .. .. ..@ key          : chr "rna_"
  .. .. .. ..@ assay.orig   : NULL
  .. .. .. ..@ var.features : logi(0) 
  .. .. .. ..@ meta.features:'data.frame':      36601 obs. of  0 variables
  .. .. .. ..@ misc         : list()
  ..@ meta.data   :'data.frame':        10194 obs. of  3 variables:
  .. ..$ orig.ident  : Factor w/ 1 level "pbmc10k": 1 1 1 1 1 1 1 1 1 1 ...
  .. ..$ nCount_RNA  : num [1:10194] 22196 7630 21358 857 15007 ...
  .. ..$ nFeature_RNA: int [1:10194] 4734 2191 4246 342 4075 2285 2167 2151 5134 3037 ...
  ..@ active.assay: chr "RNA"
  ..@ active.ident: Factor w/ 1 level "pbmc10k": 1 1 1 1 1 1 1 1 1 1 ...
  .. ..- attr(*, "names")= chr [1:10194] "AAACCCACATAACTCG-1" "AAACCCACATGTAACC-1" "AAACCCAGTGAGTCAG-1" "AAACCCAGTGCTTATG-1" ...
  ..@ graphs      : list()
  ..@ neighbors   : list()
  ..@ reductions  : list()
  ..@ images      : list()
  ..@ project.name: chr "pbmc10k"
  ..@ misc        : list()
  ..@ version     :Classes 'package_version', 'numeric_version'  hidden list of 1
  .. ..$ : int [1:3] 4 1 0
  ..@ commands    : list()
  ..@ tools       : list()

meta.data是接下来步骤中最重要的字段。可以使用@[[]]运算符访问它。
目前每个细胞有3个字段:数据集ID、每个细胞检测到的UMI数(nCount_RNA)以及每个相同细胞表达(检测到)的基因数(nFeature_RNA)。

> meta <- srat@meta.data
> dim(meta)
[1] 10194     3
> head(meta)
                   orig.ident nCount_RNA nFeature_RNA
AAACCCACATAACTCG-1    pbmc10k      22196         4734
AAACCCACATGTAACC-1    pbmc10k       7630         2191
AAACCCAGTGAGTCAG-1    pbmc10k      21358         4246
AAACCCAGTGCTTATG-1    pbmc10k        857          342
AAACGAACAGTCAGTT-1    pbmc10k      15007         4075
AAACGAACATTCGGGC-1    pbmc10k       9855         2285
> summary(meta$nCount_RNA)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    499    5549    7574    8902   10730   90732 
> summary(meta$nFeature_RNA)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
     47    1725    2113    2348    2948    7265

我们来添加更多可用于评估细胞质量的值。线粒体基因是细胞状态的有用指标。对于小鼠数据集,将匹配模式更改为“Mt-”,或使用features = ...选项明确列出基因ID。

> srat[["percent.mt"]] <- PercentageFeatureSet(srat, pattern = "^MT-") 

类似地,我们可以定义核糖体蛋白(名称以RPS或RPL开头),它们通常占据reads的大部分:

> srat[["percent.rb"]] <- PercentageFeatureSet(srat, pattern = "^RP[SL]") 

现在,让我们将scrublet生成的双胞注释添加到Seurat对象元数据中。

> doublets <- read.table("data/update/scrublet_calls.tsv",header = F,row.names = 1)
> colnames(doublets) <- c("Doublet_score","Is_doublet")
> srat <- AddMetaData(srat,doublets)
> head(srat[[]])
                   orig.ident nCount_RNA nFeature_RNA percent.mt percent.rb
AAACCCACATAACTCG-1    pbmc10k      22196         4734   5.275725  25.067580
AAACCCACATGTAACC-1    pbmc10k       7630         2191   8.833552  33.853211
AAACCCAGTGAGTCAG-1    pbmc10k      21358         4246   6.283360  19.276149
AAACCCAGTGCTTATG-1    pbmc10k        857          342  31.388565   1.750292
AAACGAACAGTCAGTT-1    pbmc10k      15007         4075   7.916306  14.986340
AAACGAACATTCGGGC-1    pbmc10k       9855         2285   7.762557  41.024860
                   Doublet_score Is_doublet
AAACCCACATAACTCG-1    0.30542385       True
AAACCCACATGTAACC-1    0.01976120      False
AAACCCAGTGAGTCAG-1    0.03139876      False
AAACCCAGTGCTTATG-1    0.02755040      False
AAACGAACAGTCAGTT-1    0.36867997       True
AAACGAACATTCGGGC-1    0.09723644      False

绘制所选元数据特征的小提琴图。请注意,这些图按名为identity的类分组。Identity类可以在srat@active.ident中看到,或者使用Idents()函数,SetIdents()可以更改处于活动状态的identity。

> VlnPlot(srat, features = c("nFeature_RNA","nCount_RNA","percent.mt","percent.rb"), ncol = 4,pt.size = 0.1) & 
    theme(plot.title = element_text(size=10))

再来绘制一些元数据特征,看看它们之间的相关性。每个图上方的数字是皮尔逊相关系数。

> FeatureScatter(srat, feature1 = "nCount_RNA", feature2 = "percent.mt")
> FeatureScatter(srat, feature1 = "nCount_RNA", feature2 = "nFeature_RNA")
> FeatureScatter(srat, feature1 = "nCount_RNA", feature2 = "percent.rb")
> FeatureScatter(srat, feature1 = "percent.rb", feature2 = "percent.mt")
> FeatureScatter(srat, feature1 = "nFeature_RNA", feature2 = "Doublet_score")

上图清楚地表明,高线粒体百分比与低UMI密切相关,这通常被解释为死细胞。但高核糖体蛋白含量与线粒体强烈负相关,并且似乎包含生物信号。双胞得分和表达的基因数之间也存在很强的相关性。让我们在元数据中增加QC列,并充分的定义它。

> srat[['QC']] <- ifelse(srat@meta.data$Is_doublet == 'True','Doublet','Pass')
> srat[['QC']] <- ifelse(srat@meta.data$nFeature_RNA < 500 & srat@meta.data$QC == 'Pass','Low_nFeature',srat@meta.data$QC)
> srat[['QC']] <- ifelse(srat@meta.data$nFeature_RNA < 500 & srat@meta.data$QC != 'Pass' & srat@meta.data$QC != 'Low_nFeature',paste('Low_nFeature',srat@meta.data$QC,sep = ','),srat@meta.data$QC)
> srat[['QC']] <- ifelse(srat@meta.data$percent.mt > 15 & srat@meta.data$QC == 'Pass','High_MT',srat@meta.data$QC)
> srat[['QC']] <- ifelse(srat@meta.data$nFeature_RNA < 500 & srat@meta.data$QC != 'Pass' & srat@meta.data$QC != 'High_MT',paste('High_MT',srat@meta.data$QC,sep = ','),srat@meta.data$QC)
> table(srat[['QC']])
QC
                     Doublet                      High_MT 
                         546                          548 
        High_MT,Low_nFeature High_MT,Low_nFeature,Doublet 
                         275                            1 
                        Pass 
                        8824

我们可以看到,双胞通常不会与基因数较少的细胞重叠;同时,后者通常与线粒体含量高的细胞重叠。让我们仅绘制通QC列为pass的细胞的元数据:

> VlnPlot(subset(srat, subset = QC == 'Pass'), 
          features = c("nFeature_RNA", "nCount_RNA", "percent.mt","percent.rb"), ncol = 4, pt.size = 0.1) & 
    theme(plot.title = element_text(size=10))

往期内容:
重生之我在剑桥大学学习单细胞RNA-seq分析——6. 生物学分析(1)
重生之我在剑桥大学学习单细胞RNA-seq分析——6. 生物学分析(2)
重生之我在剑桥大学学习单细胞RNA-seq分析——6. 生物学分析(3)
重生之我在剑桥大学学习单细胞RNA-seq分析——6. 生物学分析(4)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容