Representation Analysis

Authors

Liang Zhang

Jintao Sheng

Code
library(tidyverse)
library(patchwork)
invisible(common::source.all("R_quarto", isolate = FALSE))
theme_set(
  ggpubr::theme_pubr(base_family = "Gill Sans MT", base_size = 12) %+replace%
    theme(
      axis.line = element_line(linewidth = 1),
      # to make the background transparent
      # by ChatGPT: based on https://stackoverflow.com/a/41878833/5996475
      panel.background = element_rect(fill = "transparent", colour = NA),
      plot.background = element_rect(fill = "transparent", colour = NA),
      legend.background = element_rect(fill = "transparent", colour = NA),
      legend.key = element_rect(fill = "transparent", colour = NA)
    )
)

Behavioral Results

Main Results

Code
layout <- "
###AA
###AA
###BB
CCCBB
CCCDD
CCCDD
"

p_perf <- targets::tar_read(mem_perf) |>
  ggplot(aes(dprime)) +
  geom_histogram(fill = "grey") +
  scale_x_continuous(name = "d' (Overall)") +
  scale_y_continuous(name = "Count")

p_smc <- targets::tar_read(smc) |>
  enframe() |>
  ggplot(aes(value)) +
  geom_histogram(fill = "grey") +
  scale_x_continuous(name = "SMC") +
  scale_y_continuous(name = "Count")

p_memorability <- targets::tar_read(memorability) |>
  filter(word_id <= 150) |>
  mutate(
    trial_id_new = as.integer(fct_reorder(factor(trial_id), desc(pc)))
  ) |>
  ggplot(aes(trial_id_new, ymin = 0, ymax = pc)) +
  geom_linerange(color = "grey", linewidth = 0.7) +
  scale_x_continuous(name = "Order of Words", expand = expansion(add = 0.5)) +
  scale_y_continuous(name = "Memorability", expand = c(0, 0))

p_memorability_content <- targets::tar_read(memorability_content) |>
  ggplot(aes(r)) +
  geom_histogram(fill = "grey") +
  geom_vline(
    xintercept = mean(targets::tar_read(memorability_content)$r),
    linetype = "dotted"
  ) +
  geom_vline(xintercept = sqrt(0.5), linetype = "dotted", color = "red") +
  scale_x_continuous(
    name = "Individual-to-Group\nMemory Content Similarity"
  ) +
  scale_y_continuous(name = "Count", expand = expansion(c(0, 0)))

p_perf +
  p_smc +
  p_memorability +
  p_memorability_content +
  plot_layout(design = layout)

if (!interactive()) {
  ggsave_default(width = 8, height = 5)
}
Figure 1

Supplementary Results

Code
targets::tar_read(mem_perf) |>
  left_join(
    targets::tar_read(mem_perf_precise),
    by = "subj_id"
  ) |>
  select(!subj_id) |>
  rename(
    Overall = dprime,
    Recollection = dprime_rem,
    Familiarity = dprime_know
  ) |>
  GGally::ggpairs(
    diag = list(continuous = "barDiag"),
    lower = list(
      continuous = function(data, mapping, ...) {
        ggplot(data, mapping) +
          geom_point(color = "grey") +
          geom_smooth(method = "lm", color = "black") +
          ggpmisc::stat_correlation(
            ggpmisc::use_label(c("r", "p.value")),
            small.r = TRUE,
            small.p = TRUE
          )
      }
    ),
    upper = "blank",
    switch = "both"
  ) +
  theme(
    strip.text = element_text(size = 16),
    strip.background = element_blank(),
    strip.placement = "outside"
  )

if (!interactive()) {
  ggsave_default(width = 6, height = 6)
}
Figure 2

Representation Stability

Here we investigate the stability of group-level representations across participants. We compute the stability of group-level representations by randomly sampling a subset of participants and computing the correlation between the group-level representation computed from this subset and the full group-level representation.

Note this figure should be combined with the CCA results plot, and this figure will be included in the supplementary materials.

Code
targets::tar_load(patterns_group_stability)
size_subjs <- seq(20, 200, by = 20)
predictions <- patterns_group_stability |>
  reframe(
    fit_curve(size, r) |>
      predict(newdata = data.frame(x = size_subjs)) |>
      as_tibble_col("r") |>
      add_column(size = size_subjs, .before = 1L),
    .by = cca_id
  )
