The gateR package is a suite of R functions to identify significant spatial clustering of flow and mass cytometry data used in immunological investigations. For a two-group comparison we detect clusters using the kernel-based spatial relative risk function that is estimated using the sparr package. The tests are conducted in two-dimensional space comprised of two fluorescent markers.
Examples of a single condition with two groups:
- Disease case v. healthy control
- Time 2 v. Time 1 (baseline)
For a two-group comparison of two conditions we estimate two relative risk surfaces for one condition and then a ratio of the relative risks. For example:
- Estimate a relative risk surface for:
- Condition 2B v. Condition 2A
- Condition 1B v. Condition 1A
- Estimate relative risk surface for the ratio:
Within areas where the relative risk exceeds an asymptotic normal assumption, the gateR package has functionality to examine the features of these cells. Basic visualization is also supported.
To install the release version from CRAN:
install.packages("gateR")
To install the development version from GitHub:
devtools::install_github("Waller-SUSAN/gateR")
| Function | Description |
|---|---|
gating |
Main function. Conduct a gating strategy for flow and mass cytometry data. |
rrs |
Called within gating, one condition comparison. |
lotrrs |
Called within gating, two condition comparison. |
pval_correct |
Called within rrs and lotrrs, calculates a Bonferroni corrected alpha level that accounts for the spatial correlation of a relative risk surface. |
lrr_plot |
Called within rrs and lotrrs, provides functionality for basic visualization of a log relative risk surface. |
pval_plot |
Called within rrs and lotrrs, provides functionality for basic visualization of a significant p-value surface. |
| Function | Description |
|---|---|
randCyto |
A sample dataset containing information about flow cytometry data with two binary conditions and four markers. The data are a random subset of the 'extdata' data in the flowWorkspaceData package found on Bioconductor and formated for `gateR` input. |
- Ian D. Buller - Occupational and Environmental Epidemiology Branch, Division of Cancer Epidemiology and Genetics, National Cancer Institute, National Institutes of Health, Rockville, Maryland - GitHub
See also the list of contributors who participated in this project. Main contributors include:
- Elena Hsieh - Immunology & Microbiology and Pediatrics, University of Colorado Anschutz School of Medicine - GitHub
- Debashis Ghosh - Biostatistics & Informatics, Colorado School of Public Health, Aurora, Colorado - GitHub
- Lance A. Waller - Biostatistics and Bioinformatics, Emory University, Atlanta, Georgia - GitHub
set.seed(1234) # for reproducibility
# ------------------ #
# Necessary packages #
# ------------------ #
library(gateR)
library(dplyr)
library(flowWorkspaceData)
library(ncdfFlow)
library(stats)
# ---------------- #
# Data preparation #
# ---------------- #
# Use 'extdata' from the {flowWorkspaceData} package
flowDataPath <- system.file("extdata", package = "flowWorkspaceData")
fcsFiles <- list.files(pattern = "CytoTrol", flowDataPath, full = TRUE)
ncfs <- ncdfFlow::read.ncdfFlowSet(fcsFiles)
fr1 <- ncfs[[1]]
fr2 <- ncfs[[2]]
## Comparison of two samples (single condition) "g1"
## Two gates (four markers) "CD4", "CD38", "CD8", and "CD3"
## Arcsinh Transformation for all markers
## Remove cells with NA and Inf values
# First sample
obs_dat1 <- data.frame("id" = seq(1, nrow(fr1@exprs), 1),
"g1" = rep(1, nrow(fr1@exprs)),
"arcsinh_CD4" = asinh(fr1@exprs[ , 5]),
"arcsinh_CD38" = asinh(fr1@exprs[ , 6]),
"arcsinh_CD8" = asinh(fr1@exprs[ , 7]),
"arcsinh_CD3" = asinh(fr1@exprs[ , 8]))
# Second sample
obs_dat2 <- data.frame("id" = seq(1, nrow(fr2@exprs), 1),
"g1" = rep(2, nrow(fr2@exprs)),
"arcsinh_CD4" = asinh(fr2@exprs[ , 5]),
"arcsinh_CD38" = asinh(fr2@exprs[ , 6]),
"arcsinh_CD8" = asinh(fr2@exprs[ , 7]),
"arcsinh_CD3" = asinh(fr2@exprs[ , 8]))
# Full set
obs_dat <- rbind(obs_dat1, obs_dat2)
obs_dat <- obs_dat[complete.cases(obs_dat), ] # remove NAs
obs_dat <- obs_dat[is.finite(rowSums(obs_dat)), ] # remove Infs
obs_dat$g1 <- as.factor(obs_dat$g1) # set "g1" as binary factor
## Create a second condition (randomly split the data)
## In practice, use data with a measured second condition
g2 <- stats::rbinom(nrow(obs_dat), 1, 0.5)
obs_dat$g2 <- as.factor(g2)
obs_dat <- obs_dat[ , c(1:2,7,3:6)]
# Export 'randCyto' data for CRAN examples
randCyto <- dplyr::sample_frac(obs_dat, size = 0.1) # random subsample
# ---------------------------- #
# Run gateR with one condition #
# ---------------------------- #
# Single condition
## A p-value uncorrected for multiple testing
test_gating <- gateR::gating(dat = obs_dat,
vars = c("arcsinh_CD4", "arcsinh_CD38",
"arcsinh_CD8", "arcsinh_CD3"),
n_condition = 1,
plot_gate = TRUE,
upper_lrr = 1,
lower_lrr = -1)
# -------------------- #
# Post-gate assessment #
# -------------------- #
# Density of arcsinh-transformed CD4 post-gating
graphics::plot(stats::density(test_gating$obs[test_gating$obs$g1 == 1, 4]),
main = "arcsinh CD4",
lty = 2)
graphics::lines(stats::density(test_gating$obs[test_gating$obs$g1 == 2, 4]),
lty = 3)
graphics::legend("topright",
legend = c("Sample 1", "Sample 2"),
lty = c(2, 3),
bty = "n")# ----------------------------- #
# Run gateR with two conditions #
# ----------------------------- #
## A p-value uncorrected for multiple testing
test_gating2 <- gateR::gating(dat = obs_dat,
vars = c("arcsinh_CD4", "arcsinh_CD38",
"arcsinh_CD8", "arcsinh_CD3"),
n_condition = 2)
# --------------------------------------------- #
# Perform a single gate without data extraction #
# --------------------------------------------- #
# Single condition
## A p-value uncorrected for multiple testing
## For "arcsinh_CD4" and "arcsinh_CD38"
test_rrs <- gateR::rrs(dat = obs_dat[ , -7:-6])
# Two conditions
## A p-value uncorrected for multiple testing
## For "arcsinh_CD8" and "arcsinh_CD3"
test_lotrrs <- gateR::lotrrs(dat = obs_dat[ , -5:-4])


