spicyR 1.0.1
if (!require("BiocManager"))
install.packages("BiocManager")
BiocManager::install("spicyR")
# load required packages
library(spicyR)
library(ggplot2)
Clustering local indicators of spatial association (LISA) functions is a
methodology for identifying consistent spatial organisation of multiple
cell-types in an unsupervised way. This can be used to enable the
characterization of interactions between multiple cell-types simultaneously and
can complement traditional pairwise analysis. In our implementation our LISA
curves are a localised summary of an L-function from a Poisson point process
model. Our framework lisaClust
can be used to provide a high-level summary
of cell-type colocalization in high-parameter spatial cytometry data,
facilitating the identification of distinct tissue compartments or
identification of complex cellular microenvironments.
TO illustrate our lisaClust
framework, here we consider a very simple toy
example where two cell-types are completely separated spatially. We simulate
data for two different images.
set.seed(51773)
x <- round(c(runif(200),runif(200)+1,runif(200)+2,runif(200)+3,
runif(200)+3,runif(200)+2,runif(200)+1,runif(200)),4)
y <- round(c(runif(200),runif(200)+1,runif(200)+2,runif(200)+3,
runif(200),runif(200)+1,runif(200)+2,runif(200)+3),4)
cellType <- factor(paste('c',rep(rep(c(1:2),rep(200,2)),4),sep = ''))
imageID <- rep(c('s1', 's2'),c(800,800))
cells <- data.frame(x, y, cellType, imageID)
ggplot(cells, aes(x,y, colour = cellType)) + geom_point() + facet_wrap(~imageID)
First we store our datas into a SegmentedCells
object.
cellExp <- SegmentedCells(cells, cellTypeString = 'cellType')
We can then calculate local indicators of spatial association (LISA) functions
using the lisa
function. In our implementation, our LISA curves are a
localised summary of an L-function from a Poisson point process model. By
default, lisa
will calculate curves for 20 ‘sensible’ radii for each
cell-type.
lisaCurves <- lisa(cellExp)
The LISA curves can then be used to cluster the cells. Here we use k-means
clustering, other clustering methods like SOM could be used. We can store these
cell clusters or cell “regions” in our SegmentedCells
object using the
region() <-
function.
kM <- kmeans(lisaCurves,2)
region(cellExp) <- paste('region',kM$cluster,sep = '_')
The hatchingPlot
function can be used to construct a ggplot
object where the
regions are marked by different hatching patterns. This allows us to plot both
regions and cell-types on the same visualization.
hatchingPlot(cellExp, imageID = c('s1','s2'))
We could also create this plot using geom_hatching
and scale_region_manual
.
df <- region(cellExp, annot = TRUE)
p <- ggplot(df,aes(x = x,y = y, colour = cellType, region = region)) +
geom_point() +
facet_wrap(~imageID) +
geom_hatching(window = "concave",
line.spacing = 11,
nbp = 50,
line.width = 1.5,
window.length = 0.1) +
theme_minimal() +
scale_region_manual(values = 6:7, labels = c('ab','cd'))
p
Here we apply our lisaClust
framework to three images of pancreatic islets
from A Map of Human Type 1 Diabetes Progression by Imaging Mass Cytometry by
Damond et al. (2019).
We will start by reading in the data and storing it as a SegmentedCells
object. Here the data is in a format consistent with that outputted by
CellProfiler.
isletFile <- system.file("extdata","isletCells.txt.gz", package = "spicyR")
cells <- read.table(isletFile, header = TRUE)
cellExp <- SegmentedCells(cells, cellProfiler = TRUE)
This data does not include annotation of the cell-types of each cell. Here we
extract the marker intensities from the SegmentedCells
object using
cellMarks
. We then perform k-means clustering with eight clusters and store
these cell-type clusters in our SegmentedCells
object using cellType() <-
.
markers <- cellMarks(cellExp)
kM <- kmeans(markers,10)
cellType(cellExp) <- paste('cluster', kM$cluster, sep = '')
As before, we can calculate local indicators of spatial association (LISA)
functions using the lisa
function. In our implementation, our LISA curves are
a localised summary of an L-function from a Poisson point process model. By
default, lisa
will calculate curves for 20 ‘sensible’ radii for each
cell-type.
lisaCurves <- lisa(cellExp, Rs = c(10,20,50))
The LISA curves can then be used to cluster the cells. Here we use k-means
clustering to cluster the cells into two microenvironments, other clustering
methods like SOM could be used. We can store these cell clusters or cell
“regions” in our SegmentedCells
object using the region() <-
function.
kM <- kmeans(lisaCurves,2)
region(cellExp) <- paste('region',kM$cluster,sep = '_')
Finally, we can use hatchingPlot
to construct a ggplot
object where the
regions are marked by different hatching patterns. This allows us to visualize
the two regions and eight cell-types simultaneously.
hatchingPlot(cellExp)
sessionInfo()
## R version 4.0.2 (2020-06-22)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 18.04.4 LTS
##
## Matrix products: default
## BLAS: /home/biocbuild/bbs-3.11-bioc/R/lib/libRblas.so
## LAPACK: /home/biocbuild/bbs-3.11-bioc/R/lib/libRlapack.so
##
## locale:
## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
## [3] LC_TIME=en_US.UTF-8 LC_COLLATE=C
## [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
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] ggplot2_3.3.2 spicyR_1.0.1 BiocStyle_2.16.0
##
## loaded via a namespace (and not attached):
## [1] Rcpp_1.0.5 lattice_0.20-41 deldir_0.1-25
## [4] class_7.3-17 digest_0.6.25 V8_3.2.0
## [7] R6_2.4.1 stats4_4.0.2 evaluate_0.14
## [10] tensor_1.5 pillar_1.4.6 rlang_0.4.7
## [13] curl_4.3 minqa_1.2.4 nloptr_1.2.2.2
## [16] magick_2.4.0 S4Vectors_0.26.1 rpart_4.1-15
## [19] Matrix_1.2-18 goftest_1.2-2 rmarkdown_2.3
## [22] labeling_0.3 splines_4.0.2 lme4_1.1-23
## [25] BiocParallel_1.22.0 statmod_1.4.34 stringr_1.4.0
## [28] pheatmap_1.0.12 polyclip_1.10-0 munsell_0.5.0
## [31] spatstat.data_1.4-3 compiler_4.0.2 numDeriv_2016.8-1.1
## [34] xfun_0.15 pkgconfig_2.0.3 BiocGenerics_0.34.0
## [37] lmerTest_3.1-2 mgcv_1.8-31 htmltools_0.5.0
## [40] tidyselect_1.1.0 tibble_3.0.3 bookdown_0.20
## [43] IRanges_2.22.2 crayon_1.3.4 dplyr_1.0.0
## [46] withr_2.2.0 MASS_7.3-51.6 grid_4.0.2
## [49] jsonlite_1.7.0 nlme_3.1-148 gtable_0.3.0
## [52] lifecycle_0.2.0 magrittr_1.5 concaveman_1.1.0
## [55] scales_1.1.1 stringi_1.4.6 farver_2.0.3
## [58] spatstat_1.64-1 ellipsis_0.3.1 spatstat.utils_1.17-0
## [61] generics_0.0.2 vctrs_0.3.1 boot_1.3-25
## [64] RColorBrewer_1.1-2 tools_4.0.2 glue_1.4.1
## [67] purrr_0.3.4 abind_1.4-5 parallel_4.0.2
## [70] yaml_2.2.1 colorspace_1.4-1 BiocManager_1.30.10
## [73] knitr_1.29