Introduction

Part 2 aimed at investigating the links between the inter-individual scores of illusion sensitivity (obtained in study 2), contextual variables (pertaining to the experiment setting), such as screen size, demographic features (such as sex and age), and stable dispositional variables such as “general” personality traits. Indeed, despite the abundant literature on visual illusions, relatively few studies have investigated its ties with participants’ characteristics. Research examining the influence of demographic variables such as gender and age have generally found inconsistent results (Aline F. Cretenoud et al. 2020; Grzeczkowski et al. 2017; Lo and Dinov 2011; Papageorgiou et al. 2020). Regarding links with personality, most works focused on traits associated with psychopathology, such as impulsivity or sensation-seeking (Hlavatá et al. 2018; Zhang et al. 2017; Lányi et al. 2022; Pessoa et al. 2008).

Methods

library(tidyverse)
library(ggdist)
library(ggside)
library(easystats)
library(patchwork)
library(brms)

source("../study2/functions.R")

# Variables
DVs <- c(
  "Delboeuf" = "#2196F3",
  "Ebbinghaus" = "#3F51B5",
  "RodFrame" = "#F44336",
  "VerticalHorizontal" = "#FF5722",
  "Zollner" = "#FF9800",
  "White" = "#9E9E9E",
  "MullerLyer" = "#4CAF50",
  "Ponzo" = "#009688",
  "Poggendorff" = "#795548",
  "Contrast" = "#607D8B",
  "i" = "#9C27B0"
)

# Load data
dfsub <- read.csv("../data/study3.csv") |>
  mutate(
    Screen_Refresh = as.numeric(Screen_Refresh),
    Ethnicity = ifelse(Ethnicity == "Latino", "Hispanic", Ethnicity),
    Education = fct_relevel(Education, "High School", "Bachelor", "Master", "Doctorate", "Other", "Prefer not to Say")
  ) |>
  datawizard::standardise(select = names(DVs)) |>
  datawizard::change_scale(select = starts_with("IPIP"), to = c(0, 1), range = c(0, 100)) |>
  datawizard::change_scale(select = starts_with("PID"), to = c(0, 1), range = c(0, 100))

# Remove outliers (p < 0.0001)
dfsub[names(DVs)][abs(dfsub[names(DVs)]) > qnorm(0.9999)] <- NA

dflong <- dfsub |>
  pivot_longer(all_of(names(DVs)), names_to = "Index", values_to = "Score")

Participants

8 participants did not do the personality scales.

p_age <- estimate_density(dfsub$Age) |>
  ggplot(aes(x = x, y = y)) +
  geom_area(fill = "#607D8B") +
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0)) +
  labs(title = expression("Age"[" (in years)"]), color = NULL, y = "Distribution") +
  theme_modern(axis.title.space = 5) +
  theme(
    plot.title = element_text(size = rel(1), face = "bold", hjust = 0.5),
    plot.subtitle = element_text(face = "italic", hjust = 0.5),
    axis.title.y = element_text(size = rel(0.8)),
    axis.text.y = element_blank(),
    axis.text.x = element_text(size = rel(0.8)),
    axis.title.x = element_blank()
  )

p_nat <- dfsub |>
  group_by(Nationality) |>
  summarize(n = n()) |>
  mutate(Nationality = fct_reorder(Nationality, desc(n))) |>
  ggplot(aes(x = Nationality, y = n, fill = Nationality)) +
  geom_bar(stat = "identity") +
  labs(y = "Number of participants", title = "Nationality") +
  scale_fill_material_d(guide = "none") +
  scale_x_discrete(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0)) +
  theme_modern(axis.title.space = 5) +
  theme(
    plot.title = element_text(size = rel(1), face = "bold", hjust = 0.5),
    plot.subtitle = element_text(face = "italic", hjust = 0.5),
    axis.title.x = element_blank(),
    axis.title.y = element_text(size = rel(0.8)),
    axis.text.y = element_text(size = rel(0.8)),
    axis.text.x = element_text(size = rel(0.6), angle = 50, hjust = 1)
  )

ggsave("figures/figure_dem1.png",
       patchwork::wrap_elements(p_age / p_nat),
       width=0.5*(fig.height),
       height=1*(fig.height), dpi=1000, bg="white")


p_sex <- plot_waffle(dfsub, what = "Sex", rows = 10, size = 5) +
  scale_color_manual(values = c("Male" = "#2196F3", "Female" = "#E91E63"))

p_edu <- plot_waffle(dfsub, "Education", rows = 10, size = 5) +
  scale_color_viridis_d()

p_race <- plot_waffle(dfsub, "Ethnicity", rows = 10, size = 5) +
  scale_color_manual(values = c("Hispanic" = "#FF5722", "Caucasian" = "#2196F3", "African" = "#4CAF50", "Other" = "#795548"))


ggsave("figures/figure_dem2.png",
       patchwork::wrap_elements(p_sex / p_edu / p_race), width=1*(fig.height), height=1*(fig.height), dpi=1000, bg="white")



p_ipip <- dfsub |>
  select(starts_with("IPIP") & !ends_with("_SD")) |>
  estimate_density() |>
  mutate(
    Parameter = str_remove_all(Parameter, "IPIP6_"),
    Parameter = str_replace(Parameter, "HonestyHumility", "Honesty-Humility")
  ) |>
  ggplot(aes(x = x, y = y, color = Parameter)) +
  geom_line(size = 1) +
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0)) +
  scale_color_manual(values = c("Agreeableness" = "#FFC107", "Honesty-Humility" = "#00BCD4", "Extraversion" = "#9C27B0", "Conscientiousness" = "#3F51B5", "Openness" = "#4CAF50", "Neuroticism" = "#E91E63")) +
  labs(x = "Score", title = "Normal Personality", y = "Distribution", color = NULL) +
  theme_modern(axis.title.space = 5) +
  theme(
    plot.title = element_text(size = rel(1), face = "bold", hjust = 0.5),
    axis.text.y = element_blank(),
    axis.title.y = element_text(size = rel(0.8)),
    axis.text.x = element_text(size = rel(0.8)),
    axis.title.x = element_blank(),
    legend.text = element_text(size = rel(0.8))
  )