p_stability <- patterns_group_stability |>
  ggplot(aes(size, r, color = factor(cca_id))) +
  ggdist::stat_dotsinterval() +
  geom_point(aes(size, r), predictions, size = 1) +
  geom_line(aes(size, r), predictions, linetype = "longdash") +
  scale_x_continuous(
    name = "# Participants",
    breaks = scales::breaks_width(40)
  ) +
  scale_y_continuous(name = "Stability") +
  scale_color_components() +
  facet_grid(cols = vars(cca_id), scales = "free") +
  theme(strip.text = element_blank())

p_trend_gss <- targets::tar_read(data_gss_whole_resampled) |>
  ggplot(aes(size, gss, color = factor(cca_id))) +
  ggdist::stat_dotsinterval() +
  scale_x_continuous(
    name = "# Participants",
    breaks = scales::breaks_width(40)
  ) +
  scale_y_continuous(name = "GSS") +
  scale_color_components(guide = "none") +
  facet_grid(cols = vars(cca_id), scales = "free") +
  theme(strip.text = element_blank())

p_stability /
  p_trend_gss +
  plot_layout(guides = "collect", axes = "collect") &
  theme(legend.position = "bottom")

if (!interactive()) {
  ggsave_default(width = 6, height = 4)
}
Figure 3

Semantic transformation, representation fidelity, and memory

Here we use individual to semantic representation similarity (ISS), indicating semantic transformation, and individual to group representation similarity (IGS), indicating representation fidelity, to predict memory performance. We also compare the predictive power of ISS and IGS, and we explore the mediation effect of representation fidelity on the effect of semantic transformation on memory performance.

Predictive power of ISS and IGS (overall d’)

Code
# ISS predicts memory
# show legend because this the first panel of the figure
p_iss_mem_scatter <- visualize_scatter(
  targets::tar_read(data_iss_whole),
  targets::tar_read(mem_perf),
  show_legend = TRUE
)

p_iss_mem_dynamic <- visualize_dynamic(
  targets::tar_read(stats_iss_mem_dynamic),
  targets::tar_read(clusters_stats_iss_mem_dynamic),
  col_stat = "estimate",
  lab_stat = expression(italic(r)[ISS - "d'"])
)

# IGS predicts memory
p_igs_mem_scatter <- visualize_scatter(
  targets::tar_read(data_igs_whole),
  targets::tar_read(mem_perf)
)

p_igs_mem_dynamic <- visualize_dynamic(
  targets::tar_read(stats_igs_mem_dynamic),
  targets::tar_read(clusters_stats_igs_mem_dynamic),
  lab_stat = expression(italic(r)[IGS - "d'"])
)

(p_iss_mem_scatter | p_iss_mem_dynamic) /
  (p_igs_mem_scatter | p_igs_mem_dynamic) +
  plot_layout(guides = "collect") &
  # tags are added in Adobe Illustrator
  # plot_annotation(tag_levels = "A") &
  theme(legend.position = "top")

if (!interactive()) {
  ggsave_default(width = 13, height = 5)
}
Figure 4

Predictive power of ISS and IGS (precise d’)

Code
# ISS predicts memory
p_iss_mem_rem_scatter <- visualize_scatter(
  targets::tar_read(data_iss_whole),
  targets::tar_read(mem_perf_precise) |>
    select(subj_id, dprime = dprime_rem),
  lab_perf = "Recollection",
  show_legend = TRUE
)

p_iss_mem_rem_dynamic <- visualize_dynamic(
  targets::tar_read(stats_iss_mem_dynamic_dprime_rem),
  targets::tar_read(clusters_stats_iss_mem_dynamic_dprime_rem),
  col_stat = "estimate",
  lab_stat = expression(italic(r)[ISS - "Recollection"])
)

p_iss_mem_know_scatter <- visualize_scatter(
  targets::tar_read(data_iss_whole),
  targets::tar_read(mem_perf_precise) |>
    select(subj_id, dprime = dprime_know),
  lab_perf = "Familiarity",
  col_stat = "iss"
)

p_iss_mem_know_dynamic <- visualize_dynamic(
  targets::tar_read(stats_iss_mem_dynamic_dprime_know),
  targets::tar_read(clusters_stats_iss_mem_dynamic_dprime_know),
  col_stat = "estimate",
  lab_stat = expression(italic(r)[ISS - "Familiarity"])
)

