Introduction

Most experiments within consciousness research assume the dictum that awareness is dichotomous phenomenon. Nonetheless, participants can distinguish multiple levels of subjective experience of simple features, which correlates with their performance in difference tasks.

It questions the idea that many forms of perception occurs unconsciously.

Here we show that awareness of food images is gradual rather than dichotomous, while showing, at the same time, that the effects of taste priming by music are predicted by the level of perceptual awareness of the food images. When the report is of “no image seen”, there is no effect.

These results question how much musical priming actually influence behavior when the target is either conscious or unconscious. Priming is believed to be one of the most established phenomena, but these results with others expands the growing body of evidence that question the contributions of unconscious processing on behavior.

Final version of the study

Image types: 4 salty and 4 sweet.

Flashing-speed of these images: 0ms, 2ms, 17ms, 25ms, 33ms, 42ms, and 50ms.

Sound conditions blocks: Silent, Sweet, or Salty

8 images shown at 8 speeds equals 64 trials.

Each block at 5 minutes at 300s ≈ 60 trials.

Total of 64 trials in 3 blocks = 192 trials.

Practice test: 4 x 8 = 32 trials.

30 min total time with 50 participants on-site using 120Hz screen.

Study set-up illustrated

Study flow

  1. Fixation period (2000 ms).
  2. Target image presentation at one of the pre-set durations.
  3. Masking of the image (1000 ms).
  4. Classification task: Participants indicate whether the image was sweet or salty.
  5. Awareness response: Participants provide a rating on the Perceptual Awareness Scale. # Exploratory analysis of data

Preprocessing

Libraries
library(readxl)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
Tidying data
# Load sweet
sweet <- read_excel("data_exp_17023-v16_task-ocq1-sweet.xlsx")
## New names:
## • `` -> `...53`
# Load salty
salty <- read_excel("data_exp_17023-v16_task-xl9t-salty.xlsx")
## New names:
## • `` -> `...53`
# Load silent
silent <- read_excel("data_exp_17023-v16_task-r4gk-silence.xlsx")
## New names:
## • `` -> `...53`
# Lowercase and sub space for '_'
sweet <- sweet %>% rename_with(~ gsub(" ", "_", .x) %>% tolower())
salty <- salty %>% rename_with(~ gsub(" ", "_", .x) %>% tolower())
silent <- silent %>% rename_with(~ gsub(" ", "_", .x) %>% tolower())

# Subset the meaningful columns by defining function
meaning_full <- function(data_set, sound_condition) {
  
  # Subset and select relevant columns for "keyboard" screen name
  data_some <- data_set %>%
    subset(screen_name == "keyboard") %>%
    select(
      participant_private_id,
      trial_number,
      reaction_time,
      response,
      correct,
      incorrect,
      answer,
      image_time
    ) %>%
    mutate(
      image_type = ifelse(answer == "f", "sweet", "salty"),
      response_type = ifelse(response == "f", "sweet", "salty"),
      display_time = ifelse(is.na(image_time), 0, image_time),
      image_type = as.factor(image_type),
      response_type = as.factor(response_type),
      display_time = as.numeric(display_time)
    )
  
  # Subset PAS data and rename columns as needed
  data_pas <- data_set %>%
    subset(screen_name == "PAS") %>%
    select(
      participant_private_id,
      trial_number,
      reaction_time,
      response,
      image_file,
      image_time) %>%
    rename(
      pas_reaction_time = reaction_time,
      pas_response = response) %>%
    mutate(
      pas_response = as.numeric(pas_response)
    )
  
  # Inner join the 'some' data and the 'pas' data
  combined_data <- left_join(data_some, data_pas, by = c("participant_private_id", "trial_number")) %>%
    mutate(sound_condition = sound_condition) %>%
    rename(id = participant_private_id)
  
  return(combined_data)
}

# Run function
sweet <- meaning_full(sweet, "sweet")
salty <- meaning_full(salty, "salty")
silent <- meaning_full(silent, "silent")

# Define soundcondition levels
soundcondition_levels <- c("silent", "sweet", "salty")

# Combine all the data
data_sss <- bind_rows(sweet, salty, silent)

# Add levels
data_sss$sound_condition <- factor(data_sss$sound_condition, levels = soundcondition_levels)