p_pid <- dfsub |>
  select(starts_with("PID") & !ends_with("_SD")) |>
  estimate_density() |>
  mutate(
    Parameter = str_remove_all(Parameter, "PID5_"),
    Parameter = str_replace(Parameter, "NegativeAffect", "Negative Affect")
  ) |>
  ggplot(aes(x = x, y = y, color = Parameter)) +
  geom_line(size = 1) +
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0)) +
  scale_color_manual(values = c("Antagonism" = "#FF9800", "Detachment" = "#03A9F4", "Disinhibition" = "#FF5722", "Negative Affect" = "#F44336", "Psychoticism" = "#673AB7")) +
  labs(x = "Score", title = "Pathological Personality", y = "Distribution", color = NULL) +
  theme_modern(axis.title.space = 5) +
  theme(
    plot.title = element_text(size = rel(1), face = "bold", hjust = 0.5),
    axis.text.y = element_blank(),
    axis.title.y = element_text(size = rel(0.8)),
    axis.text.x = element_text(size = rel(0.8)),
    axis.title.x = element_blank(),
    legend.text = element_text(size = rel(0.8))
    # legend.position = "top",
  )


ggsave("figures/figure_dem3.png",
       patchwork::wrap_elements(p_ipip / p_pid), width=2/3*(fig.height), height=1*(fig.height), dpi=1000, bg="white")



p_dem <- (
  patchwork::wrap_elements(grid::rasterGrob(png::readPNG("figures/figure_dem1.png"), interpolate = TRUE)) |
    patchwork::wrap_elements(grid::rasterGrob(png::readPNG("figures/figure_dem2.png"), interpolate = TRUE)) |
    patchwork::wrap_elements(grid::rasterGrob(png::readPNG("figures/figure_dem3.png"), interpolate = TRUE))
) +
  patchwork::plot_layout(widths = c(1 / 2, 1, 2 / 3))


p_dem +
  patchwork::plot_annotation(
    title = "Participants (n = 250)",
    theme = theme(plot.title = element_text(size = rel(1.2), face = "bold", hjust = 0.5, vjust = -10))
  )

# Run this manually to avoid saving margins
ggsave("figures/figure_dem.png", p_dem +
  patchwork::plot_annotation(
    title = "Participants (n = 250)",
    theme = theme(plot.title = element_text(size = 50, face = "bold", hjust = 0.5, vjust = 0))
  ), height = 7200, width = 15166, units = "px", limitsize = FALSE)

Results

Contextual

make_correlation <- function(x, y) {
  cor <- correlation::correlation(x,
    y,
    bayesian = TRUE,
    bayesian_prior = "medium.narrow",
    sort = TRUE
  ) |>
    datawizard::data_remove(c("ROPE_Percentage"))
  cor$`BF (Spearman)` <- format_bf(
    correlation::correlation(
      x, y,
      bayesian = TRUE,
      ranktransform = TRUE,
      bayesian_prior = "medium.narrow"
    )$BF,
    name = NULL, stars = TRUE
  )
  cor |>
    arrange(desc(BF))
}

make_correlation(dfsub[names(DVs)], dfsub[c("Screen_Size", "Screen_Refresh")])
## # Correlation Matrix (pearson-method)
## 
## Parameter1         |     Parameter2 |       rho |         95% CI |       pd |               Prior |    BF | BF (Spearman)
## -------------------------------------------------------------------------------------------------------------------------
## Contrast           |    Screen_Size |     -0.15 | [-0.27, -0.03] | 99.60%** | Beta (5.20 +- 5.20) | 4.11* |         4.31*
## White              |    Screen_Size |     -0.13 | [-0.26, -0.02] |  98.75%* | Beta (5.20 +- 5.20) |  2.05 |       28.19**
## Ponzo              |    Screen_Size |      0.08 | [-0.04,  0.20] |   88.78% | Beta (5.20 +- 5.20) | 0.419 |         0.398
## Zollner            |    Screen_Size |      0.08 | [-0.05,  0.19] |   88.98% | Beta (5.20 +- 5.20) | 0.418 |         0.640
## Ebbinghaus         | Screen_Refresh |     -0.07 | [-0.19,  0.05] |   86.65% | Beta (5.20 +- 5.20) | 0.360 |         0.790
## Delboeuf           |    Screen_Size |     -0.06 | [-0.18,  0.06] |   83.70% | Beta (5.20 +- 5.20) | 0.316 |         0.272
## White              | Screen_Refresh |      0.05 | [-0.08,  0.17] |   76.05% | Beta (5.20 +- 5.20) | 0.255 |         0.397
## Delboeuf           | Screen_Refresh |     -0.05 | [-0.17,  0.07] |   77.65% | Beta (5.20 +- 5.20) | 0.254 |         0.197
## Ponzo              | Screen_Refresh |      0.04 | [-0.09,  0.16] |   73.20% | Beta (5.20 +- 5.20) | 0.238 |         0.203
## Poggendorff        | Screen_Refresh |      0.04 | [-0.08,  0.16] |   71.80% | Beta (5.20 +- 5.20) | 0.228 |         0.548
## Contrast           | Screen_Refresh |      0.03 | [-0.09,  0.15] |   70.55% | Beta (5.20 +- 5.20) | 0.225 |         0.333
## Ebbinghaus         |    Screen_Size |      0.03 | [-0.09,  0.15] |   66.85% | Beta (5.20 +- 5.20) | 0.217 |         0.221
## RodFrame           |    Screen_Size |     -0.03 | [-0.15,  0.10] |   65.33% | Beta (5.20 +- 5.20) | 0.211 |         0.222
## VerticalHorizontal | Screen_Refresh |      0.02 | [-0.11,  0.14] |   62.42% | Beta (5.20 +- 5.20) | 0.207 |         0.221
## MullerLyer         |    Screen_Size |      0.02 | [-0.10,  0.14] |   62.95% | Beta (5.20 +- 5.20) | 0.206 |         0.200
## Zollner            | Screen_Refresh |     -0.02 | [-0.14,  0.10] |   60.85% | Beta (5.20 +- 5.20) | 0.205 |         0.214
## RodFrame           | Screen_Refresh |     -0.02 | [-0.13,  0.11] |   61.72% | Beta (5.20 +- 5.20) | 0.202 |         0.259
## VerticalHorizontal |    Screen_Size | -3.12e-03 | [-0.13,  0.12] |   51.85% | Beta (5.20 +- 5.20) | 0.197 |         0.202
## i                  |    Screen_Size |  2.83e-03 | [-0.12,  0.13] |   52.25% | Beta (5.20 +- 5.20) | 0.197 |         0.197
## i                  | Screen_Refresh | -5.60e-04 | [-0.11,  0.13] |   50.42% | Beta (5.20 +- 5.20) | 0.196 |         0.201
## MullerLyer         | Screen_Refresh | -3.86e-03 | [-0.12,  0.11] |   52.50% | Beta (5.20 +- 5.20) | 0.196 |         0.234
## Poggendorff        |    Screen_Size |  1.59e-03 | [-0.12,  0.12] |   51.20% | Beta (5.20 +- 5.20) | 0.196 |         0.196
## 
## Observations: 247-250


