Evoked vs Induced
Every trial contains the same burst; jitter its phase and watch it leave the ERP while the time-frequency map barely moves — with the law that governs it drawn through the measured curve.
2 claims on this page are unverified. TODO(confirm) marks a specific statement the author has not yet checked against a
primary source. Everything else on this page has been reviewed. Treat a marked claim as
provisional and go to the cited source rather than quoting the sentence.
Modes: default — the widget below runs in default. Use Share state to put the exact view in the URL.
What it does
A burst is placed on every trial at the same latency and the same amplitude. The learner jitters its phase across trials and watches three things happen at once: the trial-averaged waveform shrinks, the evoked-power map fades with it, and the total-power map does not move. A fourth panel sweeps the jitter and draws the closed-form attenuation law through the measured points, with the half-amplitude line marked.
Everything is computed in the browser — the trials, the average, the Morlet transform and the sweep — so every slider is live and a shared state reproduces the same view. There is no recording behind it: the signal is synthesised from the parameters in fixtures.json, and the widget says so.
The convention that has to be named
fixtures.json defines phase_jitter_deg as the full width of a uniform draw, φ ~ U(−W/2, +W/2). Under that reading the trial average is the zero-jitter burst scaled by sin(W/2)/(W/2), and it halves at 217.2°. The other convention in common use reads the same slider as a circular standard deviation and draws from a von Mises, giving exp(−s²/2) and a halving point of 67.5° — a factor of about three away.
The widget does not choose. Jitter is read as is a named control, it defaults to the data file’s convention, and the halving jitter under both readings is printed side by side with a warning when the non-fixture reading is selected. No number here appears without the convention it belongs to, and L4.1’s exercise names it in the prompt for the same reason.
Controls
| Control | What it sets |
|---|---|
| Jitter is read as | uniform over a full width (the data file’s convention, the default) or von Mises, jitter = circular SD — changes the law, the predicted curve and the halving jitter |
| Phase jitter | 0–360°, in steps of 5. Under the uniform reading, 360° is a whole-circle draw and the expected average is exactly zero |
| Latency jitter | 0–400 ms, same convention. The read-out converts it to the phase rotation it implies at the burst frequency |
| Trials (N) | 2–200 |
| Redraw trials · No jitter · Halving jitter | Seeded redraw; both jitter sliders to zero; the phase jitter to the halving point of the current reading |
| Burst amplitude · Background | 0–40 µV each. Set the background to 0 to see the law without a noise floor |
| Analysis wavelet (cycles) | 2–20, for the single-frequency measurement; the maps use the file’s own per-frequency cycle schedule |
| Measure | template (projection onto the zero-jitter burst — unbiased, and signed), peakAbs (largest absolute value in the window — biased upward by noise) or morlet (peak of the Morlet magnitude at the burst frequency) |
| Measurement window · Pre-stimulus window | Both default to ±2σ of the burst envelope, and the same width before the stimulus |
| Sweep step · Sweep repeats | 5–30° per point, 1–10 independent repeats per point |
| Display | Single trials, the closed-form prediction, the induced map |
What to look for
- At zero jitter, the evoked and total maps are the same picture. Nothing in the analysis has distinguished them, because there is nothing to distinguish. That is the control condition for everything that follows.
- Drag the phase jitter and watch the two maps separate. Every trial still contains a burst, so total power barely moves; the ERP shrinks and the evoked map fades with it. The activity did not go away — the average stopped being able to see it.
- The measured curve follows the law drawn through it. Under the default reading it is
sin(W/2)/(W/2), halving at 217.2°; switch the reading and both the law and the halving point change. Each swept point is the mean of several independent experiments, because a single draw scatters around the law. - Watch where the curve stops falling. It flattens onto the noise floor the widget measured in the pre-stimulus window, not onto zero. An ERP that has “vanished” has sunk into the noise of the average, and more trials would sink it further. Set the background to zero and the floor goes with it.
- Compare the three estimators at the same jitter.
peakAbsreads high — a maximum of a noisy waveform exceeds the maximum of the signal inside it (pf-peak-amplitude-noise-bias) — whiletemplateis unbiased and can go negative once the signal is gone. The half point moves by about ten degrees between them, which is why L4.1’s tolerance is what it is. - Turn phase jitter to zero and raise latency jitter instead. The ERP falls again, and the read-out says why: a shift of τ rotates a burst at frequency f by 2πfτ, so 10 ms is already 36° at 10 Hz and 72° at 20 Hz. Latency and phase are not independent knobs.
Used in
- L4.1 Why time-frequency (
default)
Data provenance
Synthetic. /data/widgets/w-evoked-vs-induced/fixtures.json, written by data/scripts/make_phase_fixtures.py, carries parameters only: sfreq 250 Hz, epoch −1.0 … 1.5 s, a 20 µV burst at 10 Hz with 7 cycles (σ = 0.111408 s) centred at 0.3 s, a 1/f^1.343 background at 19.8 µV standard deviation, seed 20260918, and the generative model written out as formulas so a browser implementation and the script agree. It carries synthetic: true, derived_from: "none (generated)" and a full modifications list per §4.5, and no dataset name is attached to it.
The background is not invented. Its exponent and amplitude are medians read at build time from a shipped asset — widgets/w-aperiodic-explorer/psds.json, 12 ds-eegbci subjects at O1, eyes-open, specparam 2.0.0rc4 — with per-subject ranges of 0.677–1.76 for the exponent and 13.6–41.2 µV for the amplitude. Only those two summary statistics of a real spectrum are used; the script stops rather than guess if the asset is missing.
Because the browser uses its own seeded generator, the widget reproduces the distributions the file records, not the script’s individual realisations. That is why the file records spreads beside every measured value, and why the lesson’s answer key is set against the distribution rather than against one draw.
One documented difference: the file reports n_times: 626 for the epoch, counting both endpoints (MNE’s Epochs rule); the widget lays out 625, which is what a half-open arange gives. Both are self-consistent, nothing quotes the count, and the file states both rules rather than one being silently changed to match the other.
Open the code
site/src/components/widgets/w-evoked-vs-induced/ — Widget.svelte, meta.ts, index.ts, circular.ts (both jitter laws and their inverses), morlet.ts, simulate.ts, compute.ts, data.ts, synthetic.ts, state.ts, colormap.ts, plots.ts, and 96 tests. Repository link: TODO(confirm) (GitHub org/repo, §13 item 3).
TODO(confirm): screenshot.png is not yet a real capture of the running widget, so the <noscript> fallback shows a note rather than a picture.