数据处理基础—什么是整齐数据和Rich Data
书籍翻译
好的书籍是人类进步的阶梯,但有些人却找不到优秀的阶梯,为此我们开设了书籍翻译这个栏目,作为你学习之路的指路明灯;分享国内外优秀书籍,弘扬分享精神,做一个知识的传播者。
希望大家能有所收获!
正
文
R/Bioconductor简介
5.3
数据类型
5.6.1 什么是整齐的数据?
整齐的数据是Hadley Wickham (Wickham 2014)主要定义的概念。整齐的数据具有以下三个特征:
每个变量都有自己的列。
每个观察值都有自己的行。
每个值都有自己的单元格。
以下是一些整齐数据的示例:
## Students Subject Years Score
## 1 Mark Maths 1 5
## 2 Jane Biology 2 6
## 3 Mohammed Physics 3 4
## 4 Tom Maths 2 7
## 5 Celia Computing 3 9
以下是一些不整齐数据的示例:
## Students Sport Category Counts
## 1 Matt Tennis Wins 0
## 2 Matt Tennis Losses 1
## 3 Ellie Rugby Wins 3
## 4 Ellie Rugby Losses 2
## 5 Tim Football Wins 1
## 6 Tim Football Losses 4
## 7 Louise Swimming Wins 2
## 8 Louise Swimming Losses 2
## 9 Kelly Running Wins 5
## 10 Kelly Running Losses 1
任务1:不整齐的数据在哪些方面不整洁?我们怎么能把不整齐的数据整理整齐?
整齐的数据通常比不整齐的数据更容易使用,特别是如果您正在使用ggplot等软件包。幸运的是,可以使用软件包来整理不整齐的数据。今天我们将探讨tidyr包中可用的一些功能,这些功能可用于使不整齐的数据变得整齐。如果您有兴趣了解有关整理数据的更多信息,我们建议您阅读Garrett Grolemund和Hadley Wickham撰写的“R for Data Science”。电子版可在此处获取:http://r4ds.had.co.nz/
上面的不整齐数据是不整齐的,因为两个变量(Wins
和Losses
)存储在一列(Category
)中。这是数据不整齐的常见方式。为了整理这些数据,我们需要制作Wins
和Losses
插入列,并将值存储Counts
在这些列中。幸运的是,tidyverse包中有一个函数来执行此操作。该函数叫spread
,它需要两个参数,key
和value
。您应该将包含多个变量的列的名称传递给key
,并将包含多个变量值的列的名称传递给value
。例如:
library(tidyverse)
sports<-data.frame(Students=c("Matt", "Matt", "Ellie", "Ellie", "Tim", "Tim", "Louise", "Louise", "Kelly", "Kelly"), Sport=c("Tennis","Tennis", "Rugby", "Rugby","Football", "Football","Swimming","Swimming", "Running", "Running"), Category=c("Wins", "Losses", "Wins", "Losses", "Wins", "Losses", "Wins", "Losses", "Wins", "Losses"), Counts=c(0,1,3,2,1,4,2,2,5,1))
sports
## Students Sport Category Counts
## 1 Matt Tennis Wins 0
## 2 Matt Tennis Losses 1
## 3 Ellie Rugby Wins 3
## 4 Ellie Rugby Losses 2
## 5 Tim Football Wins 1
## 6 Tim Football Losses 4
## 7 Louise Swimming Wins 2
## 8 Louise Swimming Losses 2
## 9 Kelly Running Wins 5
## 10 Kelly Running Losses 1
spread(sports, key=Category, value=Counts)
## Students Sport Losses Wins
## 1 Ellie Rugby 2 3
## 2 Kelly Running 1 5
## 3 Louise Swimming 2 2
## 4 Matt Tennis 1 0
## 5 Tim Football 4 1
任务2:下面foods
定义的数据框不整齐。弄清楚原因并用spread()
它来整理它
foods<-data.frame(student=c("Antoinette","Antoinette","Taylor", "Taylor", "Alexa", "Alexa"), Category=c("Dinner", "Dessert", "Dinner", "Dessert", "Dinner","Dessert"), Frequency=c(3,1,4,5,2,1))
数据可能不整齐的另一种常见方式是列是值而不是变量。例如,下面的数据框显示了一些学生在5月和6月的测试中获得的百分比。数据是不整洁的,因为列May
和June
是值,而不是变量。
percentages<-data.frame(student=c("Alejandro", "Pietro", "Jane"), "May"=c(90,12,45), "June"=c(80,30,100))
幸运的是,tidyverse包中还有一个函数来处理这个问题。gather()
获取名称是值的列,key
和valueas
为两个参数。这次key
是变量的名称,其值为列名,而value
是值的名称,其值分布在多个列上。即:
gather(percentages, "May", "June", key="Month", value = "Percentage")
## student Month Percentage
## 1 Alejandro May 90
## 2 Pietro May 12
## 3 Jane May 45
## 4 Alejandro June 80
## 5 Pietro June 30
## 6 Jane June 100
这些例子与单细胞RNA-seq分析没有多大关系,但旨在帮助说明整齐和不整齐数据的特征。如果您的数据以整齐的格式存储,您会发现分析单细胞RNA-seq数据要容易得多。幸运的是,我们通常用于促进单细胞RNA-seq分析的数据结构通常鼓励以整齐的方式存储您的数据。
5.6.2什么是Rich Data?
如果你谷歌“rich data”,你会发现这个术语有很多不同的定义。在本课程中,我们将使用“丰富数据”来表示通过组合来自多个来源的信息生成的数据。例如,您可以通过在R中创建一个对象来生成丰富的数据,该对象包含单细胞RNA-seq实验中细胞中基因表达值的矩阵,还有关于如何进行实验的信息。我们将在下面讨论的SingleCellExperiment
类是丰富数据的一个示例。
5.7
Bioconductor , SingleCellExperiment and scater
5.7.1 Bioconductor
来自维基百科:Bioconductor是一个免费的,开源的开放式开发软件项目,用于分析和理解分子生物学中湿实验室实验产生的基因组数据。Bioconductor主要基于统计R编程语言,但确实包含其他编程语言的贡献。它每年有两个版本,遵循R的半年版本。在任何时候都有一个发布版本,对应于R的发布版本,以及一个对应于R的开发版本的开发版本。大多数用户将找到适合他们需求的发布版本。
我们强烈建议所有新手,甚至经验丰富的高通量数据分析师使用完善和维护的Bioconductor方法和类。
5.7.2 SingleCellExperiment
类
SingleCellExperiment
(SCE)是用于存储来自单细胞实验的数据的S4类。这包括存储和检索spike-in信息的专门方法,每个细胞的降维坐标和尺寸因子,以及基因和文库的常用元数据。
实际上,可以使用其构造函数创建此类的对象:
library(SingleCellExperiment)
counts <- matrix(rpois(100, lambda = 10), ncol=10, nrow=10)
rownames(counts) <- paste("gene", 1:10, sep = "")
colnames(counts) <- paste("cell", 1:10, sep = "")
sce <- SingleCellExperiment(
assays = list(counts = counts),
rowData = data.frame(gene_names = paste("gene_name", 1:10, sep = "")),
colData = data.frame(cell_names = paste("cell_name", 1:10, sep = ""))
)
sce
## class: SingleCellExperiment
## dim: 10 10
## metadata(0):
## assays(1): counts
## rownames(10): gene1 gene2 ... gene9 gene10
## rowData names(1): gene_names
## colnames(10): cell1 cell2 ... cell9 cell10
## colData names(1): cell_names
## reducedDimNames(0):
## spikeNames(0):
在SingleCellExperiment
中,用户可以为测定条目指定任意名称。为了协助软件包之间的互操作性,作者提供了针对特定类型数据的名称的一些建议:
计数:原始计数数据,例如特定基因的读数或转录物数。
normcounts:与原始计数相同的标准化值。例如,计数除以以单位为中心的特定于细胞的大小因子。
logcounts:日志转换计数或类似计数的值。在大多数情况下,这将被定义为对数转换的范数,例如,使用log base 2和伪计数1。
cpm:每百万计数。这是每个细胞中每个基因的读数,除以每个细胞的文库大小(以百万计)。
tpm:每百万的转录本。这是每个细胞中每个基因的转录物数量除以该细胞中转录物的总数(以百万计)。
这些建议名称中的每一个都具有适当的getter / setter方法,以便于操作
SingleCellExperiment
。例如,我们可以使用(非常具体命名的)counts
,对其进行标准化并将其分配给normcounts
:
normcounts(sce) <- log2(counts(sce) + 1)
sce
## class: SingleCellExperiment
## dim: 10 10
## metadata(0):
## assays(2): counts normcounts
## rownames(10): gene1 gene2 ... gene9 gene10
## rowData names(1): gene_names
## colnames(10): cell1 cell2 ... cell9 cell10
## colData names(1): cell_names
## reducedDimNames(0):
## spikeNames(0):
dim(normcounts(sce))
## [1] 10 10
head(normcounts(sce))
## cell1 cell2 cell3 cell4 cell5 cell6 cell7
## gene1 3.169925 3.169925 2.000000 2.584963 2.584963 3.321928 3.584963
## gene2 3.459432 1.584963 3.584963 3.807355 3.700440 3.700440 3.000000
## gene3 3.000000 3.169925 3.807355 3.169925 3.321928 3.321928 3.321928
## gene4 3.584963 3.459432 3.000000 3.807355 3.700440 3.700440 3.700440
## gene5 3.906891 3.000000 3.169925 3.321928 3.584963 3.459432 3.807355
## gene6 3.700440 3.700440 3.584963 4.000000 3.169925 3.000000 3.459432
## cell8 cell9 cell10
## gene1 3.321928 3.807355 2.807355
## gene2 3.807355 3.700440 4.000000
## gene3 2.584963 4.000000 3.700440
## gene4 3.169925 3.584963 3.700440
## gene5 3.807355 2.584963 3.584963
## gene6 3.321928 3.459432 4.000000
5.7.3 scater
包
scater
是用于单细胞RNA-seq分析的R包(McCarthy等人,2017)。该软件包含几种有用的方法,用于在进一步下游分析之前对数据进行质量控制,可视化和预处理。
scater
具有以下功能:
自动计算QC指标
来自具有伪比对的read数据的转录物量化
数据格式标准化
丰富的探索性可视化分析
无缝集成到Bioconductor宇宙中
简单的规范化的方法我们强烈建议
scater
用于所有单细胞RNA-seq分析,并且scater
是课程第一部分的基础。
如下图所示,scater
将帮助您在比对后对表达式矩阵进行质量控制,过滤和规范化。请记住,此图表示scater
使用SCESet
类的原始版本。在最新版本中,这个数字仍然是正确的,除了SCESet
可以用SingleCellExperiment
类代替。