dflong |>
  ggplot(aes(x = Screen_Size, y = Score)) +
  geom_point2(aes(color = Index), alpha = 0.1, size = 2) +
  geom_smooth(aes(color = Index, group = Index, linetype = Index), se = FALSE, method = "lm") +
  scale_x_continuous(expand = c(0, 0)) +
  scale_size_manual(values = c("NS" = 0.5, "*" = 1)) +
  scale_linetype_manual(values = c("White" = "solid", "Contrast" = "solid", setNames(rep("dotted", 9), names(DVs)[!names(DVs) %in% c("White", "Contrast")])), guide = "none") +
  scale_color_manual(values = DVs) +
  theme_modern() +
  labs(y = "Illusion Sensitivity", x = "Screen Size", linetype = "Significance", size = "Significance") +
  ggside::geom_xsidedensity(data = dfsub, fill = "grey", color = "white") +
  ggside::geom_ysidedensity(aes(y = Score, color = Index)) +
  ggside::theme_ggside_void() +
  ggside::scale_ysidex_continuous(expand = c(0, 0)) +
  ggside::scale_xsidey_continuous(expand = c(0, 0))

Demographics

Sex

sig <- list()
params <- data.frame()
for (i in names(DVs)) {
  model <- lm(paste0(i, " ~ Sex"), data = dfsub)
  param <- parameters::parameters(model)
  param$Index <- i
  param$ymiddle <- param$Coefficient[1] + diff(param$Coefficient) / 2
  param$BF <- parameters::parameters(BayesFactor::ttestBF(formula = as.formula(paste0(i, " ~ Sex")), data = dfsub[!is.na(dfsub[[i]]), ]))$BF
  params <- rbind(params, as.data.frame(param[2, ]))
}

data <- dfsub |>
  pivot_longer(all_of(names(DVs)), names_to = "Index", values_to = "Score") |>
  mutate(
    Index = fct_relevel(Index, names(DVs)),
    Index = fct_relabel(Index, ~ prettify_itemName(.x))
  )

# parameters::parameters(BayesFactor::ttestBF(formula=Zollner ~ Sex, data=dfsub[!is.na(dfsub[[i]]), ]))

p_gender <- data |>
  ggplot(aes(x = Index, y = Score)) +
  stat_slab(data = filter(data, Sex == "Male"), aes(fill = Sex), side = "left", scale = 0.5, position = "dodge") +
  stat_slab(data = filter(data, Sex == "Female"), aes(fill = Sex), side = "right", scale = 0.5, position = "dodge") +
  stat_pointinterval(aes(group = fct_rev(Sex)), point_interval = "mean_qi", position = "dodge") +
  geom_text(data = mutate(params, sig = insight::format_bf(BF, stars_only = TRUE), Index = prettify_itemName(Index)), aes(label = sig, y = ymiddle), size = 6) +
  geom_label(
    data = mutate(params, label = insight::format_bf(BF, protect_ratio = TRUE), Index = prettify_itemName(Index)),
    aes(label = label), y = 2.7, size = 3
  ) +
  scale_fill_manual(values = c("Male" = "#2196F3", "Female" = "#E91E63")) +
  scale_x_discrete(labels = function(x) ifelse(x == "i", "Factor i", x)) +
  theme_minimal() +
  labs(fill = "", x = "Sex", y = "Illusion Sensitivity", title = "Sex") +
  theme(
    legend.position = "top",
    axis.title.x = element_blank(),
    plot.title = element_text(size = rel(1), face = "bold", hjust = 0.5)
  )

p_gender

# ggsave("figures/figure_sex.png", p_gender, width=15166, height=5000, bg="white", units = "px", limitsize = FALSE, scale = 0.3)

Education

preds <- data.frame()
for (i in names(DVs)) {
  model <- brms::brm(paste0(i, " ~ mo(as.numeric(Education))"), data = filter(dfsub, !Education %in% c("Other", "Prefer not to Say")), refresh = 0)
  param <- bayestestR::describe_posterior(as.data.frame(model)["bsp_moas.numericEducation"])

  pred <- estimate_relation(model)
  pred$Index <- i
  pred$sig <- param$pd
  preds <- rbind(preds, pred)
}
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.3 seconds.
## Chain 2 finished in 0.3 seconds.
## Chain 3 finished in 0.3 seconds.
## Chain 4 finished in 0.3 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.3 seconds.
## Total execution time: 0.5 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.4 seconds.
## Chain 2 finished in 0.4 seconds.
## Chain 4 finished in 0.4 seconds.
## Chain 3 finished in 0.4 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.4 seconds.
## Total execution time: 0.5 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.3 seconds.
## Chain 2 finished in 0.3 seconds.
## Chain 3 finished in 0.4 seconds.
## Chain 4 finished in 0.4 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.3 seconds.
## Total execution time: 0.5 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.3 seconds.
## Chain 2 finished in 0.3 seconds.
## Chain 3 finished in 0.3 seconds.
## Chain 4 finished in 0.3 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.3 seconds.
## Total execution time: 0.4 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.4 seconds.
## Chain 2 finished in 0.4 seconds.
## Chain 3 finished in 0.3 seconds.
## Chain 4 finished in 0.4 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.4 seconds.
## Total execution time: 0.5 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 4 finished in 0.3 seconds.
## Chain 1 finished in 0.4 seconds.
## Chain 2 finished in 0.4 seconds.
## Chain 3 finished in 0.3 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.3 seconds.
## Total execution time: 0.5 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.3 seconds.
## Chain 2 finished in 0.3 seconds.
## Chain 3 finished in 0.3 seconds.
## Chain 4 finished in 0.3 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.3 seconds.
## Total execution time: 0.4 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 2 finished in 0.3 seconds.
## Chain 3 finished in 0.3 seconds.
## Chain 1 finished in 0.4 seconds.
## Chain 4 finished in 0.4 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.4 seconds.
## Total execution time: 0.5 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 2 finished in 0.5 seconds.
## Chain 3 finished in 0.4 seconds.
## Chain 4 finished in 0.4 seconds.
## Chain 1 finished in 0.5 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.4 seconds.
## Total execution time: 0.6 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.4 seconds.
## Chain 2 finished in 0.4 seconds.
## Chain 3 finished in 0.4 seconds.
## Chain 4 finished in 0.4 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.4 seconds.
## Total execution time: 0.5 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.4 seconds.
## Chain 4 finished in 0.3 seconds.
## Chain 2 finished in 0.4 seconds.
## Chain 3 finished in 0.4 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.4 seconds.
## Total execution time: 0.5 seconds.