# Select specific columns from data_sss
data_sss <- data_sss %>%
  select(
    id,
    display_time,
    reaction_time,
    response_type,
    pas_response,
    pas_reaction_time,
    sound_condition,
    image_type
  )

Final dataframe

head(data_sss)

Pas responses by sound condition

library(ggplot2)
library(showtext)
## Loading required package: sysfonts
## Loading required package: showtextdb
library(ggthemes)

# Font setup
font_add_google("Source Sans Pro", "source")
showtext_auto()

# Use the font in the plots
theme_daniel <- theme_minimal(base_family = "source") +
  theme(
    text = element_text(size = 14),
    plot.title = element_text(size = 16, hjust = 0.5, face = "bold"),
    plot.background = element_rect(fill = "#F9F9F9", color = NA, size = 0), # Soft gray background
    panel.background = element_rect(fill = "#FFFFFF", color = NA, size = 0), # White panel
    panel.grid.major = element_line(color = "#E5E5E5", size = 0.2),
    panel.grid.minor = element_blank(),
    axis.line = element_line(color = "#D1D1D1"),
    axis.ticks = element_line(color = "#D1D1D1"),
    legend.position = "top",
    legend.title = element_blank(),
    legend.text = element_text(size = 12),
    plot.margin = margin(10, 10, 10, 10),
    panel.border = element_rect(color = "#E5E5E5", fill = NA, size = 0.5, linetype = "solid", inherit.blank = TRUE)
  )
## Warning: The `size` argument of `element_rect()` is deprecated as of ggplot2 3.4.0.
## ℹ Please use the `linewidth` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
## ℹ Please use the `linewidth` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
# Define the new colors for each condition
color_palette <- c("silent" = "#8A8D91", "sweet" = "#F4A582", "salty" = "#92C5DE")

# PAS Response by Sound Condition
ggplot(data_sss, aes(x = pas_response, fill = sound_condition)) +
  geom_histogram(binwidth = 1, position = "dodge", color = "#E5E5E5", size = 0.2) +
  scale_fill_manual(values = color_palette) +
  labs(title = "PAS Response Distribution by Sound Condition", x = "PAS Response", y = "Count") +
  theme_daniel 
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Reaction Time by Sound Condition

ggplot(data_sss, aes(x = sound_condition, y = reaction_time, fill = sound_condition)) +
  geom_boxplot(outlier.shape = NA, width = 0.6, color = "#D1D1D1") +
  scale_fill_manual(values = color_palette) +
  labs(title = "Reaction Time by Sound Condition", y = "Reaction Time (ms)", x = "Sound Condition") +
  theme_daniel +
  theme(
    panel.border = element_rect(color = "#D1D1D1", fill = NA, size = 0.5, linetype = "solid")
  ) +
  geom_jitter(width = 0.1, size = 1, alpha = 0.6, color = "#888888")

Hypothesis testing

Test whether sound_condition has a significant effect on pas_response and reaction_time.

# Linear model for reaction time
reaction_time_lm <- lm(reaction_time ~ sound_condition + response_type, data = data_sss)
summary(reaction_time_lm)
## 
## Call:
## lm(formula = reaction_time ~ sound_condition + response_type, 
##     data = data_sss)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
##  -1242   -715   -311    294  63306 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)           1172.77      22.04  53.199  < 2e-16 ***
## sound_conditionsweet    70.21      26.74   2.625  0.00867 ** 
## sound_conditionsalty   -36.00      26.74  -1.346  0.17826    
## response_typesweet     -42.54      21.86  -1.946  0.05166 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1362 on 15548 degrees of freedom
## Multiple R-squared:  0.001282,   Adjusted R-squared:  0.001089 
## F-statistic: 6.654 on 3 and 15548 DF,  p-value: 0.0001739

The model’s purpose is to examine the effect of sound_condition (with levels “silent”, “sweet”, and “salty”) and response_type (with levels “sweet” and “salty”) on reaction time.

The “sweet” sound condition significantly increases reaction time by around 70 ms compared to the “silent” condition, while the “salty” sound condition does not have a significant effect. The “sweet” response type might slightly decrease reaction time compared to the “salty” response type, but this effect is marginally significant. Yet sound_condition and response_type do not explain much variation in reaction time.

