13 KiB
Multi-Signal Integration (Bio Module)
Overview
The Bio module provides unified functions for processing and analyzing multiple physiological signals simultaneously. It acts as a wrapper that coordinates signal-specific processing functions and enables integrated multi-modal analysis.
Multi-Signal Processing
bio_process()
Process multiple physiological signals simultaneously with a single function call.
bio_signals, bio_info = nk.bio_process(ecg=None, rsp=None, eda=None, emg=None,
ppg=None, eog=None, sampling_rate=1000)
Parameters:
ecg: ECG signal array (optional)rsp: Respiratory signal array (optional)eda: EDA signal array (optional)emg: EMG signal array (optional)ppg: PPG signal array (optional)eog: EOG signal array (optional)sampling_rate: Sampling rate in Hz (must be consistent across signals or specify per signal)
Returns:
bio_signals: Unified DataFrame containing all processed signals with columns:- Signal-specific features (e.g.,
ECG_Clean,ECG_Rate,EDA_Phasic,RSP_Rate) - All detected events/peaks
- Derived measures
- Signal-specific features (e.g.,
bio_info: Dictionary with signal-specific information (peak locations, parameters)
Example:
# Process ECG, respiration, and EDA simultaneously
bio_signals, bio_info = nk.bio_process(
ecg=ecg_signal,
rsp=rsp_signal,
eda=eda_signal,
sampling_rate=1000
)
# Access processed signals
ecg_clean = bio_signals['ECG_Clean']
rsp_rate = bio_signals['RSP_Rate']
eda_phasic = bio_signals['EDA_Phasic']
# Access detected peaks
ecg_peaks = bio_info['ECG']['ECG_R_Peaks']
rsp_peaks = bio_info['RSP']['RSP_Peaks']
Internal workflow:
- Each signal is processed by its dedicated processing function:
ecg_process()for ECGrsp_process()for respirationeda_process()for EDAemg_process()for EMGppg_process()for PPGeog_process()for EOG
- Results are merged into unified DataFrame
- Cross-signal features computed (e.g., RSA if both ECG and RSP present)
Advantages:
- Simplified API for multi-modal recording
- Unified time base for all signals
- Automatic cross-signal feature computation
- Consistent output format
Multi-Signal Analysis
bio_analyze()
Perform comprehensive analysis on processed multi-modal signals.
bio_results = nk.bio_analyze(bio_signals, sampling_rate=1000)
Parameters:
bio_signals: DataFrame frombio_process()or custom processed signalssampling_rate: Sampling rate (Hz)
Returns:
- DataFrame with analysis results for all detected signal types:
- Interval-related metrics if duration ≥ 10 seconds
- Event-related metrics if duration < 10 seconds
- Cross-signal indices (e.g., RSA if ECG + RSP available)
Computed metrics by signal:
- ECG: Heart rate statistics, HRV indices (time, frequency, nonlinear domains)
- RSP: Respiratory rate statistics, RRV, amplitude measures
- EDA: SCR count, amplitude, tonic level, sympathetic indices
- EMG: Activation count, amplitude statistics
- PPG: Similar to ECG (heart rate, HRV)
- EOG: Blink count, blink rate
Cross-signal metrics:
- RSA (Respiratory Sinus Arrhythmia): If ECG + RSP present
- Cardiorespiratory coupling: Phase synchronization indices
- Multi-modal arousal: Combined autonomic indices
Example:
# Analyze processed signals
results = nk.bio_analyze(bio_signals, sampling_rate=1000)
# Access results
heart_rate_mean = results['ECG_Rate_Mean']
hrv_rmssd = results['HRV_RMSSD']
breathing_rate = results['RSP_Rate_Mean']
scr_count = results['SCR_Peaks_N']
rsa_value = results['RSA'] # If both ECG and RSP present
Cross-Signal Features
When multiple signals are processed together, NeuroKit2 can compute integrated features:
Respiratory Sinus Arrhythmia (RSA)
Automatically computed when both ECG and respiratory signals are present.
bio_signals, bio_info = nk.bio_process(ecg=ecg, rsp=rsp, sampling_rate=1000)
results = nk.bio_analyze(bio_signals, sampling_rate=1000)
rsa = results['RSA'] # Automatically included
Computation:
- High-frequency HRV modulation by breathing
- Requires synchronized ECG R-peaks and respiratory signal
- Methods: Porges-Bohrer or peak-to-trough
Interpretation:
- Higher RSA: greater parasympathetic (vagal) influence
- Marker of cardiac-respiratory coupling
- Health indicator and emotion regulation capacity
ECG-Derived Respiration (EDR)
If respiratory signal unavailable, NeuroKit2 can estimate from ECG:
ecg_signals, ecg_info = nk.ecg_process(ecg, sampling_rate=1000)
# Extract EDR
edr = nk.ecg_rsp(ecg_signals['ECG_Clean'], sampling_rate=1000)
Use case:
- Estimate respiration when direct measurement unavailable
- Cross-validate respiratory measurements
Cardio-EDA Integration
Synchronized cardiac and electrodermal activity:
bio_signals, bio_info = nk.bio_process(ecg=ecg, eda=eda, sampling_rate=1000)
# Both signals available for integrated analysis
ecg_rate = bio_signals['ECG_Rate']
eda_phasic = bio_signals['EDA_Phasic']
# Compute correlations or coupling metrics
correlation = ecg_rate.corr(eda_phasic)
Practical Workflows
Complete Multi-Modal Recording Analysis
import neurokit2 as nk
import pandas as pd
# 1. Load multi-modal physiological data
ecg = load_ecg() # Your data loading function
rsp = load_rsp()
eda = load_eda()
emg = load_emg()
# 2. Process all signals simultaneously
bio_signals, bio_info = nk.bio_process(
ecg=ecg,
rsp=rsp,
eda=eda,
emg=emg,
sampling_rate=1000
)
# 3. Visualize processed signals
import matplotlib.pyplot as plt
fig, axes = plt.subplots(4, 1, figsize=(15, 12), sharex=True)
# ECG
axes[0].plot(bio_signals.index / 1000, bio_signals['ECG_Clean'])
axes[0].set_ylabel('ECG')
axes[0].set_title('Multi-Modal Physiological Recording')
# Respiration
axes[1].plot(bio_signals.index / 1000, bio_signals['RSP_Clean'])
axes[1].set_ylabel('Respiration')
# EDA
axes[2].plot(bio_signals.index / 1000, bio_signals['EDA_Phasic'])
axes[2].set_ylabel('EDA (Phasic)')
# EMG
axes[3].plot(bio_signals.index / 1000, bio_signals['EMG_Amplitude'])
axes[3].set_ylabel('EMG Amplitude')
axes[3].set_xlabel('Time (s)')
plt.tight_layout()
plt.show()
# 4. Analyze all signals
results = nk.bio_analyze(bio_signals, sampling_rate=1000)
# 5. Extract key metrics
print("Heart Rate (mean):", results['ECG_Rate_Mean'])
print("HRV (RMSSD):", results['HRV_RMSSD'])
print("Breathing Rate:", results['RSP_Rate_Mean'])
print("SCRs (count):", results['SCR_Peaks_N'])
print("RSA:", results['RSA'])
Event-Related Multi-Modal Analysis
# 1. Process signals
bio_signals, bio_info = nk.bio_process(ecg=ecg, rsp=rsp, eda=eda, sampling_rate=1000)
# 2. Detect events
events = nk.events_find(trigger_channel, threshold=0.5)
# 3. Create epochs for all signals
epochs = nk.epochs_create(bio_signals, events, sampling_rate=1000,
epochs_start=-1.0, epochs_end=10.0,
event_labels=event_labels,
event_conditions=event_conditions)
# 4. Signal-specific event-related analysis
ecg_eventrelated = nk.ecg_eventrelated(epochs)
rsp_eventrelated = nk.rsp_eventrelated(epochs)
eda_eventrelated = nk.eda_eventrelated(epochs)
# 5. Merge results
all_results = pd.merge(ecg_eventrelated, rsp_eventrelated,
left_index=True, right_index=True)
all_results = pd.merge(all_results, eda_eventrelated,
left_index=True, right_index=True)
# 6. Statistical comparison by condition
all_results['Condition'] = event_conditions
condition_means = all_results.groupby('Condition').mean()
Different Sampling Rates
Handle signals with different native sampling rates:
# ECG at 1000 Hz, EDA at 100 Hz
bio_signals, bio_info = nk.bio_process(
ecg=ecg_1000hz,
eda=eda_100hz,
sampling_rate=1000 # Target sampling rate
)
# EDA will be automatically resampled to 1000 Hz internally
Or process separately and merge:
# Process at native sampling rates
ecg_signals, ecg_info = nk.ecg_process(ecg, sampling_rate=1000)
eda_signals, eda_info = nk.eda_process(eda, sampling_rate=100)
# Resample to common rate
eda_resampled = nk.signal_resample(eda_signals, sampling_rate=100,
desired_sampling_rate=1000)
# Merge manually
bio_signals = pd.concat([ecg_signals, eda_resampled], axis=1)
Use Cases and Applications
Comprehensive Psychophysiology Research
Capture multiple dimensions of physiological arousal:
- Cardiac: Orienting, attention, emotional valence
- Respiratory: Arousal, stress, emotion regulation
- EDA: Sympathetic arousal, emotional intensity
- EMG: Muscle tension, facial expression, startle
Example: Emotional picture viewing
- ECG: Heart rate deceleration during picture viewing (attention)
- EDA: SCRs reflect emotional arousal intensity
- RSP: Breath-holding or changes reflect emotional engagement
- Facial EMG: Corrugator (frown), zygomaticus (smile) for valence
Stress and Relaxation Assessment
Multi-modal markers provide convergent evidence:
- Increased stress: ↑ HR, ↓ HRV, ↑ EDA, ↑ respiration rate, ↑ muscle tension
- Relaxation: ↓ HR, ↑ HRV, ↓ EDA, ↓ respiration rate, slow breathing, ↓ muscle tension
Intervention effectiveness:
- Compare multi-modal indices before vs. after intervention
- Identify which modalities respond to specific techniques
Clinical Assessment
Anxiety disorders:
- Heightened baseline EDA, HR
- Exaggerated responses to stressors
- Reduced HRV, respiratory variability
Depression:
- Altered autonomic balance (↓ HRV)
- Blunted EDA responses
- Irregular respiratory patterns
PTSD:
- Hyperarousal (↑ HR, ↑ EDA baseline)
- Exaggerated startle (EMG)
- Altered RSA
Human-Computer Interaction
Unobtrusive user state assessment:
- Cognitive load: ↓ HRV, ↑ EDA, suppressed blinks
- Frustration: ↑ HR, ↑ EDA, ↑ muscle tension
- Engagement: Moderate arousal, synchronized responses
- Boredom: Low arousal, irregular patterns
Athletic Performance and Recovery
Monitor training load and recovery:
- Resting HRV: Daily monitoring for overtraining
- EDA: Sympathetic activation and stress
- Respiration: Breathing patterns during exercise/recovery
- Multi-modal integration: Comprehensive recovery assessment
Advantages of Multi-Modal Recording
Convergent validity:
- Multiple indices converge on same construct (e.g., arousal)
- More robust than single measure
Discriminant validity:
- Different signals dissociate under certain conditions
- ECG reflects both sympathetic and parasympathetic
- EDA reflects primarily sympathetic
System integration:
- Understand whole-body physiological coordination
- Cross-signal coupling metrics (RSA, coherence)
Redundancy and robustness:
- If one signal quality poor, others available
- Cross-validate findings across modalities
Richer interpretation:
- HR deceleration + SCR increase = orienting with arousal
- HR acceleration + no SCR = cardiac response without sympathetic arousal
Considerations
Hardware and Synchronization
- Same device: Signals inherently synchronized
- Different devices: Requires common trigger/timestamp
- Use hardware trigger to mark simultaneous events
- Software alignment based on event markers
- Verify synchronization quality (cross-correlate redundant signals)
Signal Quality Across Modalities
- Not all signals may have equal quality
- Prioritize based on research question
- Document quality issues per signal
Computational Cost
- Processing multiple signals increases computation time
- Consider processing in batches for large datasets
- Downsample appropriately to reduce load
Analysis Complexity
- More signals = more variables = more statistical comparisons
- Risk of Type I error (false positives) without correction
- Use multivariate approaches or pre-registered analyses
Interpretation
- Avoid over-interpretation of complex multi-modal patterns
- Ground in physiological theory
- Replicate findings before strong claims
References
- Berntson, G. G., Cacioppo, J. T., & Quigley, K. S. (1993). Respiratory sinus arrhythmia: autonomic origins, physiological mechanisms, and psychophysiological implications. Psychophysiology, 30(2), 183-196.
- Cacioppo, J. T., Tassinary, L. G., & Berntson, G. (Eds.). (2017). Handbook of psychophysiology (4th ed.). Cambridge University Press.
- Kreibig, S. D. (2010). Autonomic nervous system activity in emotion: A review. Biological psychology, 84(3), 394-421.
- Laborde, S., Mosley, E., & Thayer, J. F. (2017). Heart rate variability and cardiac vagal tone in psychophysiological research–recommendations for experiment planning, data analysis, and data reporting. Frontiers in psychology, 8, 213.