curatedOvarianData: Clinically Annotated Data for the Ovarian Cancer Transcriptome

Introduction

This package represents a manually curated data collection for gene expression meta-analysis of patients with ovarian cancer. This resource provides uniformly prepared microarray data with curated and documented clinical metadata. It allows a computational user to efficiently identify studies and patient subgroups of interest for analysis and to run such analyses immediately without the challenges posed by harmonizing heterogeneous microarray technologies, study designs, expression data processing methods, and clinical data formats.

The curatedOvarianData package is published in the journal DATABASE (Ganzfried et al. (2013)). Note the existence also of curatedCRCData and curatedBladderData.

In this vignette, we give a short tour of the package and will show how to use it efficiently.

Data access and caching

As of version 1.52, the datasets are no longer stored inside the package: they are hosted on Zenodo and downloaded individually the first time they are requested, then cached locally with BiocFileCache so later uses need no network access. The cache lives in a package-specific directory, tools::R_user_dir("curatedOvarianData", "cache"); to reclaim disk space, delete that directory or manage it with BiocFileCache.

The legacy data(TCGA_eset) syntax still works (it downloads through the same cache) but is deprecated and will be removed in a future release; please use the curatedOvarianData() function shown below.

Throughout this vignette we set test = TRUE (and test.mode <- TRUE), which loads small offline subsets of each dataset that are bundled with the package, so that the vignette builds without downloading data. For real analyses, omit these settings to work with the full datasets.

Load TCGA data

Loading a single dataset is very easy. First we load the package:

library(curatedOvarianData)
library(sva)
library(logging)

To get a listing of all the datasets, call curatedOvarianData() with no arguments:

curatedOvarianData()
##  [1] "E.MTAB.386_eset"         "GSE12418_eset"          
##  [3] "GSE12470_eset"           "GSE13876_eset"          
##  [5] "GSE14764_eset"           "GSE17260_eset"          
##  [7] "GSE18520_eset"           "GSE19829.GPL570_eset"   
##  [9] "GSE19829.GPL8300_eset"   "GSE20565_eset"          
## [11] "GSE2109_eset"            "GSE26193_eset"          
## [13] "GSE26712_eset"           "GSE30009_eset"          
## [15] "GSE30161_eset"           "GSE32062.GPL6480_eset"  
## [17] "GSE32063_eset"           "GSE44104_eset"          
## [19] "GSE49997_eset"           "GSE51088_eset"          
## [21] "GSE6008_eset"            "GSE6822_eset"           
## [23] "GSE8842_eset"            "GSE9891_eset"           
## [25] "PMID15897565_eset"       "PMID17290060_eset"      
## [27] "PMID19318476_eset"       "TCGA_eset"              
## [29] "TCGA.mirna.8x15kv2_eset" "TCGA.RNASeqV2_eset"

Now to load the TCGA data (drop test = TRUE to download the full dataset):

TCGA_eset <- curatedOvarianData("TCGA_eset", test = TRUE)
TCGA_eset
## ExpressionSet (storageMode: lockedEnvironment)
## assayData: 202 features, 100 samples 
##   element names: exprs 
## protocolData: none
## phenoData
##   sampleNames: TCGA.20.0987 TCGA.23.1031 ... TCGA.13.0805 (100 total)
##   varLabels: alt_sample_name unique_patient_ID ...
##     uncurated_author_metadata (31 total)
##   varMetadata: labelDescription
## featureData
##   featureNames: CXCL12 CXCR4 ... ADAMTS13 (202 total)
##   fvarLabels: probeset gene
##   fvarMetadata: labelDescription
## experimentData: use 'experimentData(object)'
##   pubMedIds: 21720365 
## Annotation: hthgu133a

The datasets are provided as Bioconductor ExpressionSet objects and we refer to the Bioconductor documentation for users unfamiliar with this data structure.

Load datasets based on rules

For a meta-analysis, we typically want to filter datasets and patients to get a population of patients we are interested in. We provide a short but powerful R script that does the filtering and provides the data as a list of ExpressionSet objects. One can use this script within R by first sourcing a configuration file which specifies the filters, like the minimum numbers of patients in each dataset. It is also possible to filter samples by annotation, for example to remove early stage and normal samples.

