Download a copy of the vignette to follow along here: alluvial_plots.Rmd
Alluvial plots can be generated to visualize how changing the number of clusters influences the distribution of observations according to one (or a few) features of interest.
First, some data setup just as was done in the previous vignettes.
library(metasnf)
# Generate data_list
data_list <- generate_data_list(
list(
data = expression_df,
name = "genes_1_and_2_exp",
domain = "gene_expression",
type = "continuous"
),
list(
data = methylation_df,
name = "genes_1_and_2_meth",
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"
),
uid = "patient_id"
)
set.seed(42)
settings_matrix <- generate_settings_matrix(
data_list,
nrow = 1,
max_k = 40
)
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"
similarity_matrix <- similarity_matrices[[1]]
cluster_solution <- get_cluster_solutions(solutions_matrix)$"1"
Next, assemble a list clustering algorithm functions that cover the
range of the number of clusters you’d like to visualize. The example
below uses spectral_two
to spectral_six
, which
are spectral clustering functions covering 2 clusters to 6 clusters
respectively.
# Spectral clustering functions ranging from 2 to 6 clusters
cluster_sequence <- list(
spectral_two,
spectral_three,
spectral_four
)
Then, we can either generate an alluvial plot covering our similarity
matrix over these clustering algorithms for data in a
data_list
:
alluvial_cluster_plot(
cluster_sequence = cluster_sequence,
similarity_matrix = similarity_matrix,
data_list = data_list,
key_outcome = "gender", # the name of the feature of interest
key_label = "Gender", # how the feature of interest should be displayed
extra_outcomes = "diagnosis", # more features to plot but not colour by
title = "Gender Across Cluster Counts"
)
Or in an external dataframe:
extra_data <- dplyr::inner_join(
gender_df,
diagnosis_df,
by = "patient_id"
) |>
dplyr::mutate(subjectkey = paste0("subject_", patient_id))
head(extra_data)
## patient_id gender diagnosis subjectkey
## 1 660 female definite asthma subject_660
## 2 420 female possible asthma subject_420
## 3 252 female definite asthma subject_252
## 4 173 female no asthma subject_173
## 5 327 female definite asthma subject_327
## 6 245 female definite asthma subject_245