library(MASS)
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
# Ordinal regression for PAS response
pas_response_orm <- polr(as.factor(pas_response) ~ sound_condition + response_type, data = data_sss)
summary(pas_response_orm)
## 
## Re-fitting to get Hessian
## Call:
## polr(formula = as.factor(pas_response) ~ sound_condition + response_type, 
##     data = data_sss)
## 
## Coefficients:
##                         Value Std. Error t value
## sound_conditionsweet -0.01665    0.03595 -0.4632
## sound_conditionsalty  0.01793    0.03592  0.4992
## response_typesweet    0.06162    0.02938  2.0976
## 
## Intercepts:
##     Value    Std. Error t value 
## 1|2  -0.5831   0.0306   -19.0481
## 2|3   0.0368   0.0303     1.2171
## 3|4   0.5093   0.0306    16.6569
## 
## Residual Deviance: 39484.08 
## AIC: 39496.08

The model aims to predict pas_response, which is treated as an ordered categorical variable, based on sound_condition and response_type. The polr function fits a proportional odds model, assuming that the effects of sound_condition and response_type apply similarly across all levels of pas_response.

sound_condition (both “sweet” and “salty” compared to “silent”) does not significantly impact pas_response. response_type (“sweet” vs. “salty”) has a small but significant effect, with “sweet” responses slightly increasing the likelihood of a higher pas_response.The model suggests that response_type might be a weak predictor of pas_response, but sound_condition does not appear to meaningfully affect participants’ perceived awareness level (pas_response).

Congruency Testing

Test whether congruency between image_type and response_type (e.g., “sweet” sound with “sweet” image) significantly impacts pas_response or reaction_time.

# Create a congruency variable
data_sss <- data_sss %>%
  mutate(congruent = ifelse(image_type == response_type, "yes", "no"))

# Chi-square test for congruency
congruency_table <- table(data_sss$congruent, data_sss$sound_condition)
chisq.test(congruency_table)
## 
##  Pearson's Chi-squared test
## 
## data:  congruency_table
## X-squared = 3.6321, df = 2, p-value = 0.1627

This implies that the likelihood of congruent responses is not significantly affected by the sound condition (“silent,” “sweet,” or “salty”).

Bayesian Model

library(rstan)
## Loading required package: StanHeaders
## 
## rstan version 2.32.6 (Stan version 2.32.2)
## For execution on a local, multicore CPU with excess RAM we recommend calling
## options(mc.cores = parallel::detectCores()).
## To avoid recompilation of unchanged Stan programs, we recommend calling
## rstan_options(auto_write = TRUE)
## For within-chain threading using `reduce_sum()` or `map_rect()` Stan functions,
## change `threads_per_chain` option:
## rstan_options(threads_per_chain = 1)
## 
## Attaching package: 'rstan'
## The following object is masked from 'package:tidyr':
## 
##     extract
library(brms)
## Loading required package: Rcpp
## Loading 'brms' package (version 2.22.0). Useful instructions
## can be found by typing help('brms'). A more detailed introduction
## to the package is available through vignette('brms_overview').
## 
## Attaching package: 'brms'
## The following object is masked from 'package:rstan':
## 
##     loo
## The following object is masked from 'package:stats':
## 
##     ar
# Bayesian mixed model for reaction time
reaction_time_bayes <- brm(reaction_time ~ sound_condition * display_time + (1 | id),
                           data = data_sss, family = gaussian())
