The HighlyReplicatedRNASeq package provides functions to access the count matrix from bulk RNA-seq studies with many replicates. For example,the study from Schurch et al. (2016) has data on 86 samples of S. cerevisiae in two conditions.
To load the dataset, call the Schurch16()
function. It returns a SummarizedExperiment:
schurch_se <- HighlyReplicatedRNASeq::Schurch16()
#> see ?HighlyReplicatedRNASeq and browseVignettes('HighlyReplicatedRNASeq') for documentation
#> loading from cache
#> see ?HighlyReplicatedRNASeq and browseVignettes('HighlyReplicatedRNASeq') for documentation
#> loading from cache
schurch_se
#> class: SummarizedExperiment
#> dim: 7126 86
#> metadata(0):
#> assays(1): counts
#> rownames(7126): 15S_rRNA 21S_rRNA ... tY(GUA)O tY(GUA)Q
#> rowData names(0):
#> colnames(86): wildtype_01 wildtype_02 ... knockout_47 knockout_48
#> colData names(4): file_name condition replicate name
An alternative approach that achieves exactly the same is to load the data directly from ExperimentHub
library(ExperimentHub)
eh <- ExperimentHub()
records <- query(eh, "HighlyReplicatedRNASeq")
records[1] ## display the metadata for the first resource
#> ExperimentHub with 1 record
#> # snapshotDate(): 2024-10-24
#> # names(): EH3315
#> # package(): HighlyReplicatedRNASeq
#> # $dataprovider: Geoff Barton's group on GitHub
#> # $species: Saccharomyces cerevisiae BY4741
#> # $rdataclass: matrix
#> # $rdatadateadded: 2020-04-03
#> # $title: Schurch S. cerevesiae Highly Replicated Bulk RNA-Seq Counts
#> # $description: Count matrix for bulk RNA-sequencing dataset from 86 S. cere...
#> # $taxonomyid: 1247190
#> # $genome: Ensembl release 68
#> # $sourcetype: tar.gz
#> # $sourceurl: https://github.com/bartongroup/profDGE48
#> # $sourcesize: NA
#> # $tags: c("ExperimentHub", "ExperimentData", "ExpressionData",
#> # "SequencingData", "RNASeqData")
#> # retrieve record with 'object[["EH3315"]]'
count_matrix <- records[["EH3315"]] ## load the count matrix by ID
#> see ?HighlyReplicatedRNASeq and browseVignettes('HighlyReplicatedRNASeq') for documentation
#> loading from cache
count_matrix[1:10, 1:5]
#> wildtype_01 wildtype_02 wildtype_03 wildtype_04 wildtype_05
#> 15S_rRNA 2 12 31 8 21
#> 21S_rRNA 20 76 101 99 128
#> HRA1 3 2 2 2 3
#> ICR1 75 123 107 157 98
#> LSR1 60 163 233 163 193
#> NME1 13 14 23 13 29
#> PWR1 0 0 0 0 0
#> Q0010 0 0 0 0 0
#> Q0017 0 0 0 0 0
#> Q0032 0 0 0 0 0
It has 7126 genes and 86 samples. The counts are between 0 and 467,000.
summary(c(assay(schurch_se, "counts")))
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 0 89 386 1229 924 467550
To make the data easier to work with, I will “normalize” the data. First I divide it by the mean of each sample to account for the differential sequencing depth. Then, I apply the log()
transformation and add a small number to avoid taking the logarithm of 0.
norm_counts <- assay(schurch_se, "counts")
norm_counts <- log(norm_counts / colMeans(norm_counts) + 0.001)
The histogram of the transformed data looks very smooth:
hist(norm_counts, breaks = 100)
Finally, let us take a look at the MA-plot of the data and the volcano plot:
wt_mean <- rowMeans(norm_counts[, schurch_se$condition == "wildtype"])
ko_mean <- rowMeans(norm_counts[, schurch_se$condition == "knockout"])
plot((wt_mean+ ko_mean) / 2, wt_mean - ko_mean,
pch = 16, cex = 0.4, col = "#00000050", frame.plot = FALSE)
abline(h = 0)