skills/neurokit2/references/eda.md
Checked 2026-07-23 against NeuroKit2 0.2.13 stable runtime/source, the official EDA API/examples, and Society for Psychophysiological Research guidance.
Record:
Do not infer microsiemens from EDA or compare arbitrary sensor units with published
µS thresholds. Sensor site, hardware, environment, and population require validation.
signals, info = nk.eda_process(
eda,
sampling_rate=100,
method="neurokit",
)
In stable 0.2.13 the NeuroKit pipeline performs cleaning, high-pass tonic/phasic decomposition, and NeuroKit SCR detection. It does not use cvxEDA by default.
The pinned default schema observed:
EDA_Raw, EDA_Clean, EDA_Tonic, EDA_Phasic,
SCR_Onsets, SCR_Peaks, SCR_Height, SCR_Amplitude,
SCR_RiseTime, SCR_Recovery, SCR_RecoveryTime
info was a flat dict containing SCR arrays plus sampling_rate. Treat this as a
default 0.2.13 observation, not a universal schema.
There is no public eda_quality() in stable 0.2.13. Quality must combine acquisition
metadata, missing/flat/clipped/motion checks, raw/clean overlays, decomposition
plausibility, and response review.
clean = nk.eda_clean(eda, sampling_rate=100, method="neurokit")
components = nk.eda_phasic(
clean,
sampling_rate=100,
method="highpass",
)
eda_clean() options include neurokit, biosppy, and none. The NeuroKit path
uses a 3 Hz low-pass, and skips it below 7 Hz.
eda_phasic() returns a DataFrame with EDA_Tonic and EDA_Phasic. Methods include:
highpass: default stable method; phasic high-pass separation;smoothmedian: median-smoothed tonic estimate;cvxeda: convex optimization; needs optional cvxopt;sparseda: sparse decomposition.These methods estimate different latent components and are not interchangeable. Report method, all kwargs, optional dependency versions, convergence/failure behavior, and sensitivity. Do not call one decomposition “physiologically true” without appropriate validation.
markers, peak_info = nk.eda_peaks(
components["EDA_Phasic"],
sampling_rate=100,
method="neurokit",
amplitude_min=0.1,
)
Stable methods include neurokit, gamboa2008, kim2004, vanhalem2020, and
nabian2018. For neurokit and kim2004, amplitude_min is a fraction relative to
the largest amplitude in the analyzed signal—not an absolute µS threshold.
eda_peaks() returns (signals, info):
SCR_Onsets, SCR_Peaks, SCR_Height,
SCR_Amplitude, SCR_RiseTime, SCR_Recovery, SCR_RecoveryTime;Marker columns are same-length arrays; feature values are placed at relevant marker
locations and are otherwise missing. Use info for event-level arrays. Do not average
same-length feature columns as if every sample were an independent response.
eda_fixpeaks() is documented as a placeholder that does not currently correct EDA
peaks.
EDA motion/electrode artifacts can resemble fast responses, while detachment can look flat. Before decomposition:
Filtering cannot restore a detached or saturated channel. A low response count can be physiological, methodological, or a sensor failure; it is not automatically a “non-responder.”
Create epochs only after event and signal clocks are aligned:
epochs = nk.epochs_create(
signals,
events,
sampling_rate=100,
epochs_start=-1,
epochs_end=10,
baseline_correction=False,
)
features = nk.eda_eventrelated(epochs)
Stable event-related output is conditional on available columns. Documented features
include EDA_SCR, first-response amplitude/time/rise/recovery fields, tonic/phasic
summaries, labels, conditions, and event onset. Inspect features.columns.
Prespecify response latency/window, overlap handling, baseline approach, minimum amplitude definition, non-response coding, and trial artifact rules. Slow responses can overlap adjacent events; a peak in a window is not automatically elicited by that event.
features = nk.eda_intervalrelated(signals, sampling_rate=100)
The pinned official example showed six columns, including SCR count/amplitude,
EDA_Tonic_SD, EDA_Sympathetic, EDA_SympatheticN, and
EDA_Autocorrelation; output depends on duration and available columns.
eda_sympathetic() supports posada and ghiasi, with a default 0.045–0.25 Hz
band. The implementation/documentation uses at least 64 seconds to support the spectral
estimate. Report exact usable duration, frequency band, estimator, normalization, and
units. Do not turn this index into a direct clinical sympathetic-state measure.
python skills/neurokit2/scripts/eda_pipeline.py \
--input deidentified.csv --column EDA --root . --deidentified \
--sampling-rate 100 --unit uS \
--clean-method neurokit --phasic-method highpass \
--peak-method neurokit --amplitude-min 0.1
The helper rejects missing/non-finite samples, records the observed schema, and makes decomposition/threshold semantics explicit.
EDA indexes eccrine sweat-gland activity under the recording conditions. It does not uniquely identify stress, emotion, deception, pain, diagnosis, or intent. Compare within a theory-driven design with contextual measures and validated preprocessing. Do not use this workflow for clinical/driver/workplace monitoring or medical-device validation.