我顶                    字号:                

Bioconductor基础ExpressionSet介绍 3

12 十 2012   | 程序员

在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类。
第一步,得到assayData。

> dataDir <- system.file("extdata", package="Biobase")> exprsFile <- file.path(dataDir, "exprsData.txt")> exprsFile[1] "/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Biobase/extdata/exprsData.txt"> exprs <- as.matrix(read.table(exprsFile, header=TRUE, sep="\t", row.names=1, as.is=TRUE))> class(exprs)[1] "matrix"> dim(exprs)[1] 500  26> colnames(exprs)
 [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"> head(exprs)
                       A         B        C        D        E       F        G       H       I
AFFX-MurIL2_at  192.7420  85.75330 176.7570 135.5750 64.49390 76.3569 160.5050 65.9631 56.9039AFFX-MurIL10_at  97.1370 126.19600  77.9216  93.3713 24.39860 85.5088  98.9086 81.6932 97.8015AFFX-MurIL4_at   45.8192   8.83135  33.0632  28.7072  5.94492 28.2925  30.9694 14.7923 14.2399AFFX-MurFAS_at   22.5445   3.60093  14.6883  12.3397 36.86630 11.2568  23.0034 16.2134 12.0375AFFX-BioB-5_at   96.7875  30.43800  46.1271  70.9319 56.17440 42.6756  86.5156 30.7927 19.7183AFFX-BioB-M_at   89.0730  25.84610  57.2033  69.9766 49.58220 26.1262  75.0083 42.3352 41.1207
                        J        K       L       M       N       O       P        Q        R
AFFX-MurIL2_at  135.60800 63.44320 78.2126 83.0943 89.3372 91.0615 95.9377 179.8450 152.4670AFFX-MurIL10_at  90.48380 70.57330 94.5418 75.3455 68.5827 87.4050 84.4581  87.6806 108.0320AFFX-MurIL4_at   34.48740 20.35210 14.1554 20.6251 15.9231 20.1579 27.8139  32.7911  33.5292AFFX-MurFAS_at    4.54978  8.51782 27.2852 10.1616 20.2488 15.7849 14.3276  15.9488  14.6753AFFX-BioB-5_at   46.35200 39.13260 41.7698 80.2197 36.4903 36.4021 35.3054  58.6239 114.0620AFFX-BioB-M_at   91.53070 39.91360 49.8397 63.4794 24.7007 47.4641 47.3578  58.1331 104.1220
                        S       T         U        V       W         X       Y         Z
AFFX-MurIL2_at  180.83400 85.4146 157.98900 146.8000 93.8829 103.85500 64.4340 175.61500AFFX-MurIL10_at 134.26300 91.4031  -8.68811  85.0212 79.2998  71.65520 64.2369  78.70680AFFX-MurIL4_at   19.81720 20.4190  26.87200  31.1488 22.3420  19.01350 12.1686  17.37800AFFX-MurFAS_at   -7.91911 12.8875  11.91860  12.8324 11.1390   7.55564 19.9849   8.96849AFFX-BioB-5_at   93.44020 22.5168  48.64620  90.2215 42.0053  57.57380 44.8216  61.70440AFFX-BioB-M_at  115.83100 58.1224  73.42210  64.6066 40.3068  41.82090 46.1087  49.41220

第二步,准备头文件。

> #准备phenoData> pDataFile <- file.path(dataDir, "pData.txt")> pDataFile[1] "/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Biobase/extdata/pData.txt"> pData <- read.table(pDataFile, row.names=1, header=TRUE, sep="\t")> dim(pData)[1] 26  3> rownames(pData)
 [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W"[24] "X" "Y" "Z"> summary(pData)
    gender        type        score       
 Female:11   Case   :15   Min.   :0.1000  
 Male  :15   Control:11   1st Qu.:0.3275  
                          Median :0.4150  
                          Mean   :0.5369  
                          3rd Qu.:0.7650  
                          Max.   :0.9800  > head(pData)
  gender    type score
A Female Control  0.75B   Male    Case  0.40C   Male Control  0.73D   Male    Case  0.42E Female    Case  0.93F   Male Control  0.22> #检查pData的行号是否和exprs的列号一致> all(rownames(pData) == colnames(exprs))[1] TRUE> #然后将pData转换成一个AnnotatedDataFrame实例> metadata <- data.frame(labelDescription=c("Patient gender", "Case/control status", "Tumor progress on XYZ scale"), row.names=colnames(pData))> adf <- new("AnnotatedDataFrame", data=pData, varMetadata=metadata)> adf
An object of class 'AnnotatedDataFrame'
  rowNames: A B ... Z (26 total)
  varLabels: gender type score
  varMetadata: labelDescription> dim(adf)
   rowNames columnNames 
         26           3 > varMetadata(adf)
                  labelDescription
gender              Patient gender
type           Case/control status
score  Tumor progress on XYZ scale> dimLabels(adf)[1] "rowNames"    "columnNames"> featureNames(adf)
 [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W"[24] "X" "Y" "Z"> sampleNames(adf)
 [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W"[24] "X" "Y" "Z"> head(pData(adf))
  gender    type score
A Female Control  0.75B   Male    Case  0.40C   Male Control  0.73D   Male    Case  0.42E Female    Case  0.93F   Male Control  0.22> #准备annotation> annotation <- "hgu95av2"

第三步,准备experimentData。

> experimentData = new("MIAME", name="Pierre Fermat",+ lab="Francis Galton Lab",+ contact="[email protected]",+ title="Smoking-Cancer Experiment",+ abstract="An example ExpressionSet",+ url="www.lab.not.exist",+ other=list(notes="Created from text files"))> experimentData
Experiment data
  Experimenter name: Pierre Fermat 
  Laboratory: Francis Galton Lab 
  Contact information: [email protected] 
  Title: Smoking-Cancer Experiment 
  URL: www.lab.not.exist 
  PMIDs:   
  Abstract: A 3 word abstract is available. Use 'abstract' method.  notes:
   notes:     
      Created from text files

最后,把它们整合起来。

> exampleSet = new("ExpressionSet", exprs=exprs,+ phenoData=adf, experimentData=experimentData,+ annotation="hgu95av2")> exampleSet
ExpressionSet (storageMode: lockedEnvironment)assayData: 500 features, 26 samples 
  element names: exprs 
protocolData: none
phenoData
  sampleNames: A B ... Z (26 total)
  varLabels: gender type score
  varMetadata: labelDescription
featureData: none
experimentData: use 'experimentData(object)'Annotation: hgu95av2

以上,我们一步一步地实例了一个ExpressionSet类。但是在实际的Bioconductor操作中是很少从第一步开始这样实例一个 ExpressionSet类的。最常见的情况是我们使用affy中的ReadAffy()函数,读取.CEL文件进入R成为一个AffyBatch实 例,而后使用rma()或者mas5()函数对样品进行处理之后得到一个ExpressionSet的实例。我们之所以做上面的练习,只是为了能够更好地 理解什么是ExpressionSet类。

接下来需要了解的是ExpressionSet有哪些方法,我们如何操作ExpressionSet类。

> #可以直接使用$符号来访问AnnotatedDataFrame型的数据> exampleSet$gender[1:5][1] Female Male   Male   Male   Female
Levels: Female Male> #使用pData函数来获得phenoData中的数据> head(pData(exampleSet))
  gender    type score
A Female Control  0.75B   Male    Case  0.40C   Male Control  0.73D   Male    Case  0.42E Female    Case  0.93F   Male Control  0.22> #使用featureNames来读取features.我们注意到实际上exampleSet的featureData是空的,但是我们仍然可以得到featureNames。> featureNames(exampleSet)[1:5][1] "AFFX-MurIL2_at"  "AFFX-MurIL10_at" "AFFX-MurIL4_at"  "AFFX-MurFAS_at"  "AFFX-BioB-5_at" > #得到样品名称> sampleNames(exampleSet)[1:5][1] "A" "B" "C" "D" "E"> #使用exprs()函数来提取表达值,也就是assayData中的matrix。> mat <- exprs(exampleSet)> dim(mat)[1] 500  26> #使用phenoData()函数来获取整个phenoData。注意它和pData()函数的区别。> adf <- phenoData(exampleSet)> adf
An object of class 'AnnotatedDataFrame'
  sampleNames: A B ... Z (26 total)
  varLabels: gender type score
  varMetadata: labelDescription

对于ExpressionSet最重要的操作就是如何取出子集了。有时候在进行质量分析之后,我们对其中一些样品的数据不满意,想从已经实例化的ExpressionSet中抽取掉,或者我们希望对样品进行分组,都需要使用到Subset的概念。那么如何抽取子集呢?
我们可以象操作矩阵那样对其进行子集操作。

> vv <- exampleSet[1:5, 1:3]> vv
ExpressionSet (storageMode: lockedEnvironment)assayData: 5 features, 3 samples 
  element names: exprs 
protocolData: none
phenoData
  sampleNames: A B C
  varLabels: gender type score
  varMetadata: labelDescription
featureData: none
experimentData: use 'experimentData(object)'Annotation: hgu95av2 
> featureNames(vv)[1] "AFFX-MurIL2_at"  "AFFX-MurIL10_at" "AFFX-MurIL4_at"  "AFFX-MurFAS_at"  "AFFX-BioB-5_at"

我们还可以使用它的一些属性来对其进行子集操作。需要注意的是行列的位置。

> males <- exampleSet[, exampleSet$gender == "Male"]; males
ExpressionSet (storageMode: lockedEnvironment)assayData: 500 features, 15 samples 
  element names: exprs 
protocolData: none
phenoData
  sampleNames: B C ... X (15 total)
  varLabels: gender type score
  varMetadata: labelDescription
featureData: none
experimentData: use 'experimentData(object)'Annotation: hgu95av2 
> dim(males)Features  Samples 
     500       15 > AFFX <- exampleSet[grepl("^AFFX", featureNames(exampleSet)), ]> AFFX
ExpressionSet (storageMode: lockedEnvironment)assayData: 67 features, 26 samples 
  element names: exprs 
protocolData: none
phenoData
  sampleNames: A B ... Z (26 total)
  varLabels: gender type score
  varMetadata: labelDescription
featureData: none
experimentData: use 'experimentData(object)'Annotation: hgu95av2 
> dim(AFFX)Features  Samples 
      67       26

如果想了解更多,请在R中使用?ExpressionSet以及?eSet来获得更多的资料。