# IGS predicts memory
p_igs_mem_rem_scatter <- visualize_scatter(
  targets::tar_read(data_igs_whole),
  targets::tar_read(mem_perf_precise) |>
    select(subj_id, dprime = dprime_rem),
  lab_perf = "Recollection"
)

p_igs_mem_rem_dynamic <- visualize_dynamic(
  targets::tar_read(stats_igs_mem_dynamic_dprime_rem),
  targets::tar_read(clusters_stats_igs_mem_dynamic_dprime_rem),
  lab_stat = expression(italic(r)[IGS - "Recollection"])
)

p_igs_mem_know_scatter <- visualize_scatter(
  targets::tar_read(data_igs_whole),
  targets::tar_read(mem_perf_precise) |>
    select(subj_id, dprime = dprime_know),
  lab_perf = "Familiarity"
)

p_igs_mem_know_dynamic <- visualize_dynamic(
  targets::tar_read(stats_igs_mem_dynamic_dprime_know),
  targets::tar_read(clusters_stats_igs_mem_dynamic_dprime_know),
  lab_stat = expression(italic(r)[IGS - "Familiarity"])
)

(p_iss_mem_rem_scatter | p_iss_mem_rem_dynamic) /
  (p_iss_mem_know_scatter | p_iss_mem_know_dynamic) /
  (p_igs_mem_rem_scatter | p_igs_mem_rem_dynamic) /
  (p_igs_mem_know_scatter | p_igs_mem_know_dynamic) +
  plot_layout(guides = "collect") &
  plot_annotation(tag_levels = "A") &
  theme(legend.position = "bottom")

if (!interactive()) {
  ggsave_default(width = 13, height = 8)
}
Figure 5

Comparison of ISS and IGS

Here we compare the predictive power of ISS and IGS on memory performance. We use linear regression to model the relationship between ISS/IGS and memory performance, and we compare the models using adjusted R-squared.

Note we decided that the figures will be only included in the supplementary materials.

Code
p_iss_comp <- visualize_data_distr(
  targets::tar_read(data_iss_whole),
  targets::tar_read(stats_iss_whole),
  targets::tar_read(iss_comparison),
  show_legend = TRUE
)

p_iss_dynamic <- visualize_dynamic(
  targets::tar_read(stats_iss_dynamic),
  targets::tar_read(clusters_stats_iss_dynamic),
  col_stat = "estimate",
  lab_stat = "ISS"
)

p_igs_comp <- visualize_data_distr(
  targets::tar_read(data_igs_whole),
  targets::tar_read(stats_igs_whole),
  targets::tar_read(igs_comparison)
)

p_igs_dynamic <- visualize_dynamic(
  targets::tar_read(stats_igs_dynamic),
  targets::tar_read(clusters_stats_igs_dynamic),
  col_stat = "estimate",
  lab_stat = "IGS"
)

p_gss_whole <- visualize_mantel(
  targets::tar_read(patterns_group_whole),
  targets::tar_read(pattern_semantics),
  targets::tar_read(stats_gss_whole),
  "Group Averaged Neural Representation",
  "Semantic Resprentation"
)

p_gss_dynamic <- visualize_dynamic(
  targets::tar_read(stats_gss_dynamic),
  targets::tar_read(clusters_stats_gss_dynamic),
  col_stat = "statistic",
  lab_stat = "GSS"
)

(p_iss_comp | p_iss_dynamic) /
  (p_igs_comp | p_igs_dynamic) /
  (p_gss_whole | p_gss_dynamic) +
  plot_layout(guides = "collect") &
  plot_annotation(tag_levels = "A") &
  theme(legend.position = "bottom")

if (!interactive()) {
  ggsave_default(width = 13, height = 10)
}
Figure 6

Mediation analysis of ISS and IGS on memory performance

First, we investigate the predictive power of ISS on memory performance after controlling for the effect of IGS. We use linear regression to model the relationship between ISS and memory performance, and we compare the models with and without IGS as a covariate.

Code
p_compare_iss_partial <- visualize_comp_partial(
  targets::tar_read(iss_comp_partial),
  comp_labels = c("ISS", "ISS|G")
)

p_iss_partial_scatter <- visualize_scatter(
  targets::tar_read(data_iss_partial_whole),
  targets::tar_read(mem_perf),
  lab_stat = "ISS|G",
  col_stat = "iss",
  show_legend = TRUE
)

