
VVIQ groups and OSIVQ clusters
Source:vignettes/vviq-groups-osivq-clusters.Rmd
vviq-groups-osivq-clusters.Rmd
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)