OSCA单细胞数据分析笔记-3、SingleCellExperiment数据结构

对应原版教程4章 http://bioconductor.org/books/release/OSCA/
SingleCellExperiment数据结构(下面简称sce)基于SummarizedExperiment衍生而来,专门用于存储scRNA-seq数据。这是导入测序比对数据到R的第一步,也是之后分析流程的主要对象。

1、sce主要结构组成

如下图所示,我目前对sce结构的理解是,围绕scRNA-seq的原始count数据,储存了4组相关信息

  • (1)Assays,即counts表达矩阵的标准化处理的矩阵(可以有任意多种,但常见的也就两三种);
  • (2)colData,即scRNA-seq的每个细胞的信息(例如批次信息、分组信息、表达概况信息);
  • (3)rowData,即scRNA-seq的每个基因的信息(例如表达概况、不同类基因名ID);
  • (4)reducedDims,即每个细胞的降维特征信息(主要有PCA、tSNE、uMAP三类)

2、R包准备与简单构建sce

2.1 R包安装

主要用到两个包:SingleCellExperiment,是构建sce对象的基础包;scater,是分析scRNA-seq的常用工具包之一。

BiocManager::install('SingleCellExperiment')
BiocManager::install('scater')
library(SingleCellExperiment)
library(scater)

值得一提的是加载基于sce的单细胞分析工具包时都会自动加载包括SingleCellExperiment在内的依赖包。

2.2 简单构建sce

  • 简单构建sce对象只需要提供单细胞count表达矩阵即可;
  • 如下,模拟一个包含3个细胞,比对到10个基因上的count表达矩阵
counts_matrix <- data.frame(cell_1 = rpois(10, 10), 
                            cell_2 = rpois(10, 10), 
                            cell_3 = rpois(10, 30))
rownames(counts_matrix) <- paste0("gene_", 1:10)
counts_matrix <- as.matrix(counts_matrix) # must be a matrix object!
#           cell_1 cell_2 cell_3
# gene_1      17     12     21
# gene_2      14      6     36
# gene_3      12     11     30
# gene_4       8     15     26
# gene_5      15     11     31
# gene_6       9      8     29
# gene_7       8     12     28
# gene_8       7     10     32
# gene_9       9     10     27
# gene_10      6      6     26
  • 然后套到下面这个命令里即可
sce <- SingleCellExperiment(assays = list(counts = counts_matrix))
sce
# class: SingleCellExperiment 
# dim: 10 3 
# metadata(0):
# assays(1): counts
#rownames(10): gene_1 gene_2 ... gene_9 gene_10
#rowData names(0):
#colnames(3): cell_1 cell_2 cell_3
#colData names(0):
#reducedDimNames(0):
#altExpNames(0):

3、sce四组成

3.1 标准化数据之assays

相关函数命令

  • assays(sce) 查看当前sce对象的所有assays' name【暂且可理解一种表达矩阵称之为一个assay】
  • assay(sce,"name") 查看sce指定一种assay的表达矩阵
    针对常见的assay,例如count assay、logcounts assay。SingleCellExperiment包也提供了简单的查询方式,具体如下例。
  • assay(sce,"new_name") = new_assay 添加新的assay
assays(sce)
# List of length 1
# names(1): counts

#使用scater包标准化,可直接作用于sce对象;具体为先进行文库因子校正,再log2转换。
sce=logNormCounts(sce)
assays(sce)
# List of length 2
# names(2): counts logcounts
assay(sce,"logcounts")
# cell_1   cell_2   cell_3
# gene_1  4.784105 4.356506 3.705089
# gene_2  4.515174 3.425268 4.435852
# gene_3  4.303259 4.237364 4.186088
# gene_4  3.754379 4.664280 3.991779
# gene_5  4.610498 4.237364 4.230835
# gene_6  3.912376 3.806334 4.139909
# gene_7  3.754379 4.356506 4.092203
# gene_8  3.576925 4.107489 4.274236
# gene_9  3.912376 4.107489 4.042865
# gene_10 3.374543 3.425268 3.991779

counts(sce)
?counts
logcounts(sce)

#模拟一个新的assay
counts_100 <- counts(sce) + 100
assay(sce, "counts_100") <- counts_100 # assign a new entry to assays slot
assays(sce) # new assay has now been added.

3.2 细胞信息之colData

主要包括两类:一是细胞的实验、分组等信息;二是根据表达矩阵概括的每个细胞的表达信息。
相关函数命令有
colData(sce) 查看当前sce对象所有的细胞信息;配合$美元符可方便的用于查看或新添某一条colData。尤其特殊一点是colData(sce)$foo等价于sce$foo

#当前sce有一条sizeFactor cell-info,为scater::logNormCounts时自动添加的
colData(sce) 
# DataFrame with 3 rows and 1 column
# sizeFactor
# <numeric>
# cell_1   0.640244
# cell_2   0.615854
# cell_3   1.743902

#添加批次信息
#colData(sce)$batch
sce$batch=c(1,1,2)  #注意顺序要一致
colnames(colData(sce))
#[1] "batch"      "sizeFactor"

