09

ExpressionSet 对象简单讲解

这是我们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 diagnosisdate 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):
    1. name: 字符串,实验名称
    2. lab: 字符串,实验室名称
    3. contact: 字符串,联系方式
    4. title: 字符串,一句话描述实验的内容
    5. abstract: 字符串,实验摘要
    6. url: 字符串,实验相关的网址
    7. samples: list类,样品的信息
    8. hybridizations: list类,杂交的信息
    9. normControls: list类,对照信息,比如一些持家基因(house keeping genes)
    10. preprocessing: list类,原始数据的预处理过程
    11. pubMedIds: 字符串,pubMed索引号
    12. others: list类,其它相关的信息

    有了这些,所有实验相关的信息基本全备。

ExpressionSet继承了eSet类,属性基本和eSet保持一致。

那么,对于一个ExpressionSet,哪些属性是必须的?哪些有可能缺失呢?很显然,assayData是必须的,其它的可能会缺失,但是不能都缺失,因为那样的话就无法完成数据分析的工作。

 

对于ExpressionSet最重要的操作就是如何取出子集了。有时候在进行质量分析之后,我们对其中一些样品的数据不满意,想从已经实例化的ExpressionSet中抽取掉,或者我们希望对样品进行分组,都需要使用到Subset的概念。那么如何抽取子集呢?
我们可以象操作矩阵那样对其进行子集操作:vv <- exampleSet[1:5, 1:3]
使用它的一些属性来对其进行子集操作:males <- exampleSet[, exampleSet$gender == "Male"];