p_iss_partial_dynamic <- visualize_dynamic(
  targets::tar_read(stats_iss_partial_mem_dynamic),
  targets::tar_read(clusters_stats_iss_partial_mem_dynamic),
  col_stat = "estimate",
  lab_stat = expression(italic(r)["ISS|G" - "d'"])
)

p_compare_predictions <- visualize_comp_preds(
  `IGS + ISS|G` = targets::tar_read(lm_mem_igs_iss_partial),
  `ISS|G` = targets::tar_read(lm_mem_iss_partial)
)

Second, we investigate the mediation effect of IGS on the relationship between ISS and memory performance. We use structural equation modeling (SEM) to model the mediation effect, and we visualize the mediation diagram.

Code
diagram_iss_igs <- targets::tar_read(fit_med_iss_igs_dprime) |>
  visualize_mediation(
    lab_x = LAB_ISS_MED,
    lab_m = LAB_IGS_MED,
    lab_y = LAB_MEM_MED
  )
diagram_iss_igs |>
  DiagrammeRsvg::export_svg() |>
  charToRaw() |>
  rsvg::rsvg_png("figures/mediation_iss_igs_mem.png", width = 1000)
p_mediation <- png::readPNG("figures/mediation_iss_igs_mem.png", native = TRUE)
Code
design <- "
AAAAABBBBBBBBEEE
AAAAABBBBBBBBEEE
AAAAABBBBBBBBEEE
CCCCCCCCDDDDDDDD
CCCCCCCCDDDDDDDD
CCCCCCCCDDDDDDDD
"
wrap_elements(p_mediation) +
  p_compare_iss_partial +
  p_iss_partial_scatter +
  p_iss_partial_dynamic +
  p_compare_predictions +
  plot_layout(design = design, guides = "collect") +
  plot_annotation(tag_levels = "A") &
  theme(legend.position = "bottom")
if (!interactive()) {
  ggsave_default(width = 13, height = 6)
}
Figure 7

Control analysis: word shape similarity pattern

Code
p_gfs_whole <- visualize_mantel(
  targets::tar_read(patterns_group_whole),
  targets::tar_read(pattern_shapes),
  targets::tar_read(stats_gfs_whole),
  "Group Averaged Neural Representation",
  "Word Shape Similarity"
)

p_gfs_dynamic <- visualize_dynamic(
  targets::tar_read(stats_gfs_dynamic),
  targets::tar_read(clusters_stats_gfs_dynamic),
  col_stat = "statistic",
  lab_stat = "GWS",
  show_legend = TRUE
)

p_ifs_mem_whole <- visualize_scatter(
  targets::tar_read(data_ifs_whole),
  targets::tar_read(mem_perf),
  lab_stat = "IWS",
  col_stat = "iss"
)

p_ifs_mem_dynamic <- visualize_dynamic(
  targets::tar_read(stats_ifs_mem_dynamic),
  targets::tar_read(clusters_stats_less_ifs_mem_dynamic),
  col_stat = "estimate",
  lab_stat = expression(italic(r)[IWS - "d'"])
)

(p_gfs_whole | p_gfs_dynamic) /
  (p_ifs_mem_whole | p_ifs_mem_dynamic) +
  plot_layout(guides = "collect") &
  plot_annotation(tag_levels = "A") &
  theme(legend.position = "bottom")
if (!interactive()) {
  ggsave_default(width = 12, height = 6)
}
Figure 8

Predicting Shared Memory Content (SMC)

Inter-Subject Pattern Similarity (ISPS)

Code
p_isps_dist <- targets::tar_read(data_isps_whole) |>
  mutate(cca_id = factor(cca_id)) |>
  unnest(isps) |>
  ggplot(aes(cca_id, isps)) +
  ggdist::stat_slabinterval(
    aes(slab_color = cca_id, slab_fill = cca_id),
    slab_alpha = 0.4,
    side = "both"
  ) +
  geom_hline(
    aes(yintercept = isps_baseline),
    targets::tar_read(summary_isps_whole_permuted) |>
      summarise(isps_baseline = mean(isps_mean), .by = cca_id) |>
      mutate(cca_id = factor(cca_id)),
    linetype = "dotted"
  ) +
  scale_x_discrete(name = NULL, labels = \(x) paste0("C", x)) +
  scale_y_continuous(name = "ISPS") +
  scale_color_components(
    aesthetics = c("slab_color", "slab_fill"),
    guide = "none"
  )