source(system.file("extdata",
"patientselection.config",package="curatedOvarianData"))
test.mode <- TRUE  # use the bundled offline subsets in this vignette
# relax the filters so the small subsets pass them; for real analyses,
# keep the config defaults
min.sample.size <- 20; min.number.of.events <- 5; min.number.of.genes <- 150
ls()
##  [1] "add.surv.y"                 "duplicates"                
##  [3] "impute.missing"             "keep.common.only"          
##  [5] "meta.required"              "min.number.of.events"      
##  [7] "min.number.of.genes"        "min.sample.size"           
##  [9] "probes.not.mapped.uniquely" "quantile.cutoff"           
## [11] "remove.retracted"           "remove.samples"            
## [13] "remove.subsets"             "rescale"                   
## [15] "rule.1"                     "strict.checking"           
## [17] "TCGA_eset"                  "tcga.lowcor.outliers"      
## [19] "test.mode"

See what the values of these variables we have loaded are. The variable names are fairly descriptive, but note that “rule.1” is a character vector of length 2, where the first entry is the name of a clinical data variable, and the second entry is a Regular Expression providing a requirement for that variable. Any number of rules can be added, with increasing identifiers, e.g. “rule.2”, “rule.3”, etc.

Here strict.checking is FALSE, meaning that samples not annotated for the variables in these rules are allowed to pass the filter. If strict.checking == TRUE, samples missing this annotation will be removed.

Cleaning of duplicate samples

The patientselection.config file loaded above contains several objects indicating which samples were removed for QC and duplicate cleaning by Waldron et al. (2014) :

  • tcga.lowcor.outliers: two profiles identified in the TCGA dataset with anomolously low correlation to other ovc profiles
  • duplicates: samples blacklisted because they contain duplicates. In the case of duplicates, generally better-annotated samples, and samples from more recent studies, were kept.
  • remove.samples: the above to vectors of samples concatenated
#remove.samples and duplicates are too voluminous:
sapply(
    ls(),
    function(x) if(!x %in% c("remove.samples", "duplicates")) print(get(x))
)
## function (X) 
## Surv(X$days_to_death, X$vital_status == "deceased")
## [1] FALSE
## [1] FALSE
## [1] "days_to_death" "vital_status" 
## [1] 5
## [1] 150
## [1] 20
## [1] "drop"
## [1] 0
## [1] FALSE
## [1] TRUE
## [1] TRUE
## [1] "sample_type" "^tumor$"    
## [1] FALSE
## ExpressionSet (storageMode: lockedEnvironment)
## assayData: 202 features, 100 samples 
##   element names: exprs 
## protocolData: none
## phenoData
##   sampleNames: TCGA.20.0987 TCGA.23.1031 ... TCGA.13.0805 (100 total)
##   varLabels: alt_sample_name unique_patient_ID ...
##     uncurated_author_metadata (31 total)
##   varMetadata: labelDescription
## featureData
##   featureNames: CXCL12 CXCR4 ... ADAMTS13 (202 total)
##   fvarLabels: probeset gene
##   fvarMetadata: labelDescription
## experimentData: use 'experimentData(object)'
##   pubMedIds: 21720365 
## Annotation: hthgu133a 
## [1] "TCGA_eset:TCGA.24.1927" "TCGA_eset:TCGA.31.1955"
## [1] TRUE
## $add.surv.y
## function (X) 
## Surv(X$days_to_death, X$vital_status == "deceased")
## 
## $duplicates
## NULL
## 
## $impute.missing
## [1] FALSE
## 
## $keep.common.only
## [1] FALSE
## 
## $meta.required
## [1] "days_to_death" "vital_status" 
## 
## $min.number.of.events
## [1] 5
## 
## $min.number.of.genes
## [1] 150
## 
## $min.sample.size
## [1] 20
## 
## $probes.not.mapped.uniquely
## [1] "drop"
## 
## $quantile.cutoff
## [1] 0
## 
## $remove.retracted
## [1] FALSE
## 
## $remove.samples
## NULL
## 
## $remove.subsets
## [1] TRUE
## 
## $rescale
## [1] TRUE
## 
## $rule.1
## [1] "sample_type" "^tumor$"    
## 
## $strict.checking
## [1] FALSE
## 
## $TCGA_eset
## ExpressionSet (storageMode: lockedEnvironment)
## assayData: 202 features, 100 samples 
##   element names: exprs 
## protocolData: none
## phenoData
##   sampleNames: TCGA.20.0987 TCGA.23.1031 ... TCGA.13.0805 (100 total)
##   varLabels: alt_sample_name unique_patient_ID ...
##     uncurated_author_metadata (31 total)
##   varMetadata: labelDescription
## featureData
##   featureNames: CXCL12 CXCR4 ... ADAMTS13 (202 total)
##   fvarLabels: probeset gene
##   fvarMetadata: labelDescription
## experimentData: use 'experimentData(object)'
##   pubMedIds: 21720365 
## Annotation: hthgu133a 
## 
## $tcga.lowcor.outliers
## [1] "TCGA_eset:TCGA.24.1927" "TCGA_eset:TCGA.31.1955"
## 
## $test.mode
## [1] TRUE

