Tracking Visual Statistical Learning with Steady-State Visual Evoked Potentials: Effects of Exemplar and Category Information.
The 3 matches
- [1] § METHOD › Data Processing ↔ EEG_data/MATLAB_scripts/JB_Analysis_ITC_SNR_PSD.m, lines 185–252 · score 0.77 · power spectral density, Fourier Transformation, EEG epoch, FFT, electrodes, MATLAB
- [2] § RESULTS › Post-Test Trials › RT. ↔ data_analysis/R_scripts/JungleBunch_Analysis_Stats_ACC_RT.R, lines 105–143 · score 0.54 · pairwise comparisons, Holm corrected, Image Position, RT, ANOVA, SD
- [3] § METHOD › Data Processing ↔ EEG_data/MATLAB_scripts/JB_Analysis_ITC_SNR_PSD.m, lines 185–252 · score 0.53 · Fourier transform, EEG epoch, phase, ITC, SNR
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
MATLAB · 268 lines · 11 KB · no license · 2 matches
- function [dataOut, dataOutStats, ITC_ga, SNR_ga, PSD_ga] = JB_Analysis_ITC_SNR_PSD(eegEpochDur, ...
- nFqBinNeighbours, nFqBinSkip, eegClusterName)
- % Function to calculate InterTrialCoherence (ITC), SignalToNoiseRatio
- % (SNR), and power spectral density (PSD) per participant, and across all
- % participants for each condition (grand average)
- %
- % Natasa Ganea - Mar 2024 - [email hidden]
- % Dominik Garber - Mar 2023 - [email hidden]
- %
- % Copyright © 2024 Natasa Ganea & Dominik Garber. All Rights Reserved.
- %
- % NG -- 2025-06-20 -- renamed fnc; old name: JB_Analysis_InterTrialCoherence
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % defaults
- if nargin < 1 || isempty(eegEpochDur)
- eegEpochDur = 27; % 27s epoch duration
- % eegEpochDur = 9;
- end
- if nargin < 2 || isempty(nFqBinNeighbours)
- nFqBinNeighbours = 11; % eeg epoch length is set to 27 because the trial was 0.9s FadeIn + 27s Exp + 0.9s FadeOut
- % nFqBinNeighbours = 4;
- end
- if nargin < 3 || isempty(nFqBinSkip)
- nFqBinSkip = 1; % number of freq bins adjacent Target Freq to use when calculating SNR
- end
- if nargin < 4 || isempty(eegClusterName)
- eegClusterName = 'Occ';
- end
- % EEG recording info
- eegSampleRate = 500; % 500 Hz EGI sampling rate
- condNum = 3; % number of experimental conditions
- maxFreq = eegEpochDur*10; % maximum number of freq to display in grand average plots (2 freq bins per freq)
- % frequency bins for ODDBALL Fq & BASE Fq
- if eegEpochDur == 27
- b = 30; % EEG epoch = 27s; fq bin size = 1s/27s = 0.037 Hz
- elseif eegEpochDur == 9
- b = 10; % EEG epoch = 9s; fq bin size = 1s/9s = 0.111 Hz
- end
- binNrFq1 = b + 1; % fq1 = 1.111; oddballFq
- binNrFq2 = 3*b + 1; % fq2 = 3.333; baseFq
- % data files
- p = fullfile(pwd, '4_roi'); % path directory
- DD = dir(p); % read directory
- fileNum = 0; % count files in the directory that meet the criterion
- fileName = strings(length(DD),1); % store the name of the files that meet the criterion
- for i = 1:length(DD)
- if ~strcmp(DD(i).name(1),'.') && strcmp(DD(i).name(end-2:end), 'mat')
- fileNum = fileNum + 1;
- fileName(fileNum,1) = DD(i).name;
- end
- end
- fileName = fileName(1:fileNum); % keep only the cells that have values in them
- % initialize variables
- ps = fileNum/condNum; % number of participants; 3 groups; 17 participants per gr
- if mod(ps,1) ~= 0
- ps = 17; % for the H1 vs H2 analysis, I had to exclude N0 JB_40 and this resulted in 16 participants for the N0 gr
- end
- ITC_ps = nan(ps,eegSampleRate/2*eegEpochDur+1); % store ITC per participant
- SNR_ps = nan(ps,eegSampleRate/2*eegEpochDur+1); % store SNR per participant
- PSD_ps = nan(ps,eegSampleRate/2*eegEpochDur+1); % store PSD (power spectral density) per participant
- fileName_ps = strings(ps,1); % store participant filename
- ITC_ga = nan(condNum,eegSampleRate/2*eegEpochDur+1); % ITC grand average per experimental condition
- SNR_ga = nan(condNum,eegSampleRate/2*eegEpochDur+1); % SNR grand average per experimental condition
- PSD_ga = nan(condNum,eegSampleRate/2*eegEpochDur+1); % PSD grand average per experimental condition
- dataOut = struct('condName', strings(condNum,1), 'filename', strings(ps,1),...
- 'ITC_ps', zeros(ps,eegSampleRate/2*eegEpochDur+1), 'SNR_ps', zeros(ps,eegSampleRate/2*eegEpochDur+1),...
- 'PSD_ps', zeros(ps,eegSampleRate/2*eegEpochDur+1));
- % for each experimental condition
- for cond = 1:condNum
- switch cond
- case 1
- condName = 'A1'; % grA1
- case 2
- condName = 'A2'; % grA2
- case 3
- condName = 'N0'; % grA1
- end
- % reset the file count at the beginning of each experimental condition
- ss = 0;
- % for each participant
- for s = 1:length(fileName)
- % if filename contains name of experimental condition, analyze it
- if contains(fileName(s),condName) == 1
- ss = ss + 1; % count filesound
- fileName_ps(ss,1) = fileName(s); % store filename
- % load data
- file = fullfile(pwd, '4_roi', fileName(s)); % full path to file
- load(file,'data'); % load data
- % calculate ITC, SNR, PSD for that dataset
- eegEpochs = size(data,1); % varying number of epoch across participants
- eegCh = size(data,2); % Occ cluster is the last electrode
- if ~contains(eegClusterName,'Occ')
- eegCh = eegCh-1; % Fro cluster is the penultimate eletrode
- end
- [ITC, PSD_db, freq, SNR] = coherence_power(data, eegSampleRate, eegSampleRate*eegEpochDur, eegEpochs,...
- eegCh, nFqBinNeighbours, nFqBinSkip);
- % % plot ITC, SNR, PSD per participant
- % figure(1); plot(freq(1:maxFreq), ITC(1:maxFreq));
- % figure(2); plot(freq(1:maxFreq), SNR(1:maxFreq));
- % figure(3); plot(freq(1:maxFreq), PSD_db(1:maxFreq));
- % store individual ITC, SNR, PSD in a master variable
- ITC_ps(ss,:) = ITC; % one row = one participant; one column = one freq bin (= 0.5 Hz, up to 250 Hz)
- SNR_ps(ss,:) = SNR;
- PSD_ps(ss,:) = PSD_db;
- end
- end
- % for each condition, calculate the grand average
- ITC_ga(cond,:) = mean(ITC_ps,1,'omitnan'); % average across participants (rows); one column = one freq bin
- SNR_ga(cond,:) = mean(SNR_ps,1,'omitnan');
- PSD_ga(cond,:) = mean(PSD_ps,1,'omitnan');
- % store data per condition in a structure
- dataOut(cond).condName = condName;
- dataOut(cond).filename = fileName_ps;
- dataOut(cond).ITC_ps = ITC_ps;
- dataOut(cond).SNR_ps = SNR_ps;
- dataOut(cond).PSD_ps = PSD_ps;
- % reset these variables at the end of each cond
- fileName_ps = strings(ps,1); % store participant filename
- ITC_ps = nan(ps,eegSampleRate/2*eegEpochDur+1); % store ITC per participant
- SNR_ps = nan(ps,eegSampleRate/2*eegEpochDur+1); % store SNR per participant
- PSD_ps = nan(ps,eegSampleRate/2*eegEpochDur+1); % store PSD (power spectral density) per participant
- end
- dataOutStats = struct(...
- 'eegClusterName', eegClusterName,... % cluster
- 'filename', fileName,... % filename
- 'ITC_ps', [dataOut(1).ITC_ps(:,binNrFq1), dataOut(1).ITC_ps(:,binNrFq2); ... % grA1 Inter Trial Coherence 1.11 Hz & 3.33 Hz
- dataOut(2).ITC_ps(:,binNrFq1), dataOut(2).ITC_ps(:,binNrFq2); ... % grA2
- dataOut(3).ITC_ps(:,binNrFq1), dataOut(3).ITC_ps(:,binNrFq2)],... % grN0
- 'SNR_ps', [dataOut(1).SNR_ps(:,binNrFq1), dataOut(1).SNR_ps(:,binNrFq2); ... % grA1 Signal Noise Ratio 1.11 Hz & 3.33 Hz
- dataOut(2).SNR_ps(:,binNrFq1), dataOut(2).SNR_ps(:,binNrFq2); ... % grA2
- dataOut(3).SNR_ps(:,binNrFq1), dataOut(3).SNR_ps(:,binNrFq2)],... % grN0
- 'PSD_ps', [dataOut(1).PSD_ps(:,binNrFq1), dataOut(1).PSD_ps(:,binNrFq2);... % grA1 Power Spectrum Density 1.11 Hz & 3.33 Hz
- dataOut(2).PSD_ps(:,binNrFq1), dataOut(2).PSD_ps(:,binNrFq2);... % grA2
- dataOut(3).PSD_ps(:,binNrFq1), dataOut(3).PSD_ps(:,binNrFq2)]); % grN0
- %% Fig 1 & 2
- % Display values for 6Hz flicker freq test block
- % ITC
- figure(1);
- plot(freq(1:maxFreq+1), ITC_ga(1,1:maxFreq+1), 'b'); % grA1
- ylim([0 1]); % ITC value can be betweem 0 and 1
- hold on;
- plot(freq(1:maxFreq+1), ITC_ga(2,1:maxFreq+1), 'r'); % grA2
- hold on;
- plot(freq(1:maxFreq+1), ITC_ga(3,1:maxFreq+1), 'g'); % grN0
- hold off;
- % SNR
- figure(2);
- plot(freq(1:maxFreq+1), SNR_ga(1,1:maxFreq+1), 'b'); % grA1
- ylim([0 25]); %[0 inf]
- hold on;
- plot(freq(1:maxFreq+1), SNR_ga(2,1:maxFreq+1), 'r'); % grA2
- hold on;
- plot(freq(1:maxFreq+1), SNR_ga(3,1:maxFreq+1), 'g'); % grN0
- hold off;
- end
- function [ITC, PSD_db, freq, SNR] = coherence_power(data, fs, numsmp, numTrials, ch, n_neighbors, n_skip) %takes in a datamatrix nTrials x nTimepoints
- if nargin < 2 || isempty(fs)
- fs = 256; %sample rate
- end
- if nargin < 3 || isempty(numsmp)
- numsmp = 1796; %number of samples (should be the same as the second dimension of data)
- end
- if nargin < 4 || isempty(numTrials)
- numTrials = 17; % number of trials (should be the same as the first dimension of data)
- end
- if nargin < 5 || isempty(ch)
- ch = []; % select specific electrode?
- end
- if nargin < 6 || isempty(n_neighbors)
- n_neighbors = 11; % number of adjacent fq bin used for SNR
- end
- if nargin < 7 || isempty(n_skip)
- n_skip = 1; % number of adjacent fq bin to skip when calculating the SNR
- end
- freq = 0:fs/numsmp:fs/2; %create an array of frequencies spanning 0 to the nyquist freq
- % pre-initialize
- itc_t = zeros(numTrials,numsmp/2);
- if ~isempty(ch)
- data = data(:,ch,:,:,:,:);
- end
- for j = 1:numTrials
- data_trial = data(j,:);
- % computes the discrete Fourier transform
- fft_t = fft(data_trial);
- % keep frequencies that are lower than the Nyquist frequency
- fft_t = fft_t(1:numsmp/2+1);
- % calculate phase for each EEG epoch
- itc_t(j,1:length(fft_t)) = fft_t ./ abs(fft_t);
- end
- % calculate ITC across the trials (using method 3 from Benjamin et al., 2021: Inter Trial Coherence)
- ITC = abs(mean(itc_t, 1, 'omitnan'));
- % now calculate power (using method 2 from Benjamin et al., 2021: FFT of the average of all trials)
- mean_tc = mean(data(1:numTrials,:), 1, 'omitnan'); % average the timecourse across trials
- fft_t = fft(mean_tc); % FFT of the average
- fft_t = fft_t(1:numsmp/2+1);
- psd = abs(fft_t).^2 .* ((1/numsmp)*(1/fs)); % get the PSD (note: may want to multiple this by 2: https://www.mathworks.com/help/signal/ug/power-spectral-density-estimates-using-fft.html)
- % psd(2:end-1) = 2*psd(2:end-1); % In order to conserve the total power, multiply all frequencies that occur in both sets — the positive and negative frequencies — by a factor of 2. Zero frequency (DC) and the Nyquist frequency do not occur twice
- % calculate SNR, then convert to dB
- SNR = snr(psd, n_neighbors, n_skip); % 2 adjacent neighboring frequencies, skip the first neighbor; here it's 0 because DG adds 1 in his SNR fnc calculation
- SNR = 10.*log10(SNR);
- % convert power to dB
- PSD_db = 10*log10(psd);
- end
- function [SNR] = snr(spectrum, n_neighbors, n_skip) % signal to noise ratio for a frequency spectrum
- % Creaded by Dominik Garber - e: [email hidden] - 2023-04-03
- padded_spectrum = [nan(1, n_neighbors) spectrum nan(1, n_neighbors)];
- SNR = nan(1, length(spectrum));
- for freq = (n_neighbors+1):(length(spectrum)+n_neighbors)
- neighbors = [padded_spectrum((freq-n_neighbors):(freq-1-n_skip)) padded_spectrum((freq+1+n_skip):(freq+n_neighbors))];
- noise = mean(neighbors,2,'omitnan');
- SNR(freq-n_neighbors) = spectrum(freq-n_neighbors)./noise;
- end
- end
JB_Analysis_ITC_SNR_PSD.m, no license · at the source
Overview
- Child Study Center, Yale School of Medicine, New Haven, CT, USA
- Central European University, Vienna, Austria
- Department of Psychology, Yale University, New Haven, CT, USA
- Wu Tsai Institute, Yale University, New Haven, CT, USA
Abstract
This study examined visual statistical learning using EEG-based steady-state visual evoked potentials (SSVEP). Fifty-one adults were exposed to image sequences organized into triplets across three conditions (n = 17 per condition) in which the alignment of category-level and exemplar-level information was manipulated. Neural entrainment at the triplet frequency (1.11 Hz) differed significantly across conditions (ηp2 = .13), with stronger responses in the Single-Category and No-Category conditions than in the Mixed-Category condition. There were no differences at the image frequency (3.33 Hz; ηp2 = .05). Behavioral reaction times mirrored this pattern, showing faster responses to the last exemplar in the triplet in the Single-Category (ηp2 = .71) and No-Category (ηp2 = .22) conditions, but not in the Mixed-Category (ηp2 = .10) condition. Both signal-to-noise ratio (SNR) and inter-trial coherence (ITC) captured neural entrainment across fronto-central and parietal-occipital electrode clusters. These findings validate SSVEP as an online measure of visual statistical learning and demonstrate that category-exemplar mismatch interfered with statistical learning.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repository
Its files are read in the Code ↔ Paper reader above, with 3 matches between paragraphs and lines of code.
OSF mhr6y
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
- 27 September 2026: the link answers (HTTP 200)
8 files
- EEG_data/
MATLAB_scripts/ , MATLAB, 268 lines, 2 matchesJB_Analysis_ITC_SNR_PSD. m - EEG_data/
MATLAB_scripts/ , MATLAB, 322 linesJB_Analysis_PerParticipa nt_HAPPE_processed.m - EEG_data/
MATLAB_scripts/ , MATLAB, 99 linesJB_Analysis_PlotFqPeaks. m - data_analysis/
R_scripts/ , R, 156 linesJungleBunch_Analysis_Plo t_FqPeaks.R - data_analysis/
R_scripts/ , R, 324 lines, 1 matchJungleBunch_Analysis_Sta ts_ACC_RT.R - data_analysis/
R_scripts/ , R, 636 linesJungleBunch_Analysis_Sta ts_ITC.R - data_analysis/
R_scripts/ , R, 186 linesJungleBunch_Analysis_Sta ts_LT_PS.R - data_analysis/
R_scripts/ , R, 1,244 linesJungleBunch_Analysis_Sta ts_SNR.R
The paper's code and data availability statement is in the Data section.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 8 scripts, each with its path and the digest of its content;
- 3 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
No dataset and no data link were found in the paper.
Availability of Data and Materials
This experiment was not pre-registered. Stimuli, data, and custom R and MATLAB scripts are available on the Open Science Framework: https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Pre-Registration and Data Availability
This experiment was not pre-registered. Stimuli, data, and custom R and MATLAB scripts are available on OSF: https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 1, 27 September 2026: the first record
Recorded: type, language, journal, volume, pages, dates, 4 authors, 4 keywords, 47 references.
Cite
This paper
Ganea, N., Garber, D., Aslin, R. N., & Lewkowicz, D. J. (2026). Tracking Visual Statistical Learning with Steady-State Visual Evoked Potentials: Effects of Exemplar and Category Information. Open mind : discoveries in cognitive science, 10, 808-826. https://
BibTeX
@article{ganea2026tracki
author = {Ganea, Natasa and Garber, Dominik and Aslin, Richard N and Lewkowicz, David J},
title = {{Tracking Visual Statistical Learning with Steady-State Visual Evoked Potentials: Effects of Exemplar and Category Information}},
journal = {Open mind : discoveries in cognitive science},
year = {2026},
month = jun,
volume = {10},
pages = {808--826},
publisher = {MIT Press},
issn = {2470-2986},
doi = {10.1162/
url = {https://
pmid = {42396548},
pmcid = {PMC13327787}
}
RIS
TY - JOUR
AU - Ganea, Natasa
AU - Garber, Dominik
AU - Aslin, Richard N
AU - Lewkowicz, David J
TI - Tracking Visual Statistical Learning with Steady-State Visual Evoked Potentials: Effects of Exemplar and Category Information
T2 - Open mind : discoveries in cognitive science
J2 - Open Mind (Camb)
PY - 2026
DA - 2026/
VL - 10
SP - 808
EP - 826
SN - 2470-2986
PB - MIT Press
DO - 10.1162/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1162/
"type": "article-journal",
"title": "Tracking Visual Statistical Learning with Steady-State Visual Evoked Potentials: Effects of Exemplar and Category Information",
"container-title": "Open mind : discoveries in cognitive science",
"author": [
{
"family": "Ganea",
"given": "Natasa"
},
{
"family": "Garber",
"given": "Dominik"
},
{
"family": "Aslin",
"given": "Richard N"
},
{
"family": "Lewkowicz",
"given": "David J"
}
],
"container-title-short":
"volume": "10",
"page": "808-826",
"DOI": "10.1162/
"PMID": "42396548",
"PMCID": "PMC13327787",
"ISSN": "2470-2986",
"publisher": "MIT Press",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
6,
17
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1162/imag.a.1161
- The infant brain rapidly entrains to visual statistical regularities during stimulus exposure.Journal: Imaging neuroscience (Cambridge, Mass.)In common: EEG, 14 references
- [2] doi:10.1002/aur.70312 [code]
- Aberrant Neural Entrainment to Word-Level Speech Patterns in Fragile X Syndrome: Evidence for a Statistical Learning Deficit.Journal: Autism research : official journal of the International Society for Autism ResearchIn common: EEG, cognitive, 11 references
- [3] doi:10.1073/pnas.2608511123 [code]
- Facial palsy reveals the sensorimotor contribution to facial-emotion recognition.Journal: Proceedings of the National Academy of Sciences of the United States of AmericaIn common: BayesFactor, afex, brms, 4 other tools, EEG
- [4] doi:10.1038/s44271-026-00431-w [code]
- Alpha power increases spontaneously during a neurofeedback session.Journal: Communications psychologyIn common: BayesFactor, afex, brms, 3 other tools, EEG, cognitive, 1 reference
- [5] doi:10.1038/s41597-026-07350-9 [code]
- An open multi-center MEG-EEG dataset for studying conscious visual perception.Journal: Scientific dataIn common: BayesFactor, afex, easystats, 4 other tools, EEG
- [6] doi:10.1093/nc/niag029 [code]
- A data-driven approach to identifying and evaluating connectivity-based neural correlates of conscious visual perception.Journal: Neuroscience of consciousnessIn common: BayesFactor, afex, easystats, 4 other tools, cognitive
- [7] doi:10.1038/s41467-026-73865-9 [code]
- Histamine shapes the neurocomputational dynamics of human learning.Journal: Nature communicationsIn common: BayesFactor, brms, easystats, 4 other tools, cognitive
- [8] doi:10.1016/j.isci.2026.116458 [code]
- Neural tracking of prosodic and statistical rhythms jointly supports artificial language learning.Journal: iScienceIn common: emmeans, ggplot2, tidyverse, cognitive, 5 references
- [9] doi:10.1162/imag.a.1258 [code]
- Non-specific increase in alpha power during a neurofeedback session targeting its downregulation.Journal: Imaging neuroscience (Cambridge, Mass.)In common: BayesFactor, afex, brms, 3 other tools, EEG, 1 reference
- [10] doi:10.1038/s41597-026-07377-y [code]
- An open-access multi-site fMRI dataset for investigating conscious visual perception.Journal: Scientific dataIn common: BayesFactor, afex, easystats, 4 other tools
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 1 repository of the authors' code, each at its verified commit and with its license, 8 scripts, and 3 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:5587a1eea4a6053d…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[.
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