# p_isps_dynamic <- visualize_dynamic(
#   targets::tar_read(stats_isps_dynamic) |>
#     mutate(
#       ymax = isps_mean + isps_se,
#       ymin = isps_mean - isps_se
#     ),
#   col_stat = "isps_mean",
#   lab_stat = "ISPS",
#   col_cis = c("ymin", "ymax")
# )

# the cluster based permutation test is not useful (maybe we need TFCE)
p_isps_clusters <- visualize_dynamic(
  targets::tar_read(stats_isps_dynamic) |>
    mutate(
      ymax = isps_mean + isps_se,
      ymin = isps_mean - isps_se
    ),
  targets::tar_read(clusters_stats_isps_dynamic),
  col_stat = "isps_mean",
  lab_stat = "ISPS",
  col_cis = c("ymin", "ymax")
)

p_isps_smc <- visualize_mantel_dist(
  targets::tar_read(data_isps_smc_whole),
  targets::tar_read(stats_isps_smc_whole),
  expression(italic(r)[ISPS - SMC]),
  show_legend = TRUE
)

p_isps_smc_dynamic <- visualize_dynamic(
  targets::tar_read(stats_isps_smc_dynamic),
  targets::tar_read(clusters_stats_isps_smc_dynamic),
  col_stat = "statistic",
  lab_stat = expression(italic(r)[ISPS - SMC])
)

p_isps_dist +
  p_isps_clusters +
  p_isps_smc +
  p_isps_smc_dynamic +
  plot_layout(guides = "collect") &
  theme(legend.position = "bottom")

if (!interactive()) {
  ggsave_default(width = 13, height = 5)
}
Figure 9
Code
p_isps_smc_partial_memory <- visualize_mantel_dist(
  targets::tar_read(data_isps_smc_partial_ability_whole),
  targets::tar_read(stats_isps_smc_partial_ability_whole),
  expression(italic(r)["ISPS|Mem" - SMC]),
  show_legend = TRUE
)

p_isps_smc_partial_memory_dynamic <- visualize_dynamic(
  targets::tar_read(stats_isps_smc_partial_ability_dynamic),
  targets::tar_read(clusters_stats_isps_smc_partial_ability_dynamic),
  col_stat = "statistic",
  lab_stat = expression(italic(r)["ISPS|Mem" - SMC])
)

p_isps_smc_partial_group_memory <- visualize_mantel_dist(
  targets::tar_read(data_isps_smc_partial_group_ability_whole),
  targets::tar_read(stats_isps_smc_partial_group_ability_whole),
  expression(italic(r)["ISPS|(GRSM, Mem)" - SMC])
)

p_isps_smc_partial_group_memory_dynamic <- visualize_dynamic(
  targets::tar_read(stats_isps_smc_partial_group_ability_dynamic),
  targets::tar_read(clusters_stats_isps_smc_partial_group_ability_dynamic),
  col_stat = "statistic",
  lab_stat = expression(italic(r)["ISPS|(GRSM, Mem)" - SMC])
)

p_isps_smc_partial_semantic_memory <- visualize_mantel_dist(
  targets::tar_read(data_isps_smc_partial_semantic_ability_whole),
  targets::tar_read(stats_isps_smc_partial_semantic_ability_whole),
  expression(italic(r)["ISPS|(Sem, Mem)" - SMC])
)

p_isps_smc_partial_semantic_memory_dynamic <- visualize_dynamic(
  targets::tar_read(stats_isps_smc_partial_semantic_ability_dynamic),
  targets::tar_read(clusters_stats_isps_smc_partial_semantic_ability_dynamic),
  col_stat = "statistic",
  lab_stat = expression(italic(r)["ISPS|(Sem, Mem)" - SMC])
)

(p_isps_smc_partial_memory | p_isps_smc_partial_memory_dynamic) /
  (p_isps_smc_partial_group_memory | p_isps_smc_partial_group_memory_dynamic) /
  (p_isps_smc_partial_semantic_memory |
    p_isps_smc_partial_semantic_memory_dynamic) +
  plot_layout(guides = "collect") +
  plot_annotation(tag_levels = "A") &
  theme(legend.position = "bottom")

if (!interactive()) {
  ggsave_default(width = 13, height = 7)
}
Figure 10

