这是我们bioconductor中文社区的一个简单测试
好像放在博客里面markdown的语法除了问题,欢迎直接去github查看
这个对象其实是对表达矩阵加上样本分组信息的一个封装,由biobase这个包引入。它是eSet这个对象的继承。
一个现成例子
下面是一个具体的例子,来源于CLL这个包,是用hgu95av2芯片测了22个样本
> library(CLL)
> data(sCLLex)
> sCLLex
ExpressionSet (storageMode: lockedEnvironment)
assayData: 12625 features, 22 samples ##表达矩阵
element names: exprs
protocolData: none
phenoData
sampleNames: CLL11.CEL CLL12.CEL ... CLL9.CEL (22 total)
varLabels: SampleID Disease ## 样本分组信息
varMetadata: labelDescription
featureData: none
experimentData: use 'experimentData(object)'
Annotation: hgu95av2
> exprMatrix=exprs(sCLLex)
> dim(exprMatrix)
[1] 12625 22
> meta=pData(sCLLex)
> table(meta$Disease)
progres. stable
14 8
>
根据上面的信息可以看出该芯片共12625个探针,这22个样本根据疾病状态分成两组,14vs8
这个数据对象就可以打包做很多包的分析输入数据。
对这个包的分析,重点就是 `exprs` 函数提取表达矩阵,`pData` 函数看看该对象的样本分组信息。
limma等包使用该对象作为输入数据
下面这个例子充分说明了
ExpressionSet
对象的重要性
> library(limma)
> design=model.matrix(~factor(sCLLex$Disease))
> fit=lmFit(sCLLex,design)
> fit=eBayes(fit)
> options(digits = 4)
> topTable(fit,coef=2,adjust='BH')
logFC AveExpr t P.Value adj.P.Val B
39400_at 1.0285 5.621 5.836 8.341e-06 0.03344 3.234
36131_at -0.9888 9.954 -5.772 9.668e-06 0.03344 3.117
33791_at -1.8302 6.951 -5.736 1.049e-05 0.03344 3.052
1303_at 1.3836 4.463 5.732 1.060e-05 0.03344 3.044
36122_at -0.7801 7.260 -5.141 4.206e-05 0.10619 1.935
36939_at -2.5472 6.915 -5.038 5.362e-05 0.11283 1.737
41398_at 0.5187 7.602 4.879 7.824e-05 0.11520 1.428
32599_at 0.8544 5.746 4.859 8.207e-05 0.11520 1.389
36129_at 0.9161 8.209 4.859 8.212e-05 0.11520 1.389
37636_at -1.6868 5.697 -4.804 9.355e-05 0.11811 1.282
>
还有非常多的其它包会使用 ExpressionSet
对象,我就不一一介绍了。
自己构造 ExpressionSet
对象
根据上面的讲解,我们知道了在这个对象其实很简单,就是对表达矩阵加上样本分组信息的一个封装。 所以我们就用上面得到的exprMatrix和meta来构建一个ExpressionSet对象,biobase包里面提供了详细的说明,建议大家仔细看官方手册
metadata <- data.frame(labelDescription=c('SampleID', 'Disease'),
row.names=c('SampleID', 'Disease'))
phenoData <- new("AnnotatedDataFrame",data=meta,varMetadata=metadata)
myExpressionSet <- ExpressionSet(assayData=exprMatrix,
phenoData=phenoData,
annotation="hgu95av2")
> myExpressionSet
ExpressionSet (storageMode: lockedEnvironment)
assayData: 12625 features, 22 samples
element names: exprs
protocolData: none
phenoData
sampleNames: CLL11.CEL CLL12.CEL ... CLL9.CEL (22 total)
varLabels: SampleID Disease
varMetadata: labelDescription
featureData: none
experimentData: use 'experimentData(object)'
Annotation: hgu95av2
>
从上面的构造过程可以看出,重点就是表达矩阵加上样本分组信息
其它例子
ALL包的数据自带 ExpressionSet
对象
library(ALL)
data(ALL)
ALL
ExpressionSet (storageMode: lockedEnvironment)
assayData: 12625 features, 128 samples
element names: exprs
protocolData: none
phenoData
sampleNames: 01005 01010 … LAL4 (128 total)
varLabels: cod diagnosis … date last seen (21 total)
varMetadata: labelDescription
featureData: none
experimentData: use ‘experimentData(object)’
pubMedIds: 14684422 16243790
Annotation: hgu95av2
这个数据非常出名,很多其它算法包都会拿这个数据来举例子,只有真正理解了ExpressionSet对象才能学会bioconductor系列包
用GEOquery包来下载得到 ExpressionSet
对象
gse1009=GEOquery::getGEO("GSE1009")
gse1009[[1]] ## 这就是ExpressionSet对象
我发现糗世界讲的要比我好:http://blog.qiubio.com:8080/archives/2957
在Biobase基础包中,ExpressionSet是非常重要的类,因为Bioconductor设计之初是为了对基因芯片数据进行分析,而ExpressionSet正是Bioconductor为基因表达数据格式所定制的标准。它是所有涉及基因表达量相关数据在Bioconductor中进行操作的基础数据类型,比如affyPLM, affy, oligo, limma, arrayMagic等等。所以当我们学习Bioconductor时,第一个任务就是了解并掌握ExpressionSet的一切。
ExpressionSet的组成:
- assayData: 一个matrix类型或者environment类型数据。用于保存表达数据值。
当它是一个matrix时,它的行表示不同的探针组(probe sets)(也是features,总之是一个无重复的索引值)的值,它的列表示不同的样品。如果有行号或者列号的话,那么行号必须与featureData及phenoData中的行号一致,列号就是样品名。当我们使用exprs()方法时,就是调取的这个assayData的matrix。
当它是一个enviroment时,它必须有两个变量,一个就是与上一段描述一致的matrix,另一个就是epxrs,而这个exprs会响应exprs()方法,返回表达值。 - 头文件:用于描述实验平台相关的数据,其中包括phenoData, featureData,protocolData以及annotation等等。其中
phenoData是一个存放样品信息的data.frame或者AnnotatedDataFrame类型的数据。如果有行号的话,其行号必须与assayData的列号一致(也就是样品名)。如果没有行号,则其行数必须与assayData的列数一致。
featureData是一个存放features的data.frame或者AnnotatedDataFrame类型的数据。它的行数必须与assayData的行数一致。如果有行号的话,那么它的行号必须和assayData的行号一致。
annotation是用于存放芯片类型的字符串,比如hgu95av2之类。
protocolData用于存放设备相当的数据。它是AnnotatedDataFrame类型。它的维度必须与assayData的维度一致。 - experimentData: 一个MIAME类型的数据,它用于保存和实验设计相关的资料,比如实验室名,发表的文章,等等。那么什么是MIAME类呢?MIAME是Minimum Information About a Microarray Experiment的首字母缩写,它包括以下一些属性(slots):
- name: 字符串,实验名称
- lab: 字符串,实验室名称
- contact: 字符串,联系方式
- title: 字符串,一句话描述实验的内容
- abstract: 字符串,实验摘要
- url: 字符串,实验相关的网址
- samples: list类,样品的信息
- hybridizations: list类,杂交的信息
- normControls: list类,对照信息,比如一些持家基因(house keeping genes)
- preprocessing: list类,原始数据的预处理过程
- pubMedIds: 字符串,pubMed索引号
- others: list类,其它相关的信息
有了这些,所有实验相关的信息基本全备。
ExpressionSet继承了eSet类,属性基本和eSet保持一致。
那么,对于一个ExpressionSet,哪些属性是必须的?哪些有可能缺失呢?很显然,assayData是必须的,其它的可能会缺失,但是不能都缺失,因为那样的话就无法完成数据分析的工作。
对于ExpressionSet最重要的操作就是如何取出子集了。有时候在进行质量分析之后,我们对其中一些样品的数据不满意,想从已经实例化的ExpressionSet中抽取掉,或者我们希望对样品进行分组,都需要使用到Subset的概念。那么如何抽取子集呢?
我们可以象操作矩阵那样对其进行子集操作:vv <- exampleSet[1:5, 1:3]
使用它的一些属性来对其进行子集操作:males <- exampleSet[, exampleSet$gender == "Male"];