preds |>
  mutate(
    sig = format_pd(sig, stars_only = TRUE),
    sig = ifelse(sig == "", "NS", sig)
  ) |>
  ggplot(aes(x = Education, y = Predicted)) +
  geom_line(aes(color = Index, group = Index, linetype = sig, size = sig)) +
  scale_size_manual(values = c("NS" = 0.5, "*" = 1)) +
  scale_linetype_manual(values = c("NS" = "dotted", "*" = "solid")) +
  theme_modern()

Age

preds <- data.frame()
for (i in names(DVs)) {
  gam <- brms::brm(paste0(i, " ~ s(Age, k=3)"), data = dfsub, refresh = 0, seed = 1)
  model <- brms::brm(paste0(i, " ~ poly(Age, 2)"), data = dfsub, refresh = 0, seed = 1)

  param <- parameters::parameters(model)
  slopes <- estimate_slopes(gam, trend = "Age")

  pred <- get_datagrid(gam, at = "Age", length = 50)
  pred$Predicted <- get_predicted(gam, data = pred)

  pred$ylabel <- pred$Predicted[50]
  pred$Index <- i
  pred$Effect <- slopes$Coefficient
  pred$pd_gam <- slopes$pd
  pred$pd_poly1 <- param$pd[2]
  pred$pd_poly2 <- param$pd[3]
  preds <- rbind(preds, pred)
}
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.2 seconds.
## Chain 2 finished in 0.2 seconds.
## Chain 3 finished in 0.2 seconds.
## Chain 4 finished in 0.2 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.2 seconds.
## Total execution time: 0.4 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.1 seconds.
## Chain 2 finished in 0.1 seconds.
## Chain 3 finished in 0.1 seconds.
## Chain 4 finished in 0.1 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.1 seconds.
## Total execution time: 0.3 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.3 seconds.
## Chain 2 finished in 0.3 seconds.
## Chain 3 finished in 0.3 seconds.
## Chain 4 finished in 0.2 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.3 seconds.
## Total execution time: 0.4 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.1 seconds.
## Chain 2 finished in 0.1 seconds.
## Chain 3 finished in 0.1 seconds.
## Chain 4 finished in 0.1 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.1 seconds.
## Total execution time: 0.3 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.2 seconds.
## Chain 2 finished in 0.2 seconds.
## Chain 3 finished in 0.2 seconds.
## Chain 4 finished in 0.3 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.2 seconds.
## Total execution time: 0.4 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.1 seconds.
## Chain 2 finished in 0.1 seconds.
## Chain 3 finished in 0.1 seconds.
## Chain 4 finished in 0.1 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.1 seconds.
## Total execution time: 0.3 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.2 seconds.
## Chain 2 finished in 0.3 seconds.
## Chain 3 finished in 0.3 seconds.
## Chain 4 finished in 0.3 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.3 seconds.
## Total execution time: 0.4 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.1 seconds.
## Chain 2 finished in 0.1 seconds.
## Chain 3 finished in 0.1 seconds.
## Chain 4 finished in 0.1 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.1 seconds.
## Total execution time: 0.3 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.2 seconds.
## Chain 3 finished in 0.2 seconds.
## Chain 2 finished in 0.3 seconds.
## Chain 4 finished in 0.2 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.2 seconds.
## Total execution time: 0.4 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.1 seconds.
## Chain 2 finished in 0.1 seconds.
## Chain 3 finished in 0.1 seconds.
## Chain 4 finished in 0.1 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.1 seconds.
## Total execution time: 0.3 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 2 finished in 0.2 seconds.
## Chain 3 finished in 0.2 seconds.
## Chain 1 finished in 0.3 seconds.
## Chain 4 finished in 0.3 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.3 seconds.
## Total execution time: 0.4 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.1 seconds.
## Chain 2 finished in 0.1 seconds.
## Chain 3 finished in 0.1 seconds.
## Chain 4 finished in 0.1 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.1 seconds.
## Total execution time: 0.3 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.3 seconds.
## Chain 2 finished in 0.3 seconds.
## Chain 3 finished in 0.3 seconds.
## Chain 4 finished in 0.3 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.3 seconds.
## Total execution time: 0.4 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.1 seconds.
## Chain 2 finished in 0.1 seconds.
## Chain 3 finished in 0.1 seconds.
## Chain 4 finished in 0.1 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.1 seconds.
## Total execution time: 0.3 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.3 seconds.
## Chain 2 finished in 0.3 seconds.
## Chain 3 finished in 0.2 seconds.
## Chain 4 finished in 0.3 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.3 seconds.
## Total execution time: 0.4 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.1 seconds.
## Chain 2 finished in 0.1 seconds.
## Chain 3 finished in 0.1 seconds.
## Chain 4 finished in 0.1 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.1 seconds.
## Total execution time: 0.3 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 3 finished in 0.2 seconds.
## Chain 1 finished in 0.3 seconds.
## Chain 2 finished in 0.3 seconds.
## Chain 4 finished in 0.3 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.3 seconds.
## Total execution time: 0.4 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.1 seconds.
## Chain 2 finished in 0.1 seconds.
## Chain 3 finished in 0.1 seconds.
## Chain 4 finished in 0.1 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.1 seconds.
## Total execution time: 0.3 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.2 seconds.
## Chain 2 finished in 0.3 seconds.
## Chain 3 finished in 0.2 seconds.
## Chain 4 finished in 0.3 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.3 seconds.
## Total execution time: 0.4 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.1 seconds.
## Chain 2 finished in 0.1 seconds.
## Chain 3 finished in 0.1 seconds.
## Chain 4 finished in 0.1 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.1 seconds.
## Total execution time: 0.3 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.3 seconds.
## Chain 2 finished in 0.3 seconds.
## Chain 3 finished in 0.3 seconds.
## Chain 4 finished in 0.2 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.3 seconds.
## Total execution time: 0.4 seconds.
## 
## Running MCMC with 4 parallel chains...
## 
## Chain 1 finished in 0.1 seconds.
## Chain 2 finished in 0.1 seconds.
## Chain 3 finished in 0.1 seconds.
## Chain 4 finished in 0.1 seconds.
## 
## All 4 chains finished successfully.
## Mean chain execution time: 0.1 seconds.
## Total execution time: 0.3 seconds.

preds |>
  group_by(Index) |>
  slice(1) |>
  select(-Predicted, -Age) |>
  arrange(desc(pd_gam))