Neural Synchronization

Code
targets::tar_load(sync_inter_intra)
summary_sync <- sync_inter_intra |>
  summarise(
    broom::tidy(t.test(sync)),
    .by = c(cca_id, type)
  ) |>
  rstatix::adjust_pvalue() |>
  rstatix::add_significance(
    cutpoints = c(0, 0.001, 0.01, 0.05, 1),
    symbols = c("***", "**", "*", "")
  )
compare_sync_p <- sync_inter_intra |>
  pivot_wider(
    id_cols = c(subj_id, cca_id),
    names_from = type,
    values_from = sync
  ) |>
  summarise(
    broom::tidy(t.test(intra, inter_ahead, paired = TRUE)),
    .by = cca_id
  ) |>
  rstatix::adjust_pvalue() |>
  rstatix::add_significance(
    cutpoints = c(0, 0.001, 0.01, 0.05, 1),
    symbols = c("***", "**", "*", "")
  ) |>
  mutate(
    start = "intra",
    end = "inter_ahead",
    y_position = max(summary_sync$conf.high) * 1.1
  )
p_sync_compare <- summary_sync |>
  ggplot(aes(type, estimate)) +
  geom_col(
    aes(color = cca_id, fill = cca_id, alpha = type),
    width = 0.75
  ) +
  geom_errorbar(aes(ymin = conf.low, ymax = conf.high), width = 0.1) +
  geom_text(
    aes(y = conf.high, label = p.value.adj.signif),
    vjust = 0,
    size = SIZE_LABEL
  ) +
  ggsignif::geom_signif(
    data = compare_sync_p,
    aes(
      xmin = start,
      xmax = end,
      annotations = p.value.adj.signif,
      y_position = y_position
    ),
    textsize = SIZE_LABEL,
    inherit.aes = FALSE,
    manual = TRUE
  ) +
  facet_grid(cols = vars(cca_id)) +
  scale_x_discrete(name = NULL, labels = c("Intra", "Inter")) +
  scale_y_continuous(
    name = "Neural Sync",
    expand = expansion(c(0, 0.1))
  ) +
  scale_color_components(aesthetics = c("fill", "color")) +
  scale_alpha_manual(
    name = NULL,
    values = c(1, 0),
    guide = "none"
  ) +
  theme(strip.text = element_blank())

sync_mem <- sync_inter_intra |>
  left_join(targets::tar_read(mem_perf), by = "subj_id") |>
  mutate(cca_id = factor(cca_id))
stats_sync_mem <- sync_mem |>
  summarise(
    broom::tidy(cor.test(sync, dprime)),
    .by = c(cca_id, type)
  ) |>
  rstatix::adjust_pvalue() |>
  rstatix::add_significance(
    cutpoints = c(0, 0.001, 0.01, 0.05, 1),
    symbols = c("***", "**", "*", "")
  ) |>
  prepare_corr_plotmath() |>
  mutate(
    x = min(sync_mem$sync),
    y = max(sync_mem$dprime) * 1.2 * (1 - 0.1 * as.integer(type))
  )

p_pred_mem <- sync_mem |>
  ggplot(aes(x = sync, y = dprime, alpha = type)) +
  geom_point(aes(color = cca_id, shape = type)) +
  geom_line(
    aes(color = cca_id),
    stat = "smooth",
    method = "lm",
    formula = y ~ x
    # linewidth = 2,
    # fullrange = TRUE
  ) +
  geom_text(
    aes(x, y, label = label),
    stats_sync_mem,
    hjust = 0,
    vjust = 1,
    parse = TRUE,
  ) +
  facet_grid(cols = vars(cca_id)) +
  scale_x_continuous(name = "Neural Sync") +
  scale_y_continuous(name = "Memory (d')") +
  scale_alpha_manual(
    name = NULL,
    values = c(1, 0.5),
    guide = "none"
  ) +
  scale_shape_manual(
    name = NULL,
    values = c(16, 1),
    labels = c("Intra", "Inter")
    # guide = "none"
  ) +
  scale_color_components(guide = "none") +
  theme(strip.text = element_blank())

p_sync_smc <- visualize_mantel_dist(
  targets::tar_read(sync_smc_whole),
  targets::tar_read(stats_sync_smc_whole),
  expression(italic(r)[Sync - SMC])
)

