Similarity Metrics Evaluation

In the mosbi package, similarities between biclusters are computed using different possible similarity metrics.

This vignette gives an overview about the implemented metrics.

library(mosbi)

The following similarity metrics are currently implemented:

# Bray-Curtis similarity
bray_curtis <- function(s1, s2, overlap) {
    return(((2 * overlap) / (s1 + s2)))
}

# Jaccard index
jaccard <- function(s1, s2, overlap) {
    return(((overlap) / (s1 + s2 - overlap)))
}

# overlap coefficient
overlap <- function(s1, s2, overlap) {
    return((overlap / min(s1, s2)))
}

# Fowlkes–Mallows index
folkes_mallows <- function(s1, s2, overlap) {
    tp <- choose(overlap, 2)
    fp <- choose(s1 - overlap, 2)
    fn <- choose(s2 - overlap, 2)

    return(sqrt((tp / (tp + fp)) * (tp / (tp + fn))))
}

The behavior of the similarity metrics will be evaluated for two scenarios:

  • Two biclusters of the same size with an increasing overlap.

  • Two biclusters of different sizes (One twice as big as the other) with an increasing overlap.

# Scenario 1 - two biclusters of the same size
size1_1 <- rep(1000, 1000)
size2_1 <- rep(1000, 1000)
overlap_1 <- seq(1, 1000)

# Scenario 2 - two biclusters one of size 500, the other of size 1000
size1_2 <- rep(1000, 500)
size2_2 <- rep(500, 500)
overlap_2 <- seq(1, 500)

Two biclusters of the same size:

plot(overlap_1, bray_curtis(size1_1, size2_1, overlap_1),
    col = "red", type = "l", xlab = "Overlap", ylab = "Similarity", 
    ylim = c(0, 1)
)
lines(overlap_1, jaccard(size1_1, size2_1, overlap_1), col = "blue")
lines(overlap_1, overlap(size1_1, size2_1, overlap_1), col = "green", lty = 2)
lines(overlap_1, folkes_mallows(size1_1, size2_1, overlap_1), col = "orange")
legend(
    x = .8, legend = c("Bray-Curtis", "Jaccard", "Overlap", "Fowlkes–Mallows"),
    col = c("red", "blue", "green", "orange"),
    lty = 1, cex = 0.8, title = "Similarity metrics"
)

Two biclusters of different sizes:

plot(overlap_2, bray_curtis(size1_2, size2_2, overlap_2),
    col = "red", type = "l", xlab = "Overlap", ylab = "Similarity", 
    ylim = c(0, 1)
)
lines(overlap_2, jaccard(size1_2, size2_2, overlap_2), col = "blue")
lines(overlap_2, overlap(size1_2, size2_2, overlap_2), col = "green")
lines(overlap_2, folkes_mallows(size1_2, size2_2, overlap_2), col = "orange")
legend(
    x = .8, legend = c("Bray-Curtis", "Jaccard", "Overlap", "Fowlkes–Mallows"),
    col = c("red", "blue", "green", "orange"),
    lty = 1, cex = 0.8, title = "Similarity metrics"
)

Session Info

sessionInfo()
#> R version 4.4.2 (2024-10-31)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 24.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.26.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=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       
#> 
#> time zone: Etc/UTC
#> tzcode source: system (glibc)
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> other attached packages:
#> [1] mosbi_1.13.0     BiocStyle_2.35.0
#> 
#> loaded via a namespace (and not attached):
#>  [1] tidyr_1.3.1             sass_0.4.9              generics_0.1.3         
#>  [4] class_7.3-22            lattice_0.22-6          digest_0.6.37          
#>  [7] magrittr_2.0.3          evaluate_1.0.1          grid_4.4.2             
#> [10] RColorBrewer_1.1-3      fastmap_1.2.0           jsonlite_1.8.9         
#> [13] BiocManager_1.30.25     purrr_1.0.2             scales_1.3.0           
#> [16] modeltools_0.2-23       jquerylib_0.1.4         cli_3.6.3              
#> [19] isa2_0.3.6              rlang_1.1.4             Biobase_2.67.0         
#> [22] munsell_0.5.1           cachem_1.1.0            yaml_2.3.10            
#> [25] tools_4.4.2             parallel_4.4.2          biclust_2.0.3.1        
#> [28] dplyr_1.1.4             colorspace_2.1-1        ggplot2_3.5.1          
#> [31] BiocGenerics_0.53.3     buildtools_1.0.0        vctrs_0.6.5            
#> [34] R6_2.5.1                stats4_4.4.2            lifecycle_1.0.4        
#> [37] QUBIC_1.35.0            MASS_7.3-61             pkgconfig_2.0.3        
#> [40] RcppParallel_5.1.9      bslib_0.8.0             pillar_1.10.0          
#> [43] gtable_0.3.6            glue_1.8.0              Rcpp_1.0.13-1          
#> [46] tidyselect_1.2.1        xfun_0.49               tibble_3.2.1           
#> [49] sys_3.4.3               flexclust_1.4-2         knitr_1.49             
#> [52] fabia_2.53.0            igraph_2.1.2            htmltools_0.5.8.1      
#> [55] rmarkdown_2.29          BH_1.87.0-1             maketools_1.3.1        
#> [58] compiler_4.4.2          additivityTests_1.1-4.2