## Compiling Stan program...
## Trying to compile a simple C file
## Running /Library/Frameworks/R.framework/Resources/bin/R CMD SHLIB foo.c
## using C compiler: ‘Apple clang version 16.0.0 (clang-1600.0.26.4)’
## using SDK: ‘MacOSX15.1.sdk’
## clang -arch arm64 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG   -I"/Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library/Rcpp/include/"  -I"/Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library/RcppEigen/include/"  -I"/Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library/RcppEigen/include/unsupported"  -I"/Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library/BH/include" -I"/Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library/StanHeaders/include/src/"  -I"/Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library/StanHeaders/include/"  -I"/Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library/RcppParallel/include/"  -I"/Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library/rstan/include" -DEIGEN_NO_DEBUG  -DBOOST_DISABLE_ASSERTS  -DBOOST_PENDING_INTEGER_LOG2_HPP  -DSTAN_THREADS  -DUSE_STANC3 -DSTRICT_R_HEADERS  -DBOOST_PHOENIX_NO_VARIADIC_EXPRESSION  -D_HAS_AUTO_PTR_ETC=0  -include '/Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library/StanHeaders/include/stan/math/prim/fun/Eigen.hpp'  -D_REENTRANT -DRCPP_PARALLEL_USE_TBB=1   -I/opt/R/arm64/include    -fPIC  -falign-functions=64 -Wall -g -O2  -c foo.c -o foo.o
## In file included from <built-in>:1:
## In file included from /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library/StanHeaders/include/stan/math/prim/fun/Eigen.hpp:22:
## In file included from /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library/RcppEigen/include/Eigen/Dense:1:
## In file included from /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library/RcppEigen/include/Eigen/Core:19:
## /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library/RcppEigen/include/Eigen/src/Core/util/Macros.h:679:10: fatal error: 'cmath' file not found
##   679 | #include <cmath>
##       |          ^~~~~~~
## 1 error generated.
## make: *** [foo.o] Error 1
## Start sampling
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 1).
## Chain 1: 
## Chain 1: Gradient evaluation took 0.000617 seconds
## Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 6.17 seconds.
## Chain 1: Adjust your expectations accordingly!
## Chain 1: 
## Chain 1: 
## Chain 1: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 1: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 1: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 1: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 1: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 1: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 1: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 1: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 1: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 1: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 1: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 1: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 1: 
## Chain 1:  Elapsed Time: 16.808 seconds (Warm-up)
## Chain 1:                5.584 seconds (Sampling)
## Chain 1:                22.392 seconds (Total)
## Chain 1: 
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 2).
## Chain 2: 
## Chain 2: Gradient evaluation took 0.000286 seconds
## Chain 2: 1000 transitions using 10 leapfrog steps per transition would take 2.86 seconds.
## Chain 2: Adjust your expectations accordingly!
## Chain 2: 
## Chain 2: 
## Chain 2: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 2: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 2: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 2: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 2: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 2: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 2: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 2: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 2: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 2: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 2: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 2: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 2: 
## Chain 2:  Elapsed Time: 14.677 seconds (Warm-up)
## Chain 2:                5.674 seconds (Sampling)
## Chain 2:                20.351 seconds (Total)
## Chain 2: 
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 3).
## Chain 3: 
## Chain 3: Gradient evaluation took 0.000294 seconds
## Chain 3: 1000 transitions using 10 leapfrog steps per transition would take 2.94 seconds.
## Chain 3: Adjust your expectations accordingly!
## Chain 3: 
## Chain 3: 
## Chain 3: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 3: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 3: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 3: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 3: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 3: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 3: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 3: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 3: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 3: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 3: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 3: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 3: 
## Chain 3:  Elapsed Time: 13.764 seconds (Warm-up)
## Chain 3:                5.097 seconds (Sampling)
## Chain 3:                18.861 seconds (Total)
## Chain 3: 
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 4).
## Chain 4: 
## Chain 4: Gradient evaluation took 0.000299 seconds
## Chain 4: 1000 transitions using 10 leapfrog steps per transition would take 2.99 seconds.
## Chain 4: Adjust your expectations accordingly!
## Chain 4: 
## Chain 4: 
## Chain 4: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 4: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 4: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 4: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 4: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 4: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 4: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 4: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 4: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 4: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 4: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 4: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 4: 
## Chain 4:  Elapsed Time: 15.352 seconds (Warm-up)
## Chain 4:                5.341 seconds (Sampling)
## Chain 4:                20.693 seconds (Total)
## Chain 4:
## Warning: Bulk Effective Samples Size (ESS) is too low, indicating posterior means and medians may be unreliable.
## Running the chains for more iterations may help. See
## https://mc-stan.org/misc/warnings.html#bulk-ess
summary(reaction_time_bayes)
##  Family: gaussian 
##   Links: mu = identity; sigma = identity 
## Formula: reaction_time ~ sound_condition * display_time + (1 | id) 
##    Data: data_sss (Number of observations: 15552) 
##   Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
##          total post-warmup draws = 4000
## 
## Multilevel Hyperparameters:
## ~id (Number of levels: 54) 
##               Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## sd(Intercept)   412.58     42.12   341.11   506.50 1.01      419      663
## 
## Regression Coefficients:
##                                   Estimate Est.Error l-95% CI u-95% CI Rhat
## Intercept                          1124.18     61.80  1000.53  1241.16 1.03
## sound_conditionsweet                169.04     37.70    94.16   242.91 1.00
## sound_conditionsalty                -14.91     38.05   -89.98    59.47 1.00
## display_time                          1.17      0.98    -0.71     3.11 1.00
## sound_conditionsweet:display_time    -5.10      1.41    -7.88    -2.37 1.00
## sound_conditionsalty:display_time    -1.09      1.44    -3.84     1.73 1.00
##                                   Bulk_ESS Tail_ESS
## Intercept                              227      525
## sound_conditionsweet                  1259     1946
## sound_conditionsalty                  1255     1894
## display_time                          1014     1763
## sound_conditionsweet:display_time     1059     1667
## sound_conditionsalty:display_time     1075     1774
## 
## Further Distributional Parameters:
##       Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## sigma  1300.86      7.44  1286.43  1315.34 1.00     5621     3114
## 
## Draws were sampled using sampling(NUTS). For each parameter, Bulk_ESS
## and Tail_ESS are effective sample size measures, and Rhat is the potential
## scale reduction factor on split chains (at convergence, Rhat = 1).