Now that we have defined the sample filter, we create a list of ExpressionSet objects by sourcing the createEsetList.R file:

source(system.file("extdata", "createEsetList.R", package =
"curatedOvarianData"))
## 2026-10-10 10:32:29.700882 INFO::Inside script createEsetList.R - inputArgs =
## 2026-10-10 10:32:29.717946 INFO::Loading curatedOvarianData 1.51.5
## 2026-10-10 10:32:30.243763 INFO::Clean up the esets.
## 2026-10-10 10:32:30.309803 INFO::including E.MTAB.386_eset
## 2026-10-10 10:32:30.317951 INFO::excluding GSE12418_eset (min.number.of.events or min.sample.size)
## 2026-10-10 10:32:30.72802 INFO::excluding GSE12470_eset (min.number.of.events or min.sample.size)
## 2026-10-10 10:32:30.736186 INFO::including GSE13876_eset
## 2026-10-10 10:32:30.744557 INFO::including GSE14764_eset
## 2026-10-10 10:32:30.753247 INFO::including GSE17260_eset
## 2026-10-10 10:32:30.761519 INFO::including GSE18520_eset
## 2026-10-10 10:32:30.769648 INFO::including GSE19829.GPL570_eset
## 2026-10-10 10:32:30.778166 INFO::including GSE19829.GPL8300_eset
## 2026-10-10 10:32:30.787541 INFO::excluding GSE20565_eset (min.number.of.events or min.sample.size)
## 2026-10-10 10:32:30.796869 INFO::excluding GSE2109_eset (min.number.of.events or min.sample.size)
## 2026-10-10 10:32:30.806431 INFO::including GSE26193_eset
## 2026-10-10 10:32:30.816166 INFO::including GSE26712_eset
## 2026-10-10 10:32:30.826049 INFO::including GSE30009_eset
## 2026-10-10 10:32:30.835423 INFO::including GSE30161_eset
## 2026-10-10 10:32:30.845397 INFO::including GSE32062.GPL6480_eset
## 2026-10-10 10:32:30.854511 INFO::including GSE32063_eset
## 2026-10-10 10:32:30.875135 INFO::excluding GSE44104_eset (min.number.of.events or min.sample.size)
## 2026-10-10 10:32:30.883491 INFO::including GSE49997_eset
## 2026-10-10 10:32:30.891622 INFO::including GSE51088_eset
## 2026-10-10 10:32:30.89975 INFO::excluding GSE6008_eset (min.number.of.events or min.sample.size)
## 2026-10-10 10:32:30.907634 INFO::excluding GSE6822_eset (min.number.of.events or min.sample.size)
## 2026-10-10 10:32:30.915689 INFO::including GSE8842_eset
## 2026-10-10 10:32:30.923835 INFO::including GSE9891_eset
## 2026-10-10 10:32:30.931651 INFO::excluding PMID15897565_eset (min.number.of.events or min.sample.size)
## 2026-10-10 10:32:30.939805 INFO::including PMID17290060_eset
## 2026-10-10 10:32:30.947524 INFO::excluding PMID19318476_eset (min.number.of.events or min.sample.size)
## 2026-10-10 10:32:30.955692 INFO::including TCGA_eset
## 2026-10-10 10:32:30.963972 INFO::including TCGA.mirna.8x15kv2_eset
## 2026-10-10 10:32:30.972522 INFO::including TCGA.RNASeqV2_eset
## 2026-10-10 10:32:30.97586 INFO::Ids with missing data: GSE30009_eset, GSE51088_eset, GSE8842_eset

It is also possible to run the script from the command line and then load the R data file within R:

R --vanilla "--args patientselection.config ovarian.eset.rda tmp.log"  < createEsetList.R

Now we have datasets with samples that passed our filter in a list of ExpressionSet objects called esets:

names(esets)
##  [1] "E.MTAB.386_eset"         "GSE13876_eset"          
##  [3] "GSE14764_eset"           "GSE17260_eset"          
##  [5] "GSE18520_eset"           "GSE19829.GPL570_eset"   
##  [7] "GSE19829.GPL8300_eset"   "GSE26193_eset"          
##  [9] "GSE26712_eset"           "GSE30009_eset"          
## [11] "GSE30161_eset"           "GSE32062.GPL6480_eset"  
## [13] "GSE32063_eset"           "GSE49997_eset"          
## [15] "GSE51088_eset"           "GSE8842_eset"           
## [17] "GSE9891_eset"            "PMID17290060_eset"      
## [19] "TCGA_eset"               "TCGA.mirna.8x15kv2_eset"
## [21] "TCGA.RNASeqV2_eset"