p_sync_smc_dynamic <- visualize_dynamic(
  targets::tar_read(stats_sync_smc_dynamic),
  targets::tar_read(clusters_stats_sync_smc_dynamic),
  col_stat = "statistic",
  lab_stat = expression(italic(r)[Sync - SMC])
)

p_sync_compare +
  p_pred_mem +
  p_sync_smc +
  p_sync_smc_dynamic +
  plot_layout(guides = "collect") +
  plot_annotation(tag_levels = "A") &
  theme(legend.position = "bottom")

Code
ggsave("figures/sync_results.png", width = 13, height = 6.5, dpi = 300)
Code
set.seed(1)

# representational patterns ----
vis_pat <- function(pat) {
  corrplot::corrplot(
    pat,
    method = "color",
    outline = TRUE,
    col = corrplot::COL1("Greys"),
    tl.pos = "n",
    cl.pos = "n"
  )
}
x_indiv <- pracma::squareform(rnorm(15, 0.5, 0.25))
x_group <- pracma::squareform(rnorm(15, 0.5, 0.25))
x_sem <- pracma::squareform(rnorm(15, 0.5, 0.25))
diag(x_indiv) <- diag(x_group) <- diag(x_sem) <- 1
png("figures/diagrams/indiv_matrix.png", width = 400, height = 400)
vis_pat(x_indiv)
dev.off()
png("figures/diagrams/group_matrix.png", width = 400, height = 400)
vis_pat(x_group)
dev.off()
png("figures/diagrams/sem_matrix.png", width = 400, height = 400)
vis_pat(x_sem)
dev.off()

# word2vec embeddings ----
embedding <- as_tibble(split(rnorm(14, 0.5, 0.2), rep(1:2, each = 7))) |>
  mutate(id = seq_len(n()), label = "")
embedding[6, 1:2] <- NA
embedding$label[6] <- "…"

embedding |>
  ggplot(aes(id, 1, fill = `1`)) +
  geom_tile() +
  geom_text(aes(label = label), size = 12, vjust = 0.2) +
  scale_fill_gradient(
    low = "grey80",
    high = "grey20",
    na.value = "white",
    guide = "none"
  ) +
  coord_fixed() +
  theme_void()
ggplot2::ggsave(
  "figures/diagrams/embedding_1.png",
  width = 8,
  height = 2,
  dpi = 300
)

embedding |>
  ggplot(aes(id, 1, fill = `2`)) +
  geom_tile() +
  geom_text(aes(label = label), size = 12, vjust = 0.2) +
  scale_fill_gradient(
    low = "grey80",
    high = "grey20",
    na.value = "white",
    guide = "none"
  ) +
  coord_fixed() +
  theme_void()
ggplot2::ggsave(
  "figures/diagrams/embedding_2.png",
  width = 8,
  height = 2,
  dpi = 300
)

# neural activity ----
targets::tar_load(file_cca_y)
data_trials <- arrow::open_dataset(file_cca_y) |>
  filter(subj_id == 1, cca_id == 1, trial_id %in% 1:6) |>
  collect()
data_trials |>
  nest(.by = trial_id) |>
  mutate(
    walk2(
      data,
      trial_id,
      ~ {
        ggplot(.x, aes(time_id, y)) +
          geom_line(linewidth = 3, color = "grey") +
          scale_x_continuous(name = "Time (ms)") +
          scale_y_continuous(name = "Neural Activity") +
          theme_void()
        ggsave(
          paste0("figures/diagrams/trial_", .y, ".png"),
          width = 8,
          height = 2,
          dpi = 300
        )
      }
    )
  )

data_group <- arrow::open_dataset(file_cca_y) |>
  filter(trial_id %in% 1:2, cca_id == 1) |>
  collect() |>
  summarise(y = mean(y, na.rm = TRUE), .by = c(trial_id, time_id))
data_group |>
  nest(.by = trial_id) |>
  mutate(
    walk2(
      data,
      trial_id,
      ~ {
        ggplot(.x, aes(time_id, y)) +
          geom_line(linewidth = 3, color = "black") +
          scale_x_continuous(name = "Time (ms)") +
          scale_y_continuous(name = "Neural Activity") +
          theme_void()
        ggsave(
          paste0("figures/diagrams/group_avg_trial_", .y, ".png"),
          width = 8,
          height = 2,
          dpi = 300
        )
      }
    )
  )