From GEO to downstream analysis

Sean Davis

GEOquery’s job ends once your data is a Bioconductor object. This article is a map of where to go next — how the object you got from getGEO() connects to the rest of the Bioconductor ecosystem — rather than a tutorial for any one method. The goal is to save you the “I have a SummarizedExperiment, now what?” moment.

Know your object

What you do next depends on what GEOquery returned (see Understanding GEO data formats):

You have Typical source Downstream entry point
SummarizedExperiment (list) GSE Series Matrix (default), RNA-seq counts limma / DESeq2 / edgeR
ExpressionSet (list) GSE Series Matrix with returnType = "ExpressionSet" limma
SingleCellExperiment single-cell readers scater / scran / OSCA
GSE/GSM/GPL/GDS S4 SOFT parsing accessors, then convert

Microarray: limma

Microarray Series Matrix data arrives already processed (typically log-transformed, normalized intensities). The standard path is a linear model with limma, which accepts a matrix:

library(limma)
library(SummarizedExperiment)
se <- getGEO("GSE2553")[[1]]                 # SummarizedExperiment (default)

# `group` here stands in for a real grouping column you derive from the sample
# metadata -- see the note below; it will not exist verbatim in colData(se).
design <- model.matrix(~ group, data = colData(se))
fit <- eBayes(lmFit(assay(se), design))
topTable(fit, coef = 2)

The hardest part is usually not the model but extracting clean grouping variables from colData(se) — GEO sample metadata is free text, so expect to parse characteristics_ch1 fields into the factor you actually model.

RNA-seq counts: DESeq2 / edgeR / limma-voom

For NCBI-computed RNA-seq counts (see the RNA-seq article), use a count-based model. The SummarizedExperiment GEOquery returns plugs directly into DESeq2:

library(DESeq2)
se <- getRNASeqData("GSE164073")
# `condition` must be a real column you added to colData(se) first.
dds <- DESeqDataSet(se, design = ~ condition)
dds <- DESeq(dds)
results(dds)

edgeR and limma-voom are equally good choices and consume the same count matrix.

Single cell: the OSCA stack

A SingleCellExperiment from the single-cell readers is the entry point to Bioconductor’s single-cell ecosystem — scater, scran, and the OSCA book for the full quality-control → normalization → clustering → annotation arc.

Converting and annotating

Two recurring needs:

Reproducibility

GEO records can change and large downloads are slow, so cache deliberately and record versions. The Finding and downloading data article covers persistent caching (destdir= and the BiocFileCache layer); alongside that, capture sessionInfo() with your results so the GEOquery and dependency versions are pinned.

Where to go next