Association of CXCL12 expression with overall survival

Next we use the list of datasets from the previous example and test if the expression of the CXCL12 gene is associated with overall survival. CXCL12/CXCR4 is a chemokine/chemokine receptor axis that has previously been shown to be directly involved in cancer pathogenesis.

We first define a function that will generate a forest plot for a given gene. It needs the overall survival information as Surv objects, which the createEsetList.R function already added in the phenoData slots of the ExpressionSet objects, accessible at the y label. The resulting forest plot is shown for the CXCL12 gene in the figure below.

esets[[1]]$y
##   [1]  840.9+  399.9+  524.1+ 1476.0   144.0   516.9   405.0    87.0    45.9+
##  [10]  483.9+  917.1  1013.1+   69.9   486.0   369.9  2585.1+  738.9   362.1 
##  [19] 2031.9+  477.9  1091.1+ 1062.0+  720.9  1200.9+  977.1   537.9   638.1 
##  [28]  587.1  1509.0  1619.1+ 1043.1   198.9  1520.1   696.9  1140.9  1862.1+
##  [37] 1751.1+ 1845.0+ 1197.0  1401.0   399.0   992.1   927.9+ 1509.0  1914.0+
##  [46]  591.9   426.0  1374.9+  546.9   809.1+  480.9+  486.0+  642.9+  540.9+
##  [55]  962.1  2025.0   473.1  1140.0   512.1  1002.9+ 1731.9+  690.0   930.0 
##  [64] 1026.9  1193.1+  720.9   369.0  1326.9+  501.9+ 1677.0+ 1773.9+  251.1 
##  [73] 1338.9+   35.1  1467.9+  165.9   981.9  1280.1  1800.0+  399.9   422.1 
##  [82]  861.9  2010.0+  660.0  2138.1+  516.0+ 1001.1+  693.9   825.0+  815.1+
##  [91]  657.0+ 1013.1+  426.0   656.1  1356.0  1610.1+ 1068.9+ 1221.9+ 2388.0+
## [100]  447.9+
forestplot <- function(esets, y="y", probeset, formula=y~probeset,
mlab="Overall", rma.method="FE", at=NULL,xlab="Hazard Ratio",...) {
    require(metafor)
    esets <- esets[sapply(esets, function(x) probeset %in% featureNames(x))]
    coefs <- sapply(1:length(esets), function(i) {
        tmp   <- as(phenoData(esets[[i]]), "data.frame")
        tmp$y <- esets[[i]][[y]]
        tmp$probeset <- exprs(esets[[i]])[probeset,]

        summary(coxph(formula,data=tmp))$coefficients[1,c(1,3)]
    })

    res.rma <- metafor::rma(yi = coefs[1,], sei = coefs[2,],
        method=rma.method)

    if (is.null(at)) at <- log(c(0.25,1,4,20))
    forest.rma(res.rma, xlab=xlab, slab=gsub("_eset$","",names(esets)),
    atransf=exp, at=at, mlab=mlab,...)
    return(res.rma)
}
res <- forestplot(esets=esets,probeset="CXCL12",at=log(c(0.5,1,2,4)))
## Loading required package: metafor
## Loading required package: Matrix
## Loading required package: metadat
## Loading required package: numDeriv
## 
## Loading the 'metafor' package (version 5.2-1). For an
## introduction to the package please type: help(metafor)

Figure 1: The database confirms CXCL12 as prognostic of overall survival in patients with ovarian cancer. Forest plot of the expression of the chemokine CXCL12 as a univariate predictor of overall survival, using all datasets with applicable expression and survival information. A hazard ratio significantly larger than 1 indicates that patients with high CXCL12 levels had poor outcome. The p-value for the overall HR, found in res$pval, is 7.1^{-5}. This plot is Figure 3 of the curatedOvarianData manuscript.

We now test whether CXCL12 is an independent predictor of survival in a multivariate model together with success of debulking surgery, defined as residual tumor smaller than 1 cm, and Federation of Gynecology and Obstetrics (FIGO) stage. We first filter the datasets without debulking and stage information:

idx.tumorstage <- sapply(esets, function(X)
    sum(!is.na(X$tumorstage)) > 0 & length(unique(X$tumorstage)) > 1)

idx.debulking <- sapply(esets, function(X)
    sum(X$debulking=="suboptimal",na.rm=TRUE)) > 0