#也可在构建sce对象时,就添加上
cell_metadata <- data.frame(batch = c(1, 1, 2))
rownames(cell_metadata) <- paste0("cell_", 1:3)
sce <- SingleCellExperiment(assays = list(counts = counts_matrix),
                            colData = cell_metadata)

#利用scater包,注释每个细胞的表达概况
sce <- scater::addPerCellQC(sce)
colData(sce)
# DataFrame with 3 rows and 9 columns
# batch sizeFactor       sum  detected percent_top_50 percent_top_100 percent_top_200 percent_top_500     total
#           <numeric>  <numeric> <integer> <integer>      <numeric>       <numeric>       <numeric>       <numeric> <integer>
# cell_1         1   0.640244       105        10            100             100             100             100       105
# cell_2         1   0.615854       101        10            100             100             100             100       101
# cell_3         2   1.743902       286        10            100             100             100             100       286

3.3 gene信息之colData

我目前所认识主要包括两类:一是不同种基因ID,二是基因的表达情况
相关函数命令有
rowData(sce)

#利用scater包注释基因的表达情况
sce <- scater::addPerFeatureQC(sce)
rowData(sce)
# DataFrame with 10 rows and 2 columns
# mean  detected
# <numeric> <numeric>
# gene_1    16.6667       100
# gene_2    18.6667       100
# gene_3    17.6667       100
# gene_4    16.3333       100
# gene_5    19.0000       100
# gene_6    15.3333       100
# gene_7    16.0000       100
# gene_8    16.3333       100
# gene_9    15.3333       100
# gene_10   12.6667       100

3.4 细胞降维信息之reducedDims

细胞降维信息,简单来说就是根据每个细胞的上千维表达情况压缩成几十个,甚至几个特征属性从而概括这个细胞的表达特征。方式有很多,常见的有三种PCA、tSNE、uMAP
相关函数有
reduceDims(sce) #查看当前sce有几种降维结果
reduceDim(sce, "name") #查看具体某一种降维结果
reduceDim(sce, "new_name") = foo #添加新一种降维结果,不过一个直接在sce对象中添加

reducedDims(sce)
# List of length 0
# names(0):

#利用scater包进行PCA降维
sce <- runPCA(sce)
reducedDims(sce)
# List of length 1
# names(1): PCA
reducedDim(sce, "PCA")
# PC1        PC2
# cell_1 -0.8716428822 -0.4312495
# cell_2  0.8713921135 -0.4316219
# cell_3  0.0002507686  0.8628713
# attr(,"percentVar")
# [1] 57.63049 42.36951
# attr(,"rotation")
# PC1         PC2
# gene_2  -0.62521538  0.35993511
# gene_1  -0.24546126 -0.66840778
# gene_4   0.52198543 -0.16823377
# gene_8   0.30446210  0.33370288
# gene_10  0.02919931  0.45728195
# gene_7   0.34545403  0.02830107
# gene_5  -0.21410318 -0.14912623
# gene_6  -0.06079117  0.21677758
# gene_9   0.11194401  0.02541130
# gene_3  -0.03781870 -0.06506096

4、sce取子集

  • 如上,sce的四部分都是基于原始的细胞名和gene名搭建的。
  • 如果只取其中一个细胞信息,则其余注释信息也当相应的取该细胞的注释信息;同理对基因筛选也是。
sce
# class: SingleCellExperiment 
# dim: 10 3 
# metadata(0):
# assays(2): counts logcounts
# rownames(10): gene_1 gene_2 ... gene_9 gene_10
# rowData names(2): mean detected
# colnames(3): cell_1 cell_2 cell_3
# colData names(10): batch sizeFactor ... total foo
# reducedDimNames(1): PCA
# altExpNames(0):

sce[1:2,]  #筛选基因
# class: SingleCellExperiment 
# dim: 2 3 
# metadata(0):
# assays(2): counts logcounts
# rownames(2): gene_1 gene_2
# rowData names(2): mean detected
# colnames(3): cell_1 cell_2 cell_3
# colData names(10): batch sizeFactor ... total foo
# reducedDimNames(1): PCA
# altExpNames(0):

sce[,c(1,3)]  #筛选细胞
sce[,sce$batch==1]  #根据注释信息筛选

5、简单对比Seurat数据结构

library(Seurat)
scRNA=as.Seurat(sce)
scRNA
# An object of class Seurat 
# 10 features across 3 samples within 1 assay 
# Active assay: RNA (10 features, 0 variable features)
#  1 dimensional reduction calculated: PCA
scRNA@assays$RNA@counts   #对应sce的counts assay
scRNA@assays$RNA@data     #对应sce的log2count assay
scRNA@meta.data           #对应sce的colData
scRNA@assays$RNA@meta.features  #应该对应sce的rowData,但显示为空值
scRNA@reductions$PCA@cell.embeddings #对应sce的reduceDim
subset(scRNA, subset = batch == 1)  #利用subset取子集

以上学习了SingleCellExperiment对象结构的基础知识,部分知识点如altExp()colLabels()sizeFactors()等到具体应用时再做学习,就不一一介绍了。
至此OSCA的第一部分就到这里了,内容比较少。第二部分就主要聚焦于scRNA-seq的分析流程知识点。

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

推荐阅读更多精彩内容