--- title: "Similarity Matrices" output: rmarkdown::html_vignette: toc: true description: > Visualize the affinity matrices produced by SNF and how they associate with other data attributes. vignette: > %\VignetteIndexEntry{Similarity Matrices} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) ``` Download a copy of the vignette to follow along here: [similarity_matrix_heatmaps.Rmd](https://raw.githubusercontent.com/BRANCHlab/metasnf/refs/heads/main/vignettes/similarity_matrix_heatmap.Rmd) This vignette walks through usage of `similarity_matrix_heatmap` to visualize the final similarity matrix produced by a run of SNF and how that matrix associates with other patient attributes. ## Data set-up ```{r} library(metasnf) # Generate data_list data_list <- generate_data_list( list( data = expression_df, name = "expression_data", domain = "gene_expression", type = "continuous" ), list( data = methylation_df, name = "methylation_data", domain = "gene_methylation", type = "continuous" ), list( data = gender_df, name = "gender", domain = "demographics", type = "categorical" ), list( data = diagnosis_df, name = "diagnosis", domain = "clinical", type = "categorical" ), list( data = age_df, name = "age", domain = "demographics", type = "discrete" ), uid = "patient_id" ) # Generate settings_matrix set.seed(42) settings_matrix <- generate_settings_matrix( data_list, nrow = 1, max_k = 40 ) # Run SNF and clustering batch_snf_results <- batch_snf( data_list, settings_matrix, return_similarity_matrices = TRUE ) solutions_matrix <- batch_snf_results$"solutions_matrix" similarity_matrices <- batch_snf_results$"similarity_matrices" # The first (and only) similarity matrix: similarity_matrix <- similarity_matrices[[1]] # The first (and only) cluster solution: cluster_solution <- get_cluster_solutions(solutions_matrix)$"1" ``` ## Visualize similarity matrices sorted by cluster label `similarity_matrix_heatmap` is a wrapper for `ComplexHeatmap::Heatmap`, but with some convenient default transformations and parameters for viewing a similarity matrix. ```{r eval = FALSE} similarity_matrix_hm <- similarity_matrix_heatmap( similarity_matrix = similarity_matrix, cluster_solution = cluster_solution, heatmap_height = grid::unit(10, "cm"), heatmap_width = grid::unit(10, "cm") ) # Export heatmaps using the `save_heatmap` function save_heatmap( heatmap = similarity_matrix_hm, path = "./similarity_matrix_heatmap.png", width = 410, height = 330, res = 80 ) ```
![](https://raw.githubusercontent.com/BRANCHlab/metasnf/main/vignettes/similarity_matrix_heatmap.png)
The default transformations include plotting log(Similarity) rather than the default similarity matrix as well as rescaling the diagonal of the matrix to the average value of the off-diagonals. Additionally, the similarity matrix gets reordered according to the provided cluster solution. ## Annotations One piece of functionality provided by `ComplexHeatmap::Heatmap` is the ability to supply visual annotations along the rows and columns of a heatmap. You can always build annotations using the standard approaches outline in the [ComplexHeatmap Complete Reference](https://jokergoo.github.io/ComplexHeatmap-reference/book/index.html). In addition to that, this package offers some convenient functionality to specify regular heatmap annotations and barplot annotations directly through a provided dataframe or data_list (or both). In the example below, we make use of data supplied through a data_list. ```{r eval = FALSE} annotated_sm_hm <- similarity_matrix_heatmap( similarity_matrix = similarity_matrix, cluster_solution = cluster_solution, scale_diag = "mean", log_graph = TRUE, data_list = data_list, left_hm = list( "Diagnosis" = "diagnosis" ), top_hm = list( "Gender" = "gender" ), top_bar = list( "Age" = "age" ), annotation_colours = list( Diagnosis = c( "definite asthma" = "red3", "possible asthma" = "pink1", "no asthma" = "bisque1" ), Gender = c( "female" = "purple", "male" = "lightgreen" ) ), heatmap_height = grid::unit(10, "cm"), heatmap_width = grid::unit(10, "cm") ) save_heatmap( heatmap = annotated_sm_hm, path = "./annotated_sm_heatmap.png", width = 500, height = 440, res = 80 ) ```
![](https://raw.githubusercontent.com/BRANCHlab/metasnf/main/vignettes/annotated_sm_heatmap.png)
The colours `red3`, `pink1`, etc. are built-in R colours that you can browse by calling `colours()`. For reference, the code below shows how you would achieve these annotations using standard `ComplexHeatmap` syntax. ```{r eval = FALSE} merged_df <- collapse_dl(data_list) order <- sort(cluster_solution, index.return = TRUE)$"ix" merged_df <- merged_df[order, ] top_annotations <- ComplexHeatmap::HeatmapAnnotation( Age = ComplexHeatmap::anno_barplot(merged_df$"age"), Gender = merged_df$"gender", col = list( Gender = c( "female" = "purple", "male" = "lightgreen" ) ), show_legend = TRUE ) left_annotations <- ComplexHeatmap::rowAnnotation( Diagnosis = merged_df$"diagnosis", col = list( Diagnosis = c( "definite asthma" = "red3", "possible asthma" = "pink1", "no asthma" = "bisque1" ) ), show_legend = TRUE ) similarity_matrix_heatmap( similarity_matrix = similarity_matrix, cluster_solution = cluster_solution, scale_diag = "mean", log_graph = TRUE, data = merged_df, top_annotation = top_annotations, left_annotation = left_annotations ) ``` Take a look at the [ComplexHeatmap Complete Reference](https://jokergoo.github.io/ComplexHeatmap-reference/book/index.html) to learn more about what is possible with this package. ## More on sorting Be aware that the ordering of both your data and your similarity matrix will be influenced if you supply values for the `cluster_solution` or `order` parameters. If you don't think your data is lining up properly, consider manually making sure your `similarity_matrix` rows and columns are sorted to your preference (e.g., based on cluster) and that the order of your data matches. This will be easier to do with a `dataframe` than with a `data_list`, as the `data_list` forces patients to be sorted by their unique IDs upon generation.