## # A tibble: 11 × 6
## # Groups:   Index [11]
##     ylabel Index                 Effect pd_gam pd_poly1 pd_poly2
##      <dbl> <chr>                  <dbl>  <dbl>    <dbl>    <dbl>
##  1  0.916  i                   0.0307    1        1.00     0.918
##  2  1.19   MullerLyer          0.0421    1        1        0.967
##  3  0.971  VerticalHorizontal  0.0314    1.00     1        0.918
##  4  1.22   Zollner             0.0284    0.998    1        0.526
##  5  0.616  Ebbinghaus          0.0226    0.989    0.993    0.908
##  6  0.633  RodFrame            0.0122    0.885    0.943    0.633
##  7  0.122  Contrast            0.0117    0.870    0.807    0.884
##  8  0.146  Ponzo               0.00558   0.740    0.705    0.769
##  9 -0.306  Poggendorff         0.00601   0.720    0.517    0.957
## 10  0.0676 Delboeuf            0.00148   0.562    0.550    0.561
## 11 -0.154  White              -0.000725  0.527    0.581    0.659

p_age <- preds |>
  mutate(
    pd_gam = format_pd(pd_gam, stars_only = TRUE),
    pd_gam = ifelse(pd_gam == "", "NS", pd_gam)
  ) |>
  ggplot(aes(x = Age, y = Predicted)) +
  geom_line(aes(color = Index, group = Index, linetype = pd_gam, size = pd_gam)) +
  ggrepel::geom_label_repel(
    data = preds |>
      group_by(Index) |>
      slice(1) |>
      mutate(label = prettify_itemName(ifelse(Index == "i", "Factor i", Index))),
    aes(y = ylabel, label = label, x = 69, color = Index), hjust = 0, direction = "y",
    min.segment.length = 3
  ) +
  scale_size_manual(values = c("NS" = 0.5, "*" = 1, "**" = 1, "***" = 1)) +
  scale_linetype_manual(values = c("NS" = "dotted", "*" = "solid", "**" = "solid", "***" = "solid")) +
  scale_x_continuous(expand = c(0, 0)) +
  scale_color_manual(values = DVs) +
  guides(size = "none", linetype = "none", color = "none") +
  theme_modern() +
  labs(y = "Illusion Sensitivity", title = "Age") +
  theme(
    legend.position = "top",
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    plot.title = element_text(size = rel(1), face = "bold", hjust = 0.5)
  )

p_age

ggsave("figures/figure_agesex.png",
  (p_gender + p_age) + plot_layout(widths = c(2 / 3, 1 / 3)) +
    patchwork::plot_annotation(
      title = "Illusion Sensitivity and Demographic Variables",
      theme = theme(plot.title = element_text(size = rel(1.5), face = "bold", hjust = 0.5, vjust = 0))
    ),
  width = 15166, height = 5000, bg = "white", units = "px", limitsize = FALSE, dpi = 800, scale = 1
)

Personality

IPIP6

cor <- make_correlation(
  datawizard::data_select(dfsub, names(DVs)),
  select(dfsub, starts_with("IPIP") & !ends_with("_SD"))
)



cor |>
  data_filter(BF > 1) |>
  arrange(desc(BF))
## # Correlation Matrix (pearson-method)
## 
## Parameter1         |              Parameter2 |   rho |         95% CI |        pd |               Prior |        BF | BF (Spearman)
## -----------------------------------------------------------------------------------------------------------------------------------
## Zollner            |   IPIP6_HonestyHumility |  0.24 | [ 0.12,  0.34] | 99.98%*** | Beta (5.20 +- 5.20) | 283.12*** |     175.73***
## VerticalHorizontal |     IPIP6_Agreeableness |  0.19 | [ 0.07,  0.32] |   100%*** | Beta (5.20 +- 5.20) |   25.06** |     109.13***
## i                  |     IPIP6_Agreeableness |  0.19 | [ 0.07,  0.31] |  99.85%** | Beta (5.20 +- 5.20) |   19.65** |      49.04***
## VerticalHorizontal |   IPIP6_HonestyHumility |  0.18 | [ 0.05,  0.29] |  99.75%** | Beta (5.20 +- 5.20) |     9.78* |         8.22*
## Ponzo              |     IPIP6_Agreeableness |  0.16 | [ 0.04,  0.28] |  99.50%** | Beta (5.20 +- 5.20) |     4.88* |       14.11**
## i                  |   IPIP6_HonestyHumility |  0.16 | [ 0.03,  0.27] |   98.83%* | Beta (5.20 +- 5.20) |     4.00* |          2.24
## Ebbinghaus         |   IPIP6_HonestyHumility |  0.15 | [ 0.04,  0.28] |  99.30%** | Beta (5.20 +- 5.20) |     3.69* |          1.84
## Ebbinghaus         |          IPIP6_Openness |  0.14 | [ 0.03,  0.27] |   98.67%* | Beta (5.20 +- 5.20) |      2.37 |          1.72
## MullerLyer         |       IPIP6_Neuroticism | -0.14 | [-0.25, -0.01] |   98.40%* | Beta (5.20 +- 5.20) |      2.18 |         0.797
## MullerLyer         |          IPIP6_Openness |  0.14 | [ 0.02,  0.25] |   98.58%* | Beta (5.20 +- 5.20) |      2.17 |          1.61
## Ebbinghaus         |     IPIP6_Agreeableness |  0.13 | [ 0.01,  0.26] |   98.20%* | Beta (5.20 +- 5.20) |      1.97 |          1.41
## RodFrame           | IPIP6_Conscientiousness | -0.13 | [-0.26, -0.02] |   97.92%* | Beta (5.20 +- 5.20) |      1.74 |          1.38
## RodFrame           |   IPIP6_HonestyHumility |  0.13 | [ 0.00,  0.25] |   97.90%* | Beta (5.20 +- 5.20) |      1.69 |         0.453
## Zollner            |       IPIP6_Neuroticism | -0.13 | [-0.25,  0.00] |   97.60%* | Beta (5.20 +- 5.20) |      1.67 |          1.17
## i                  |          IPIP6_Openness |  0.13 | [ 0.00,  0.25] |   97.95%* | Beta (5.20 +- 5.20) |      1.61 |          1.00
## White              |     IPIP6_Agreeableness |  0.12 | [ 0.00,  0.25] |   97.25%* | Beta (5.20 +- 5.20) |      1.38 |          2.09
## MullerLyer         |     IPIP6_Agreeableness |  0.11 | [-0.01,  0.23] |    96.30% | Beta (5.20 +- 5.20) |      1.05 |         0.744
## Contrast           |      IPIP6_Extraversion |  0.11 | [-0.01,  0.23] |    96.40% | Beta (5.20 +- 5.20) |      1.01 |          1.25
## 
## Observations: 239-242


