To fully understand the provenance of data in the tuberculosis
R/Bioconductor package, please see the tuberculosis.pipeline
GitHub repository; however, all users beyond the extremely curious can
ignore these details without consequence. Yet, a brief summary of data
processing is appropriate here. Microarray data were processed from raw
files (e.g. CEL files) and background corrected using the
normal-exponential method and the saddle-point approximation to maximum
likelihood as implemented in the limma
R/Bioconductor package; no normalization of expression values was done;
where platforms necessitated it, the RMA (robust multichip average)
algorithm without background correction or normalization was used to
generate an expression matrix. Sequencing data were processed from raw
files (i.e. fastq files) using the nf-core/rnaseq pipeline inside
a Singularity container; the GRCh38 genome build was used for alignment.
Gene names for both microarray and sequencing data are HGNC-approved
GRCh38 gene names from the genenames.org REST API.
To install tuberculosis from Bioconductor, use BiocManager as follows.
To install tuberculosis from GitHub, use BiocManager as follows.
Most users should simply install tuberculosis from Bioconductor.
To use the package without double colon syntax, it should be loaded as follows.
The package is lightweight, with few dependencies, and contains no data itself.
To find data, users will use the tuberculosis function
with a regular expression pattern to list available resources. The
resources are organized by GEO series accession
numbers. If multiple platforms were used in a single study, the platform
accession number follows the series accession number and is separated by
a dash. The date before the series accession number denotes the date the
resource was created.
## 2021-09-15.GSE103147
The function will print the names of matching resources as a message
and return them invisibly as a character vector. To see all available
resources use "." for the pattern
argument.
To get data, users will also use the tuberculosis
function, but with an additional argument, dryrun = FALSE.
This will either download resources from ExperimentHub
or load them from the user’s local cache. If a resource has multiple
creation dates, the most recent is selected by default; add a date to
override this behavior.
## $`2021-09-15.GSE103147`
## class: SummarizedExperiment
## dim: 24353 1649
## metadata(0):
## assays(1): exprs
## rownames(24353): A1BG A1BG-AS1 ... ZZEF1 ZZZ3
## rowData names(0):
## colnames(1649): SRR5980424 SRR5980425 ... SRR5982072 SRR5982073
## colData names(0):
The function returns a list of
SummarizedExperiment objects, each with a single assay,
exprs, where the rows are features (genes) and the columns
are observations (samples). If multiple resources are requested,
multiple resources will be returned, each as a list
element.
## $`2021-09-15.GSE107991`
## class: SummarizedExperiment
## dim: 24353 54
## metadata(0):
## assays(1): exprs
## rownames(24353): A1BG A1BG-AS1 ... ZZEF1 ZZZ3
## rowData names(0):
## colnames(54): SRR6369879 SRR6369880 ... SRR6369931 SRR6369932
## colData names(0):
##
## $`2021-09-15.GSE107992`
## class: SummarizedExperiment
## dim: 24353 47
## metadata(0):
## assays(1): exprs
## rownames(24353): A1BG A1BG-AS1 ... ZZEF1 ZZZ3
## rowData names(0):
## colnames(47): SRR6369945 SRR6369946 ... SRR6369990 SRR6369991
## colData names(0):
##
## $`2021-09-15.GSE107993`
## class: SummarizedExperiment
## dim: 24353 138
## metadata(0):
## assays(1): exprs
## rownames(24353): A1BG A1BG-AS1 ... ZZEF1 ZZZ3
## rowData names(0):
## colnames(138): SRR6370167 SRR6370168 ... SRR6370303 SRR6370304
## colData names(0):
##
## $`2021-09-15.GSE107994`
## class: SummarizedExperiment
## dim: 24353 175
## metadata(0):
## assays(1): exprs
## rownames(24353): A1BG A1BG-AS1 ... ZZEF1 ZZZ3
## rowData names(0):
## colnames(175): SRR6369992 SRR6369993 ... SRR6370165 SRR6370166
## colData names(0):
##
## $`2021-09-15.GSE107995`
## class: SummarizedExperiment
## dim: 24353 414
## metadata(0):
## assays(1): exprs
## rownames(24353): A1BG A1BG-AS1 ... ZZEF1 ZZZ3
## rowData names(0):
## colnames(414): SRR6369879 SRR6369880 ... SRR6370303 SRR6370304
## colData names(0):
The assay of each SummarizedExperiment
object is named exprs rather than counts
because it can come from either a microarray or a sequencing platform.
If colnames begin with GSE, data comes from a
microarray platform; if colnames begin with
SRR, data comes from a sequencing platform.
The SummarizedExperiment objects do not have sample
metadata as colData, and this limits their use to
unsupervised analyses for the time being. Sample metadata are currently
undergoing manual curation, with the same level of diligence that was
applied in data processing, and will be included in the package when
they are ready.
No Bioconductor package is complete without at least a miniature demonstration analysis, but it is difficult to provide any substantial machine learning analysis without the necessary labels. Therefore, a only a dimension reduction, that is by no means machine learning, is provided here for example with the expectation that it will be replaced in the future.
The largest resource available in the tuberculosis
package comes from GEO
series accession GSE103147, data that was originally
published by Zak et al. in 2016.1 To download this data
for use in dimension reduction, the tuberculosis function
is used; then, magrittr::use_series is used to select the
SummarizedExperiment object from the list that
was returned.
zak_data <-
tuberculosis("GSE103147", dryrun = FALSE) |>
magrittr::use_series("2021-09-15.GSE103147")Even though they are not used, the sample identifiers (i.e. column
names) of the zak_data will become the row names of the
UMAP data.frame, and they are serialized below for use in
setting row names later.
Serialization is also done for column names, only they are created
using purrr::map_chr instead. The embedding will be in two
dimensions, therefore axis labels, UMAP1 and
UMAP2, are created.
The scater
package is used to calculate UMAP coordinates, which are piped to magrittr to
set the row and column names. Once the matrix returned by
scater::calculateUMAP is coerced to a
data.frame, ggplot2 is
used to plot the embedding and hrbrthemes
is used for theming.
scater::calculateUMAP(zak_data, exprs_values = "exprs") |>
magrittr::set_rownames(row_names) |>
magrittr::set_colnames(col_names) |>
base::as.data.frame() |>
ggplot2::ggplot(mapping = ggplot2::aes(UMAP1, UMAP2)) +
ggplot2::geom_point()## Warning in (function (A, nv = 5, nu = nv, maxit = 1000, work = nv + 16, : A is
## neither real nor complex-valued. Attempting to coerce A to real values
## (double-precision numbers). This might not be what you intend, beware!
The embedding displays four distinct clusters, perhaps pertaining to stages of progression of tuberculosis infection as distinct classes; although, definitive conclusions are difficult to make without sufficient labeling of clinical sequelae. Again, as stated above, such labels are currently being curated, and will be included in the package when they are ready.
## 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] stats4 stats graphics grDevices utils datasets methods
## [8] base
##
## other attached packages:
## [1] tuberculosis_1.19.0 SummarizedExperiment_1.43.0
## [3] Biobase_2.73.2 GenomicRanges_1.65.4
## [5] Seqinfo_1.3.2 IRanges_2.47.5
## [7] S4Vectors_0.51.10 BiocGenerics_0.59.12
## [9] generics_0.1.4 MatrixGenerics_1.25.0
## [11] matrixStats_1.5.0 BiocStyle_2.41.0
##
## loaded via a namespace (and not attached):
## [1] DBI_1.3.0 gridExtra_2.3.1
## [3] httr2_1.3.0 rlang_1.3.0
## [5] magrittr_2.0.5 scater_1.41.2
## [7] compiler_4.6.1 RSQLite_3.53.3
## [9] png_0.1-9 vctrs_0.7.3
## [11] stringr_1.6.0 pkgconfig_2.0.3
## [13] crayon_1.5.3 fastmap_1.2.0
## [15] dbplyr_2.6.0 XVector_0.53.0
## [17] labeling_0.4.3 scuttle_1.23.2
## [19] rmarkdown_2.32 ggbeeswarm_0.7.3
## [21] purrr_1.2.2 bit_4.6.0
## [23] xfun_0.61 cachem_1.1.0
## [25] beachmat_2.29.3 jsonlite_2.0.0
## [27] blob_1.3.0 DelayedArray_0.39.8
## [29] BiocParallel_1.47.0 irlba_2.4.1
## [31] parallel_4.6.1 R6_2.6.1
## [33] bslib_0.12.0 stringi_1.8.9
## [35] RColorBrewer_1.1-3 jquerylib_0.1.4
## [37] Rcpp_1.1.2 knitr_1.52
## [39] FNN_1.1.4.1 BiocBaseUtils_1.15.1
## [41] Matrix_1.7-6 tidyselect_1.2.1
## [43] abind_1.4-8 yaml_2.3.12
## [45] viridis_0.6.5 codetools_0.2-20
## [47] curl_8.0.0 lattice_0.23-1
## [49] tibble_3.3.1 withr_3.0.3
## [51] KEGGREST_1.53.6 S7_0.2.2
## [53] evaluate_1.0.5 BiocFileCache_3.3.0
## [55] ExperimentHub_3.3.2 Biostrings_2.81.9
## [57] pillar_1.11.1 BiocManager_1.30.27
## [59] filelock_1.0.3 BiocVersion_3.24.0
## [61] ggplot2_4.0.3 scales_1.4.0
## [63] glue_1.8.1 maketools_1.3.2
## [65] tools_4.6.1 AnnotationHub_4.3.2
## [67] BiocNeighbors_2.7.3 sys_3.4.3
## [69] RSpectra_0.16-2 ScaledMatrix_1.21.0
## [71] buildtools_1.0.0 grid_4.6.1
## [73] tidyr_1.3.2 AnnotationDbi_1.75.2
## [75] SingleCellExperiment_1.35.2 beeswarm_0.4.0
## [77] BiocSingular_1.29.2 vipor_0.4.7
## [79] cli_3.6.6 rsvd_1.0.5
## [81] rappdirs_0.3.4 S4Arrays_1.13.2
## [83] viridisLite_0.4.3 dplyr_1.2.1
## [85] uwot_0.2.5 gtable_0.3.6
## [87] sass_0.4.10 digest_0.6.39
## [89] SparseArray_1.13.4 ggrepel_0.9.8
## [91] farver_2.1.2 memoise_2.0.1
## [93] htmltools_0.5.9 lifecycle_1.0.5
## [95] httr_1.4.9 bit64_4.8.6
Zak, D. E. et al. A blood RNA signature for tuberculosis disease risk: a prospective cohort study. Lancet 387, 2312–2322 (2016)↩︎