In the figure below, we see that CXCL12 stays significant after adjusting for debulking status and FIGO stage. We repeated this analysis for the CXCR4 receptor and found no significant association with overall survival (Figure 3).

res <- forestplot(esets=esets[idx.debulking & idx.tumorstage],
    probeset="CXCL12",formula=y~probeset+debulking+tumorstage,
    at=log(c(0.5,1,2,4)))

Figure 2: Validation of CXCL12 as an independent predictor of survival. This figure shows a forest plot as in Figure 1, but the CXCL12 expression levels were adjusted for debulking status (optimal versus suboptimal) and tumor stage. The p-value for the overall HR, found in res\(pval, is `r signif(res\)pval, 2)`.

res <- forestplot(esets=esets,probeset="CXCR4",at=log(c(0.5,1,2,4)))

Figure 3: Up-regulation of CXCR4 is not associated with overall survival. This figure shows again a forest plot as in Figure 1, but here the association of mRNA expression levels of the CXCR4 receptor and overall survival is shown. The p-value for the overall HR, found in res$pval, is 0.88.

Batch correction with ComBat

If datasets are merged, it is typically recommended to remove a very likely batch effect. We will use the ComBat (Johnson et al. 2007) method, implemented for example in the SVA Bioconductor package (Leek et al., n.d.). To combine two ExpressionSet objects, we can use the combine() function. This function will fail when the two ExpressionSets have conflicting annotation slots, for example annotation when the platforms differ. We write a simple combine2 function which only considers the exprs and phenoData slots:

combine2 <- function(X1, X2) {
    fids <- intersect(featureNames(X1), featureNames(X2))
    X1 <- X1[fids,]
    X2 <- X2[fids,]
    ExpressionSet(cbind(exprs(X1),exprs(X2)),
        AnnotatedDataFrame(rbind(as(phenoData(X1),"data.frame"),
                                 as(phenoData(X2),"data.frame")))
    )
}

In Figure 4, we combined two datasets from different platforms, resulting in a huge batch effect.

E.MTAB.386_eset <- curatedOvarianData("E.MTAB.386_eset", test = TRUE)
GSE30161_eset <- curatedOvarianData("GSE30161_eset", test = TRUE)
X <- combine2(E.MTAB.386_eset, GSE30161_eset)
boxplot(exprs(X))

Figure 4: Boxplot showing the expression range for all samples of two merged datasets arrayed on different platforms. This illustrates a huge batch effect.

Now we apply ComBat and adjust for the batch and show the boxplot after batch correction in Figure 5:

mod <- model.matrix(~as.factor(tumorstage), data=X)
batch <- as.factor(grepl("DFCI",sampleNames(X)))
combat_edata <- ComBat(dat=exprs(X), batch=batch, mod=mod)
## Found2batches
## Adjusting for2covariate(s) or covariate level(s)
## Standardizing Data across genes
## Fitting L/S model and finding priors
## Finding parametric adjustments
## Adjusting the Data
boxplot(combat_edata)

Figure 5: Boxplot showing the expression range for all samples of two merged datasets arrayed on different platforms after batch correction with ComBat.

Non-specific probe sets

In the standard version of curatedOvarianData (the version available on Bioconductor), we collapse manufacturer probesets to official HGNC symbols using the Biomart database. Some probesets are mapped to multiple HGNC symbols in this database. For these probesets, we provide all the symbols. For example 220159_at maps to ABCA11P and ZNF721 and we provide ABCA11P///ZNF721 as probeset name. If you have an array of gene symbols for which you want to access the expression data, “ABCA11P” would not be found in curatedOvarianData in this example.

The script createEsetList.R provides three methods to deal with non-specific probe sets by setting the variable \(probes.not.mapped.uniquely\) to:

  • “keep”: leave as-is, these have “///” in gene names,
  • “drop”: drop any non-uniquely mapped features, or
  • “split”: split non-uniquely mapped features to one per row. If this creates duplicate rows for a gene, those rows are averaged.

This feature uses the following function to create a new ExpressionSet, in which both ZNF721 and ABCA11P are features with identical expression data:

expandProbesets <- function (eset, sep = "///")
{
    x <- lapply(featureNames(eset), function(x) strsplit(x, sep)[[1]])
    eset <- eset[order(sapply(x, length)), ]
    x <- lapply(featureNames(eset), function(x) strsplit(x, sep)[[1]])
    idx <- unlist(sapply(1:length(x), function(i) rep(i, length(x[[i]]))))
    xx <- !duplicated(unlist(x))
    idx <- idx[xx]
    x <- unlist(x)[xx]
    eset <- eset[idx, ]
    featureNames(eset) <- x
    eset
}

X <- TCGA_eset[head(grep("///", featureNames(TCGA_eset))),]
exprs(X)[,1:3]
##                                                         TCGA.20.0987
## ABCB4///ABCB1                                               2.993923
## ABCB6///ATG9A                                               4.257024
## ABCC6P2///ABCC6P1///ABCC6                                   3.110547
## ABHD17AP3///ABHD17AP2///ABHD17AP1///ABHD17AP6///ABHD17A     6.886997
## ACOT1///ACOT2                                               4.702057
## ACSM2A///ACSM2B                                             2.980667
##                                                         TCGA.23.1031
## ABCB4///ABCB1                                               3.600534
## ABCB6///ATG9A                                               4.793526
## ABCC6P2///ABCC6P1///ABCC6                                   4.909549
## ABHD17AP3///ABHD17AP2///ABHD17AP1///ABHD17AP6///ABHD17A     6.699198
## ACOT1///ACOT2                                               3.534889
## ACSM2A///ACSM2B                                             3.085545
##                                                         TCGA.24.0979
## ABCB4///ABCB1                                               3.539278
## ABCB6///ATG9A                                               5.476369
## ABCC6P2///ABCC6P1///ABCC6                                   4.993433
## ABHD17AP3///ABHD17AP2///ABHD17AP1///ABHD17AP6///ABHD17A     6.529303
## ACOT1///ACOT2                                               3.604559
## ACSM2A///ACSM2B                                             2.890781
exprs(expandProbesets(X))[,1:3]
##           TCGA.20.0987 TCGA.23.1031 TCGA.24.0979
## ABCB4         2.993923     3.600534     3.539278
## ABCB1         2.993923     3.600534     3.539278
## ABCB6         4.257024     4.793526     5.476369
## ATG9A         4.257024     4.793526     5.476369
## ACOT1         4.702057     3.534889     3.604559
## ACOT2         4.702057     3.534889     3.604559
## ACSM2A        2.980667     3.085545     2.890781
## ACSM2B        2.980667     3.085545     2.890781
## ABCC6P2       3.110547     4.909549     4.993433
## ABCC6P1       3.110547     4.909549     4.993433
## ABCC6         3.110547     4.909549     4.993433
## ABHD17AP3     6.886997     6.699198     6.529303
## ABHD17AP2     6.886997     6.699198     6.529303
## ABHD17AP1     6.886997     6.699198     6.529303
## ABHD17AP6     6.886997     6.699198     6.529303
## ABHD17A       6.886997     6.699198     6.529303

FULLVcuratedOvarianData

In curatedOvarianData, probesets mapping to the same gene symbol are merge by selecting the probeset with maximum mean across all studies of a given platform. You can see which representative probeset was chosen by looking at the featureData of the Expressionset, e.g.:

head(pData(featureData(GSE18520_eset)))
##                              probeset                      gene
## CXCL12                      209687_at                    CXCL12
## CXCR4                       217028_at                     CXCR4
## ABCB4///ABCB1             209994_s_at             ABCB4///ABCB1
## ABCB6///ATG9A               203192_at             ABCB6///ATG9A
## ABCB9///PITPNM2           232950_s_at           ABCB9///PITPNM2
## ABCC6P2///ABCC6P1///ABCC6   214033_at ABCC6P2///ABCC6P1///ABCC6

The historical FULLVcuratedOvarianData package with full, unmerged ExpressionSets is no longer distributed. Where official Bioconductor annotation packages are available for the array, these are stored in the ExpressionSet annotation slots, e.g.:

annotation(GSE18520_eset)
## [1] "hgu133plus2"

so that standard filtering methods such as nsFilter will work by default.

Available Clinical Characteristics

Figure 6: Available clinical annotation. This heatmap visualizes for each curated clinical characteristic (rows) the availability in each dataset (columns). Red indicates that the corresponding characteristic is available for at least one sample in the dataset. This plot is Figure 2 of the curatedOvarianData manuscript.

Summarizing the List of ExpressionSets

This example provides a table summarizing the datasets being used, and is useful when publishing analyses based on curatedOvarianData. First, define some useful functions for this purpose:

source(system.file("extdata", "summarizeEsets.R", package =
    "curatedOvarianData"))

Now create the table, used for Table 1 of the curatedOvarianData manuscript:

## Warning in min(which(km.fit$surv < 0.5)): no non-missing arguments to min;
## returning Inf
## Warning in min(which(km.fit$surv < 0.5)): no non-missing arguments to min;
## returning Inf

Optionally write this table to file, for example (replace myfile <- tempfile() with something like myfile <- “nicetable.csv”)

(myfile <- tempfile())
## [1] "/tmp/RtmpRuRhPj/file134c21305736"
write.table(summary.table, file=myfile, row.names=FALSE, quote=TRUE, sep=",")
Datasets provided by curatedOvarianData. This is an abbreviated version of Table 1 of the manuscript; the full version is written by the write.table command above. Stage column is early/late/unknown, histology column is ser/clearcell/endo/mucinous/other/unknown.
PMID N samples stage histology Platform
E.MTAB.386 22348002 100 1/99/0 100/0/0/0/0/0/0 Illumina humanRef-8 v2.0
GSE12418 16996261 54 0/54/0 54/0/0/0/0/0/0 SWEGENE H_v2.1.1_27k
GSE12470 19486012 53 8/35/10 43/0/0/0/0/0/10 Agilent G4110B
GSE13876 19192944 100 0/100/0 100/0/0/0/0/0/0 Operon v3 two-color
GSE14764 19294737 80 9/71/0 68/2/6/0/2/0/2 Affymetrix HG-U133A
GSE17260 20300634 100 0/100/0 100/0/0/0/0/0/0 Agilent G4112A
GSE18520 19962670 63 0/53/10 53/0/0/0/0/0/10 Affymetrix HG-U133Plus2
GSE19829.GPL570 20547991 28 0/0/28 0/0/0/0/0/0/28 Affymetrix HG-U133Plus2
GSE19829.GPL8300 20547991 42 0/0/42 0/0/0/0/0/0/42 Affymetrix HG_U95Av2
GSE20565 20492709 100 20/47/33 50/5/4/6/4/0/31 Affymetrix HG-U133Plus2
GSE2109 PMID unknown 100 25/47/28 38/6/12/8/28/0/8 Affymetrix HG-U133Plus2
GSE26193 22101765 100 27/73/0 74/6/7/8/5/0/0 Affymetrix HG-U133Plus2
GSE26712 18593951 100 0/90/10 90/0/0/0/0/0/10 Affymetrix HG-U133A
GSE30009 22492981 100 0/100/0 99/1/0/0/0/0/0 TaqMan qRT-PCR
GSE30161 22348014 58 0/58/0 47/5/1/1/1/0/3 Affymetrix HG-U133Plus2
GSE32062.GPL6480 22241791 100 0/100/0 100/0/0/0/0/0/0 Agilent G4112F
GSE32063 22241791 40 0/40/0 40/0/0/0/0/0/0 Agilent G4112F
GSE44104 23934190 60 25/35/0 28/12/11/9/0/0/0 Affymetrix HG-U133Plus2
GSE49997 22497737 100 2/93/5 83/0/0/0/12/0/5 ABI Human Genome
GSE51088 24368280 100 20/72/8 73/1/6/7/6/0/7 Agilent G4110B
GSE6008 19440550 100 42/53/5 41/8/37/13/0/0/1 Affymetrix HG-U133A
GSE6822 PMID unknown 66 0/0/66 41/11/7/1/0/0/6 Affymetrix Hu6800
GSE8842 19047114 83 83/0/0 31/16/17/17/1/0/1 Agilent G4100A cDNA
GSE9891 18698038 100 21/78/1 96/0/4/0/0/0/0 Affymetrix HG-U133Plus2
PMID15897565 15897565 63 11/52/0 63/0/0/0/0/0/0 Affymetrix HG-U133A
PMID17290060 17290060 100 1/99/0 100/0/0/0/0/0/0 Affymetrix HG-U133A
PMID19318476 19318476 42 2/39/1 42/0/0/0/0/0/0 Affymetrix HG-U133A
TCGA 21720365 100 3/91/6 95/0/0/0/0/0/5 Affymetrix HT_HG-U133A
TCGA.mirna.8x15kv2 21720365 100 12/87/1 100/0/0/0/0/0/0 Agilent miRNA-8x15k2 G4470B
TCGA.RNASeqV2 21720365 100 6/93/1 100/0/0/0/0/0/0 Illumina HiSeq RNA sequencing

For non-R users

If you are not doing your analysis in R, and just want to get some data you have identified from the curatedOvarianData manual, here is a simple way to do it. For one dataset:

library(curatedOvarianData)
GSE30161_eset <- curatedOvarianData("GSE30161_eset")
write.csv(exprs(GSE30161_eset), file="GSE30161_eset_exprs.csv")
write.csv(pData(GSE30161_eset), file="GSE30161_eset_clindata.csv")

Or for several datasets:

data.to.fetch <- curatedOvarianData(c("GSE30161_eset", "E.MTAB.386_eset"))
for (onedata in names(data.to.fetch)){
    write.csv(exprs(data.to.fetch[[onedata]]),
              file=paste(onedata, "_exprs.csv", sep=""))
    write.csv(pData(data.to.fetch[[onedata]]),
              file=paste(onedata, "_clindata.csv", sep=""))
}

Session Info

sessionInfo()
## R version 4.6.1 (2026-06-24)
## Platform: x86_64-pc-linux-gnu
## Running under: Ubuntu 26.04.1 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
## LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.32.so;  LAPACK version 3.12.0
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
##  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
##  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
## 
## time zone: Etc/UTC
## tzcode source: system (glibc)
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] metafor_5.2-1             numDeriv_2016.8-1.1      
##  [3] metadat_1.6-0             Matrix_1.7-6             
##  [5] survival_3.8-12           logging_0.10-111         
##  [7] sva_3.61.0                BiocParallel_1.47.0      
##  [9] genefilter_1.95.0         mgcv_1.9-4               
## [11] nlme_3.1-171              curatedOvarianData_1.51.5
## [13] Biobase_2.73.2            BiocGenerics_0.59.12     
## [15] generics_0.1.4            BiocStyle_2.41.0         
## 
## loaded via a namespace (and not attached):
##  [1] KEGGREST_1.53.6       xfun_0.61             bslib_0.12.0         
##  [4] httr2_1.3.0           lattice_0.23-1        mathjaxr_2.0-0       
##  [7] vctrs_0.7.3           tools_4.6.1           parallel_4.6.1       
## [10] stats4_4.6.1          curl_8.0.0            tibble_3.3.1         
## [13] AnnotationDbi_1.75.2  RSQLite_3.53.3        blob_1.3.0           
## [16] pkgconfig_2.0.3       BiocBaseUtils_1.15.1  dbplyr_2.6.0         
## [19] S4Vectors_0.51.10     lifecycle_1.0.5       compiler_4.6.1       
## [22] Biostrings_2.81.9     statmod_1.5.2         codetools_0.2-20     
## [25] Seqinfo_1.3.2         htmltools_0.5.9       sys_3.4.3            
## [28] buildtools_1.0.0      sass_0.4.10           yaml_2.3.12          
## [31] pillar_1.11.1         crayon_1.5.3          jquerylib_0.1.4      
## [34] limma_3.99.0          cachem_1.1.0          locfit_1.5-9.12      
## [37] tidyselect_1.2.1      digest_0.6.39         dplyr_1.2.1          
## [40] maketools_1.3.2       splines_4.6.1         fastmap_1.2.0        
## [43] grid_4.6.1            cli_3.6.6             magrittr_2.0.5       
## [46] XML_3.99-0.25         edgeR_4.99.6          filelock_1.0.3       
## [49] bit64_4.8.6           rmarkdown_2.32        XVector_0.53.0       
## [52] httr_1.4.9            matrixStats_1.5.0     bit_4.6.0            
## [55] otel_0.2.0            png_0.1-9             memoise_2.0.1        
## [58] evaluate_1.0.5        knitr_1.52            IRanges_2.47.5       
## [61] BiocFileCache_3.3.0   rlang_1.3.0           xtable_1.8-8         
## [64] glue_1.8.1            DBI_1.3.0             BiocManager_1.30.27  
## [67] annotate_1.91.0       jsonlite_2.0.0        R6_2.6.1             
## [70] MatrixGenerics_1.25.0

References

Ganzfried, Benjamin Frederick, Markus Riester, Benjamin Haibe-Kains, et al. 2013. “curatedOvarianData: Clinically Annotated Data for the Ovarian Cancer Transcriptome.” Database 2013: bat013.
Johnson, W E, C Li, and A Rabinovic. 2007. “Adjusting Batch Effects in Microarray Expression Data Using Empirical Bayes Methods.” Biostatistics 8 (1): 118–27.
Leek, Jeffrey T., W. Evan Johnson, Hilary S. Parker, Andrew E. Jaffe, and John D. Storey. n.d. Sva: Surrogate Variable Analysis.
Waldron, Levi, Benjamin Haibe-Kains, Aedı́n C Culhane, et al. 2014. “Comparative Meta-Analysis of Prognostic Gene Signatures for Late-Stage Ovarian Cancer.” J. Natl. Cancer Inst. 106 (5). https://doi.org/10.1093/jnci/dju049.