cor |>
  mutate(
    label = paste0(format_value(rho, zap_small = TRUE), insight::format_bf(BF, stars_only = TRUE)),
    Parameter2 = prettify_parameterName(Parameter2),
    Parameter2 = str_remove_all(Parameter2, "IPIP6 - ")
  ) |>
  ggplot(aes(x = Parameter2, y = Parameter1)) +
  geom_tile(aes(fill = rho)) +
  geom_text(aes(label = label), size = 3) +
  scale_alpha_continuous(range = c(1, 0.5)) +
  scale_fill_gradient2(low = "#2196F3", mid = "white", high = "#F44336", midpoint = 0, limit = c(-1, 1), space = "Lab", name = "Correlation", guide = "legend") +
  labs(y = "Illusion Sensitivity Scores", x = "Normal Personality (IPIP6)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))




p_ipip1 <- plot_correlation(dfsub, x = "i", y = "IPIP6_Agreeableness", fill = "#FFC107")
p_ipip2 <- plot_correlation(dfsub, x = "i", y = "IPIP6_HonestyHumility", fill = "#00BCD4")


(p_ipip1 + plot_correlation(dfsub, x = "VerticalHorizontal", y = "IPIP6_Agreeableness", fill = "#FFC107") + plot_correlation(dfsub, x = "Ponzo", y = "IPIP6_Agreeableness", fill = "#FFC107")) /
  (p_ipip2 + plot_correlation(dfsub, x = "Zollner", y = "IPIP6_HonestyHumility", fill = "#00BCD4") + plot_correlation(dfsub, x = "VerticalHorizontal", y = "IPIP6_HonestyHumility", fill = "#00BCD4"))

PID-5

cor <- make_correlation(
  datawizard::data_select(dfsub, names(DVs)),
  select(dfsub, starts_with("PID") & !ends_with("_SD"))
)


cor |>
  data_filter(BF > 1) |>
  arrange(desc(BF))
## # Correlation Matrix (pearson-method)
## 
## Parameter1         |          Parameter2 |   rho |         95% CI |        pd |               Prior |        BF | BF (Spearman)
## -------------------------------------------------------------------------------------------------------------------------------
## VerticalHorizontal |     PID5_Antagonism | -0.24 | [-0.35, -0.11] | 99.98%*** | Beta (5.20 +- 5.20) | 221.00*** |     160.46***
## VerticalHorizontal |   PID5_Psychoticism | -0.21 | [-0.32, -0.09] |   100%*** | Beta (5.20 +- 5.20) |  66.63*** |      60.90***
## Zollner            | PID5_NegativeAffect | -0.21 | [-0.33, -0.09] |   100%*** | Beta (5.20 +- 5.20) |  62.04*** |      32.04***
## i                  |     PID5_Antagonism | -0.21 | [-0.32, -0.09] |   100%*** | Beta (5.20 +- 5.20) |  55.45*** |       10.14**
## MullerLyer         |   PID5_Psychoticism | -0.20 | [-0.33, -0.08] | 99.92%*** | Beta (5.20 +- 5.20) |  35.59*** |      69.93***
## i                  |   PID5_Psychoticism | -0.20 | [-0.33, -0.09] | 99.98%*** | Beta (5.20 +- 5.20) |  35.02*** |       25.48**
## i                  |  PID5_Disinhibition | -0.20 | [-0.31, -0.08] |  99.90%** | Beta (5.20 +- 5.20) |  31.42*** |         8.94*
## VerticalHorizontal |  PID5_Disinhibition | -0.20 | [-0.32, -0.08] |   100%*** | Beta (5.20 +- 5.20) |   25.38** |       15.05**
## MullerLyer         |     PID5_Antagonism | -0.19 | [-0.31, -0.07] | 99.92%*** | Beta (5.20 +- 5.20) |   21.57** |          2.98
## Ponzo              |     PID5_Antagonism | -0.19 | [-0.31, -0.08] | 99.95%*** | Beta (5.20 +- 5.20) |   17.97** |         5.43*
## VerticalHorizontal | PID5_NegativeAffect | -0.18 | [-0.30, -0.07] |  99.70%** | Beta (5.20 +- 5.20) |   12.65** |         6.69*
## Zollner            |  PID5_Disinhibition | -0.17 | [-0.29, -0.05] |  99.50%** | Beta (5.20 +- 5.20) |     7.59* |         3.12*
## i                  | PID5_NegativeAffect | -0.16 | [-0.28, -0.05] |  99.60%** | Beta (5.20 +- 5.20) |     6.39* |         3.18*
## MullerLyer         |  PID5_Disinhibition | -0.16 | [-0.28, -0.05] |  99.70%** | Beta (5.20 +- 5.20) |     5.89* |         3.86*
## Ponzo              |   PID5_Psychoticism | -0.16 | [-0.28, -0.04] |  99.20%** | Beta (5.20 +- 5.20) |     3.93* |          2.03
## MullerLyer         | PID5_NegativeAffect | -0.15 | [-0.26, -0.02] |  99.17%** | Beta (5.20 +- 5.20) |     3.17* |          2.96
## Ebbinghaus         |  PID5_Disinhibition | -0.14 | [-0.26, -0.01] |   98.72%* | Beta (5.20 +- 5.20) |      2.54 |         0.890
## Ponzo              | PID5_NegativeAffect | -0.12 | [-0.25, -0.01] |   97.82%* | Beta (5.20 +- 5.20) |      1.39 |         0.668
## VerticalHorizontal |     PID5_Detachment | -0.12 | [-0.24,  0.00] |   97.17%* | Beta (5.20 +- 5.20) |      1.24 |          1.00
## 
## Observations: 239-242



cor |>
  mutate(label = paste0(format_value(rho, zap_small = TRUE), insight::format_bf(BF, stars_only = TRUE))) |>
  ggplot(aes(x = Parameter2, y = Parameter1)) +
  geom_tile(aes(fill = rho)) +
  geom_text(aes(label = label), size = 3) +
  scale_alpha_continuous(range = c(1, 0.5)) +
  scale_fill_gradient2(low = "#2196F3", mid = "white", high = "#F44336", midpoint = 0, limit = c(-1, 1), space = "Lab", name = "Correlation", guide = "legend") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))






p_pid1 <- plot_correlation(dfsub, x = "i", y = "PID5_Antagonism", fill = "#FF9800")
p_pid2 <- plot_correlation(dfsub, x = "i", y = "PID5_Disinhibition", fill = "#FF5722")
p_pid3 <- plot_correlation(dfsub, x = "i", y = "PID5_Psychoticism", fill = "#673AB7")
p_pid4 <- plot_correlation(dfsub, x = "i", y = "PID5_NegativeAffect", fill = "#F44336")

