Contents

1 Installation

if (!require("BiocManager"))
    install.packages("BiocManager")
BiocManager::install("spicyR")
# load required packages
library(spicyR)
library(ggplot2)

2 Overview

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.

3 Quick start

3.1 Generate toy data

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)

3.2 Create SegmentedCellExperiment object

First we store our datas into a SegmentedCells object.


cellExp <- SegmentedCells(cells, cellTypeString = 'cellType')

3.3 Generate LISA curves

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)

3.4 Perform some clustering

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 = '_')

3.5 Plot identified regions

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'))

3.6 Alternative hatching plot

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

4 Damond et al. islet data.

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).

4.1 Read in data

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)

4.2 Cluster cell-types

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 = '')

4.3 Generate LISA curves

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))

4.4 Perform some clustering

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 = '_')

4.5 Plot identified regions

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)

5 sessionInfo()

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