View source: R/pipeline-glassbox.R
| glassbox | R Documentation |
eyeris pipelineThis glassbox function (in contrast to a "black box" function where you run
it and get a result but have no (or little) idea as to how you got from input
to output) has a few primary benefits over calling each exported function
from eyeris separately.
glassbox(
file,
interactive_preview = FALSE,
preview_n = 3,
preview_duration = 5,
preview_window = NULL,
verbose = TRUE,
...,
confirm = deprecated(),
num_previews = deprecated(),
detrend_data = deprecated(),
skip_detransient = deprecated()
)
file |
Either an SR Research EyeLink |
interactive_preview |
A flag to indicate whether to run the |
preview_n |
Number of random example "epochs" to generate for previewing the effect of each preprocessing step on the pupil time series |
preview_duration |
Time in seconds of each randomly selected preview |
preview_window |
The start and stop raw timestamps used to subset the
preprocessed data from each step of the |
verbose |
A logical flag to indicate whether to print status messages to
the console. Defaults to |
... |
Additional arguments to override the default, prescribed settings |
confirm |
(Deprecated) Use |
num_previews |
(Deprecated) Use |
detrend_data |
(Deprecated) A flag to indicate whether to run the
|
skip_detransient |
(Deprecated) A flag to indicate whether to skip
the |
First, this glassbox function provides a highly opinionated prescription of
steps and starting parameters we believe any pupillometry researcher should
use as their defaults when preprocessing pupillometry data.
Second, and not mutually exclusive from the first point, using this function should ideally reduce the probability of accidental mishaps when "reimplementing" the steps from the preprocessing pipeline both within and across projects. We hope to streamline the process in such a way that you could collect a pupillometry dataset and within a few minutes assess the quality of those data while simultaneously running a full preprocessing pipeline in 1-ish line of code!
Third, glassbox provides an "interactive" framework where you can evaluate
the consequences of the parameters within each step on your data in real
time, facilitating a fairly easy-to-use workflow for parameter optimization
on your particular dataset. This process essentially takes each of the
opinionated steps and provides a pre-/post-plot of the time series data for
each step so you can adjust parameters and re-run the pipeline until you are
satisfied with the choices of your parameters and their consequences on your
pupil time series data.
Preprocessed pupil data contained within an object of class eyeris
glassbox() does, step by stepIn plain language, glassbox() runs the following eyeris steps in order on
your pupil time series. Steps marked (default: on) run automatically;
steps marked (default: off) are skipped unless you explicitly enable
them. Most preprocessing steps can be turned off by passing <step> = FALSE
(except load_asc, which always runs when file is an .asc path). Steps
that accept parameters can be
customized by passing <step> = list(...) with values you want to override
(for example, deblink = list(extend = 40)).
Load the data (load_asc, default: on) – Reads and parses the
EyeLink .asc file into an eyeris object, automatically splitting the
recording into blocks and, for binocular recordings, handling each eye
separately. See load_asc(). This step is skipped when a pre-loaded
eyeris object is passed as file (see the file parameter).
Resample onto a uniform grid (resample, default: on) – Places each
block on the expected uniform sampling grid. For hardware that drops
samples (instead of zero-filling) when pupil data is missing, this
interpolates local sub-period timing jitter and inserts NA rows at the
dropped timestamps, so the rate-dependent steps that follow stay valid. A
guaranteed no-op for already-uniform data (e.g., EyeLink). See
resample().
Remove blinks (deblink, default: on) – Replaces the missing data
around blinks with NAs, extending each gap by 50 ms on either side so
that the rapid dips and spikes that surround a blink are removed too. See
deblink().
Remove transient artifacts (detransient, default: on) – Rejects
pupil samples that change faster than is physiologically plausible, using a
speed-based median absolute deviation (MAD) threshold. See
detransient().
Interpolate missing samples (interpolate, default: on) – Fills the
NA gaps left by the resample, deblink, and detransient steps using linear
interpolation, producing a continuous, gap-free time series. See
interpolate().
Smooth the signal (lpfilt, default: on) – Applies a low-pass
filter (default 4 Hz passband) to remove high-frequency noise while
preserving the slower pupil dynamics of interest. See lpfilt().
Downsample (downsample, default: off) – Optionally lowers the
sampling rate using an anti-aliasing filter, which preserves the temporal
dynamics of the signal. Cannot be combined with bin. See
downsample().
Bin (bin, default: off) – Optionally lowers the sampling rate by
averaging samples within equal-width time bins. Cannot be combined with
downsample. See bin().
Detrend (detrend, default: off) – Optionally fits a model of
pupil ~ time and returns the residuals (along with the fitted trend) to
remove slow drift. By default (detrend = TRUE) a straight-line
(method = "linear") trend is removed; pass
detrend = list(method = "spline", spline_df = 5) to instead remove a
smooth, potentially nonlinear trend via a natural cubic spline of time. Use
with care – see detrend() for when this is appropriate.
Z-score (zscore, default: on) – Rescales the pupil time series to a
mean of 0 and a standard deviation of 1, making values comparable across
participants and recordings. See zscore().
After preprocessing, glassbox() calls summarize_confounds() to compute
per-step confound metrics (e.g., missingness and gaze statistics) and store them
in $confounds.
Crucially, each step adds a new column to the time series rather than
overwriting the previous one, so every intermediate stage is preserved inside
the returned eyeris object. This is what makes the pipeline a "glass box":
you can inspect, plot, and compare the data before and after each
transformation (for example, plot(output, steps = c(1, 5))).
lifecycle::deprecate_warn()
demo_data <- eyelink_asc_demo_dataset()
# (1) examples using the default prescribed parameters and pipeline recipe
## (a) run an automated pipeline with no real-time inspection of parameters
output <- eyeris::glassbox(demo_data)
start_time <- min(output$timeseries$block_1$time_secs)
end_time <- max(output$timeseries$block_1$time_secs)
# by default, verbose = TRUE. To suppress messages, set verbose = FALSE.
plot(
output,
steps = c(1, 5),
preview_window = c(start_time, end_time),
seed = 0
)
## (b) run a interactive workflow (with confirmation prompts after each step)
output <- eyeris::glassbox(demo_data, interactive_preview = TRUE, seed = 0)
# (2) examples of overriding the default parameters
output <- eyeris::glassbox(
demo_data,
interactive_preview = FALSE, # TRUE to visualize each step in real-time
deblink = list(extend = 40),
# only interpolate gaps up to 100 ms; longer gaps are left as NA
interpolate = list(max_gap_ms = 100),
lpfilt = list(plot_freqz = TRUE) # overrides verbose parameter
)
# to suppress messages, set verbose = FALSE in plot():
plot(output, seed = 0, verbose = FALSE, preview_window = c(10, 12))
# (3) examples of disabling certain steps
output <- eyeris::glassbox(
demo_data,
detransient = FALSE,
detrend = FALSE,
zscore = FALSE
)
plot(output, seed = 0, preview_window = c(10, 12))
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.