(p_pid1 | plot_correlation(dfsub, x = "VerticalHorizontal", y = "PID5_Antagonism", fill = "#FF9800") | plot_correlation(dfsub, x = "Ponzo", y = "PID5_Antagonism", fill = "#FF9800")) / (p_pid2 | p_pid3 | p_pid4)




p_pers <- (p_ipip1 +
  theme(
    axis.title.y = element_text(face = "bold"),
    axis.title.x = element_blank()
  )) /
  (p_ipip2 +
    theme(
      axis.title.y = element_text(face = "bold"),
      axis.title.x = element_blank()
    )) |
  (p_pid1 +
    theme(
      axis.title.y = element_text(face = "bold"),
      axis.title.x = element_blank()
    )) /
    (p_pid2 +
      labs(x = expression("Factor" ~ italic(i))) +
      theme(
        axis.title.y = element_text(face = "bold"),
        axis.title.x = element_text(size = rel(1.5), face = "bold")
      )) |
  (p_pid3 +
    theme(
      axis.title.y = element_text(face = "bold"),
      axis.title.x = element_blank()
    )) /
    (p_pid4 +
      theme(
        axis.title.y = element_text(face = "bold"),
        axis.title.x = element_blank()
      ))



# ggsave("figures/figure_pers.png",
#        p_pers + patchwork::plot_annotation(
#          title = "Illusion Sensitivity and Personality",
#          theme = theme(plot.title = element_text(size = rel(1.5), face="bold", hjust=0.5, vjust=0))),
#        width=15166, height=8000, bg="white", units = "px", limitsize = FALSE, dpi=800, scale = 1)

Table and Figure

table1 <- ripip |>
  rbind(rpid) |>
  data_remove(c("ROPE_Percentage", "Prior_Distribution", "Prior_Location", "Prior_Scale", "pd")) |>
  separate(Parameter2, "_", into = c("Scale", "Dimension")) |>
  arrange(Scale, desc(BF)) |>
  filter(BF > 3)

table1 |>
  print_md()

table1 |>
  format_table() |>
  select(-Method, -n_Obs) |>
  rename(Factor = Parameter1) |>
  write.csv("table1.csv", row.names = FALSE)
p <- 
  # patchwork::wrap_elements(grid::rasterGrob(png::readPNG("figures/figure_dem.png"), interpolate = TRUE)) /
  patchwork::wrap_elements(grid::rasterGrob(png::readPNG("figures/figure_agesex.png"), interpolate = TRUE)) /
  patchwork::wrap_elements(grid::rasterGrob(png::readPNG("figures/figure_pers.png"), interpolate = TRUE)) +
  # plot_layout(heights = c(7200, 5000, 8000))
  plot_layout(heights = c(5000, 8000))

ggsave("../figures/figure4.png", p, height = 5000+8000, width = 15166, units = "px", limitsize = FALSE)

Discussion

Indeed, despite the abundant literature on visual illusions, relatively few studies have investigated its ties with participants’ characteristics. Research examining the influence of demographic variables such as gender and age have generally found inconsistent results (Aline F. Cretenoud et al. 2020; Grzeczkowski et al. 2017; Lo and Dinov 2011; Papageorgiou et al. 2020). Regarding links with personality, most works focused on traits associated with psychopathology, such as impulsivity or sensation-seeking (Hlavatá et al. 2018; Zhang et al. 2017; Lányi et al. 2022; Pessoa et al. 2008).

We report significant links between inter-individual indices of illusion sensitivity and variables related to experimental context, demographic characteristics and personality. Firstly, screen size was found to have a significant negative relationship with the sensitivity to the two contrast-based illusions, namely the White and Contrast illusions. One possible explanation can be found in the mechanism by which visual systems filter through more low spatial frequencies when the size of the target object is small (Dixon, Shapiro, and Lu 2014). As this filtering process excludes illumination information from visual processing, smaller screen sizes could yield artifactual changes in brightness perception, which in turn could attenuate the illusory effect of luminance-related illusions.

Our results suggested an inconsistent pattern of non-significant sex-differences, with the exception of greater sensitivity of males as compared to females for the Zöllner illusion. Although we do not consider this result as significant given its specificity, we note that the existing literature reports, if any differences, that females exhibited greater illusion sensitivity (Lo and Dinov 2011; Miller 2001; Papageorgiou et al. 2020). This inconsistency could be due to past studies using a measure of illusion sensitivity that conflates the effect of illusions per se with the perceptual abilities involved in the task, for which gender-related differences can be found (in fact, the authors mention sex-differences in visuospatial strategies as the potential mechanism underlying their findings). On the contrary, the perceptual difficulty of the task and the illusion effect was independently modulated in our paradigm, and statistically dissociated. Our scores of illusion sensitivity might thus be less loaded with perceptual skills, thereby mitigating its effect.

Our findings also suggested a positive relationship between illusion sensitivity and two “normal” personality traits, namely Honesty-Humility and Agreeableness, and a negative link with Antagonism. Although the past literature regarding the links between illusion sensitivity and personality traits remain scarce, convergent evidence can be found in studies reporting a negative relationship between illusion sensitivity and hostility, aggression and narcissism (Zhang et al. 2017; Konrath, Bushman, and Grove 2009; Pessoa et al. 2008). While this result’s interpretation is challenging, one possible explanation could be drawn from the literature on the cognitive style known as field dependence. Since narcissism and aggression tendencies are correlated with lower field dependence (i.e., a lesser reliance on external cues in ambiguous contexts, Witkin and Goodenough 1976; Ohmann and Burgmer 2016; D’Amour et al. 2021), opposite traits, such as Honesty-Humility and Agreeableness, could conversely be more biased by contextual cues and thus more sensitive to illusions.

The positive relationship between illusion sensitivity and “positive” personality traits is mirrored by a negative relationship with several other pathological traits, including Psychoticism, Disinhibition, and Negative Affect. These results are, in general, consistent with past findings and theories, suggesting a negative relationship between egocentric cognitive styles and context processing (including illusion sensitivity, Konrath, Bushman, and Grove 2009). For instance, pathological egocentric beliefs (often observed alongside Psychoticism, Fox 2006) have been related to reduced context integration (manifesting for instance in a tendency to separate objects from their surroundings when processing visual stimuli, Ohmann and Burgmer 2016; Konrath, Bushman, and Grove 2009; Fox 2006). As such, it is possible to relate this higher resistance to illusions to a self-centered, decontextualized and disorganized information processing style, which can be found across the aforementioned maladaptive personality traits (Msetfi et al. 2009; Parkes 1981; Calamari, Pini, and Puleggio 2000; Hoyle 2006) .