The Bayesian model run using the brms package tested the effect of sound_condition and display_time on reaction_time, accounting for random intercepts by id to capture participant-level variability. The main findings indicate that the “sweet” sound condition significantly increases reaction time by about 166.45 ms compared to “silent,” while “salty” has no significant effect. Display time has a minimal effect on reaction time alone, but there is a significant interaction between “sweet” and display time, where reaction time decreases as display time increases. The warning about low Effective Sample Size (ESS) suggests that some posterior estimates, especially for the means and medians, might be unreliable; running more iterations could improve estimate stability. Overall, the model indicates that the “sweet” condition influences reaction time, particularly in combination with longer display times.

Interaction between sound condition and display time

Since participants vary in sensitivity, a mixed model could account for both fixed effects (e.g., sound_condition, display_time) and random effects (e.g., individual participant variability).

library(lme4)
## Loading required package: Matrix
## 
## Attaching package: 'Matrix'
## The following objects are masked from 'package:tidyr':
## 
##     expand, pack, unpack
## 
## Attaching package: 'lme4'
## The following object is masked from 'package:brms':
## 
##     ngrps
# Mixed model for reaction time with random intercept for participants
reaction_time_mixed <- lmer(reaction_time ~ sound_condition * display_time + (1 | id), data = data_sss)

summary(reaction_time_mixed)
## Linear mixed model fit by REML ['lmerMod']
## Formula: reaction_time ~ sound_condition * display_time + (1 | id)
##    Data: data_sss
## 
## REML criterion at convergence: 267319.4
## 
## Scaled residuals: 
##    Min     1Q Median     3Q    Max 
## -1.643 -0.456 -0.188  0.207 48.593 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  id       (Intercept)  163501   404.4  
##  Residual             1692348  1300.9  
## Number of obs: 15552, groups:  id, 54
## 
## Fixed effects:
##                                   Estimate Std. Error t value
## (Intercept)                       1127.532     61.112  18.450
## sound_conditionsweet               168.733     37.568   4.491
## sound_conditionsalty               -14.129     37.571  -0.376
## display_time                         1.189      1.000   1.189
## sound_conditionsweet:display_time   -5.084      1.414  -3.595
## sound_conditionsalty:display_time   -1.120      1.419  -0.789
## 
## Correlation of Fixed Effects:
##               (Intr) snd_cndtnsw snd_cndtnsl dsply_ snd_cndtnsw:_
## snd_cndtnsw   -0.308                                             
## snd_cndtnsl   -0.308  0.501                                      
## display_tim   -0.319  0.519       0.519                          
## snd_cndtnsw:_  0.226 -0.733      -0.367      -0.707              
## snd_cndtnsl:_  0.225 -0.366      -0.733      -0.705  0.499

The model suggests that the “sweet” sound condition significantly increases reaction time compared to “silent.” However, as display time increases, this effect of “sweet” is moderated by a significant interaction, resulting in a decrease in reaction time with longer display times. The “salty” sound condition has no significant effect on reaction time, either alone or in interaction with display time. The model explains some of the participant-level variability, but a large amount of residual variance remains, indicating that factors beyond sound_condition and display_time contribute to variations in reaction time.