Skip to contents

This short vignette details how the OSIVQ clusters were created and named, and how they relate to the VVIQ-based groups.

library(aphantasiaReasoningViie)
#> Welcome to aphantasiaReasoningViie.

First, let’s get the cleaned, analysis-ready data (see vignette("preparing-data") for details).

df_survey  <- get_clean_data()$df_survey

The OSIVQ clusters were created using a consensus of three clustering algorithms (GMM, PAM and C-Means) applied to the three OSIVQ sub-scales (Object, Spatial and Verbal). A function was created for this specific task, cluster_osivq(), which uses the diceR::dice() function from the diceR package. Following the methodology proposed by Delem et al. (2025), we searched for three “visualiser”, “spatialiser” and “verbaliser” clusters based on their most “dominant” OSIVQ sub-scale score.

However, the clustering algorithm does not name the clusters, so we needed to check their properties to assign meaningful names. The function add_named_clusters() adds the cluster assignments to the data frame, by default with generic names. summarise_clustering() then provides a summary of the clusters’ properties, which allowed us to choose meaningful names for the three clusters produced.

# Clustering OSIVQ data
clustering <- cluster_osivq(df_survey)

# Checking cluster properties to define names for each cluster
df_survey |>
  add_named_clusters(clustering) |>
  summarise_clustering()
#> # A tibble: 9 × 8
#>   group          cluster       n  vviq object spatial verbal raven
#>   <fct>          <fct>     <int> <dbl>  <dbl>   <dbl>  <dbl> <dbl>
#> 1 Hypophantasia  cluster_1     3  24     1.67    3.67   2.55  15.7
#> 2 Typical        cluster_1    12  50.9   2.39    2.84   2.46  15.3
#> 3 Aphantasia     cluster_1     4  16     1.41    3.32   1.97  17  
#> 4 Typical        cluster_2    38  57.3   3.71    2.87   3.09  15.8
#> 5 Hyperphantasia cluster_2     4  77.5   4.41    3.93   3.56  15  
#> 6 Aphantasia     cluster_2     1  16     4.93    3.27   4.44  16  
#> 7 Aphantasia     cluster_3    25  16.0   1.25    2.26   3.38  16.0
#> 8 Hypophantasia  cluster_3    14  23.7   1.36    2.52   3.5   15.3
#> 9 Typical        cluster_3     3  50.3   1.76    2.67   4.11  17.3

We saw here that cluster 1 was the spatialiser one, cluster 2 was the visualiser and cluster 3 the verbaliser. We can now use add_named_clusters() again with its optional arguments add these labels, reorder them, choose factor levels and add contrasts for planned comparisons between the visualiser cluster and the other two.

# Adding named clusters to the survey data
df_survey <- add_named_clusters(
  df_survey, clustering,
  names  = c("Spatialiser", "Visualiser", "Verbaliser"),
  levels = c("Visualiser", "Spatialiser", "Verbaliser"),
  contrasts = c("_visualiser", "_spatialiser", "_verbaliser"),
  base = 1
)

# Let's check the cluster properties again
contrasts(df_survey$cluster)
#>             _spatialiser _verbaliser
#> Visualiser             0           0
#> Spatialiser            1           0
#> Verbaliser             0           1
summarise_clustering(df_survey)
#> # A tibble: 9 × 8
#>   group          cluster         n  vviq object spatial verbal raven
#>   <fct>          <fct>       <int> <dbl>  <dbl>   <dbl>  <dbl> <dbl>
#> 1 Typical        Visualiser     38  57.3   3.71    2.87   3.09  15.8
#> 2 Hyperphantasia Visualiser      4  77.5   4.41    3.93   3.56  15  
#> 3 Aphantasia     Visualiser      1  16     4.93    3.27   4.44  16  
#> 4 Hypophantasia  Spatialiser     3  24     1.67    3.67   2.55  15.7
#> 5 Typical        Spatialiser    12  50.9   2.39    2.84   2.46  15.3
#> 6 Aphantasia     Spatialiser     4  16     1.41    3.32   1.97  17  
#> 7 Aphantasia     Verbaliser     25  16.0   1.25    2.26   3.38  16.0
#> 8 Hypophantasia  Verbaliser     14  23.7   1.36    2.52   3.5   15.3
#> 9 Typical        Verbaliser      3  50.3   1.76    2.67   4.11  17.3

df_expe <-
  dplyr::left_join(
    get_clean_data()$df_expe,
    df_survey |> dplyr::select(id, cluster),
    by = dplyr::join_by("id")
  ) |>
  dplyr::relocate(cluster, .after = "group")

df_rt      <- filter_trials_on_rt(df_expe, verbose = TRUE)
#> 
#> Outlier trials filtration summary
#> 2808 trials before filtering
#> 587 incorrect trials removed (20.9%)
#> 317 trials filtered based on mean + 2 * SD
#> (14.27% of remaining trials)
#> 1904 trials remaining after filtering
df_rt_long <-
  pivot_terms_longer(df_rt) |>
  dplyr::mutate(
    group_2_category = interaction(group_2, category),
    group_3_category = interaction(group_3, category),
    cluster_category = interaction(cluster, category)
  )

df_strats_long <- pivot_strategies_longer(df_survey)
Delem, M., Turkben, S., Cousineau, D., Cavalli, E., & Plancher, G. (2025). Unsupervised clustering reveals spatial and verbal cognitive profiles in aphantasia and typical imagery.