Furthermore, these results in favour of a link between illusion sensitivity and maladaptive personality traits in a non-clinical population could be put in relation with clinical findings, which could be seen as extreme cases where the relationship with illusion sensitivity is the most manifest. In line with our results (in particular on Psychoticism and Disinhibition), prior research has found greater illusion resistance in schizophrenia (Notredame et al. 2014; Pessoa et al. 2008; Grzeczkowski et al. 2018), and in particular, in association with schizotypal traits, such as cognitive disorganization (Aline F. Cretenoud et al. 2019; Lányi et al. 2022).

References

Calamari, Elena, Mauro Pini, and Antonio Puleggio. 2000. “Field Dependence and Verbalized Strategies on the Portable Rod-and-Frame Test by Depressed Outpatients and Normal Controls.” Perceptual and Motor Skills 91 (3_suppl): 1221–29.
Cretenoud, Aline F, Lukasz Grzeczkowski, Marco Bertamini, and Michael H Herzog. 2020. “Individual Differences in the müller-Lyer and Ponzo Illusions Are Stable Across Different Contexts.” Journal of Vision 20 (6): 4–4.
Cretenoud, Aline F., Harun Karimpur, Lukasz Grzeczkowski, Gregory Francis, Kai Hamburger, and Michael H. Herzog. 2019. “Factors Underlying Visual Illusions Are Illusion-Specific but Not Feature-Specific.” Journal of Vision 19 (14): 12. https://doi.org/10.1167/19.14.12.
D’Amour, Sarah, Laurence R. Harris, Stefan Berti, and Behrang Keshavarz. 2021. “The Role of Cognitive Factors and Personality Traits in the Perception of Illusory Self-Motion (Vection).” Attention, Perception & Psychophysics 83 (4): 1804–17. https://doi.org/10.3758/s13414-020-02228-3.
Dixon, Erica, Arthur Shapiro, and Zhong-Lin Lu. 2014. “Scale-Invariance in Brightness Illusions Implicates Object-Level Visual Processing.” Scientific Reports 4 (1): 3900. https://doi.org/10.1038/srep03900.
Fox, Andrew. 2006. “Adolescent Self-Development and Psychopathology: Anorexia Nervosa and Psychosis.” PhD thesis.
Grzeczkowski, Lukasz, Aaron M. Clarke, Gregory Francis, Fred W. Mast, and Michael H. Herzog. 2017. “About Individual Differences in Vision.” Vision Research, Individual differences as a window into the structure and function of the visual system, 141 (December): 282–92. https://doi.org/10.1016/j.visres.2016.10.006.
Grzeczkowski, Lukasz, Maya Roinishvili, Eka Chkonia, Andreas Brand, Fred W. Mast, Michael H. Herzog, and Albulena Shaqiri. 2018. “Is the Perception of Illusions Abnormal in Schizophrenia?” Psychiatry Research 270 (December): 929–39. https://doi.org/10.1016/j.psychres.2018.10.063.
Hlavatá, Pavlína, Tomáš Kašpárek, Pavla Linhartová, Hana Ošlejšková, and Martin Bareš. 2018. “Autism, Impulsivity and Inhibition a Review of the Literature.” Basal Ganglia 14 (November): 44–53. https://doi.org/10.1016/j.baga.2018.10.002.
Hoyle, Rick H. 2006. “Personality and self-regulation: trait and information-processing perspectives.” Journal of Personality 74 (6): 1507–25. https://doi.org/10.1111/j.1467-6494.2006.00418.x.
Konrath, Sara, Brad J Bushman, and Tyler Grove. 2009. “Seeing My World in a Million Little Pieces: Narcissism, Self-Construal, and Cognitive–Perceptual Style.” Journal of Personality 77 (4): 1197–1228.
Lányi, Orsolya, Szabolcs Keri, Zsófia Pálffy, and Bertalan Polner. 2022. “Can You Believe Your Eyes? Positive Schizotypy Is Associated with Increased Susceptibility to the müller-Lyer Illusion.”
Lo, Ka Chai, and Dr Ivo Dinov. 2011. “Investigation of Optical Illusions on the Aspects of Gender and Age” 24: 8.
Miller, R. J. 2001. “Gender Differences in Illusion Response: The Inffluence of Spatial Strategy and Sex Ratio.” Sex Roles 44 (3/4): 209–25. https://doi.org/10.1023/A:1010907204430.
Msetfi, Rachel M., Robin A. Murphy, Diana E. Kornbrot, and Jane Simpson. 2009. “Short Article: Impaired Context Maintenance in Mild to Moderately Depressed Students.” Quarterly Journal of Experimental Psychology 62 (4): 653–62. https://doi.org/10.1080/17470210802486092.
Notredame, Charles-Edouard, Delphine Pins, Sophie Deneve, and Renaud Jardri. 2014. “What Visual Illusions Teach Us about Schizophrenia.” Frontiers in Integrative Neuroscience 8 (August): 63. https://doi.org/10.3389/fnint.2014.00063.
Ohmann, Katharina, and Pascal Burgmer. 2016. “Nothing Compares to Me: How Narcissism Shapes Comparative Thinking.” Personality and Individual Differences 98 (August): 162–70. https://doi.org/10.1016/j.paid.2016.03.069.
Papageorgiou, Charalabos, Xanthi Stachtea, Panos Papageorgiou, Antonio T. Alexandridis, Gerasimos Makris, George Chrousos, and George Kosteletos. 2020. “Gender-Dependent Variations in Optical Illusions: Evidence from N400 Waveforms.” Physiological Measurement 41 (9): 095006. https://doi.org/10.1088/1361-6579/abb2eb.
Parkes, Katharine R. 1981. “Field Dependence and the Differentiation of Affective States.” The British Journal of Psychiatry 139 (1): 52–58.
Pessoa, V. F., V. Monge-Fuentes, C. Y. Simon, E. Suganuma, and M. C. H. Tavares. 2008. “The Müller-Lyer Illusion as a Tool for Schizophrenia Screening.” Reviews in the Neurosciences 19 (2-3). https://doi.org/10.1515/REVNEURO.2008.19.2-3.91.
Witkin, Herman A., and Donald R. Goodenough. 1976. “Field Dependence and Interpersonal Behavior.” ETS Research Bulletin Series 1976 (1): i–78. https://doi.org/10.1002/j.2333-8504.1976.tb01098.x.
Zhang, Yingchun, Jing Liu, Yongli Wang, Jingyi Huang, Lili Wei, Bingren Zhang, Wei Wang, and Wei Chen. 2017. “Personality Traits and Perception of Müller-Lyer Illusion in Male Chinese Military Soldiers and University Students.” Translational Neuroscience 8 (1): 15–20. https://doi.org/10.1515/tnsci-2017-0004.