Elephant (Electrophysiology Analysis Toolkit) is a Python library for analyzing electrophysiology data. It provides algorithms for spike train analysis, signal processing, and statistical methods designed specifically for neuroscience research.
Why Elephant?
- Neuroscience-Focused: Methods designed for electrophysiology workflows
- Neo Integration: Works seamlessly with Neo data structures
- Units Support: Proper handling of physical units via Quantities
- Validated Methods: Implementations follow published methodologies
- Comprehensive: Covers spike trains, LFP, and multivariate analyses
Key Features
Spike Train Analysis
import elephant
from neo import SpikeTrain
import quantities as pq
# Create spike train
spike_times = [0.1, 0.3, 0.45, 0.8, 1.2] * pq.s
spiketrain = SpikeTrain(spike_times, t_stop=2.0*pq.s)
# Calculate inter-spike intervals
isis = elephant.statistics.isi(spiketrain)
# Calculate instantaneous firing rate
firing_rate = elephant.statistics.instantaneous_rate(
spiketrain,
sampling_period=10*pq.ms,
kernel=elephant.kernels.GaussianKernel(sigma=50*pq.ms)
)
# Calculate coefficient of variation (CV2)
cv2 = elephant.statistics.cv2(isis)
LFP Signal Processing
from elephant.signal_processing import butter
from neo import AnalogSignal
# Create LFP signal
lfp = AnalogSignal(
lfp_data,
units='mV',
sampling_rate=1000*pq.Hz
)
# Bandpass filter for theta band
theta_lfp = butter(
lfp,
lowpass_freq=8*pq.Hz,
highpass_freq=4*pq.Hz,
order=4
)
# Calculate power spectrum
freqs, psd = elephant.spectral.welch_psd(lfp, freq_res=1*pq.Hz)
Spike-Field Coherence
from elephant.spectral import spike_field_coherence
# Calculate coherence between spikes and LFP
frequencies, coherence, phase_lag = spike_field_coherence(
spiketrain,
lfp_signal,
frequency_resolution=1*pq.Hz
)
# Find significant coherence
significant_freqs = frequencies[coherence > threshold]
Common Neuroscience Workflows
Firing Rate Analysis
# Mean firing rate
mean_rate = elephant.statistics.mean_firing_rate(spiketrain)
# Time-varying firing rate with Gaussian kernel
kernel = elephant.kernels.GaussianKernel(sigma=100*pq.ms)
rate = elephant.statistics.instantaneous_rate(
spiketrain,
sampling_period=10*pq.ms,
kernel=kernel
)
Spike Train Statistics
# Coefficient of variation
cv = elephant.statistics.cv(isis)
# Local variation (Lv)
lv = elephant.statistics.lv(isis)
# Fano factor
fano = elephant.statistics.fanofactor(spiketrain)
Spectral Analysis
# Multi-taper power spectral density
freqs, psd = elephant.spectral.multitaper_psd(
lfp_signal,
freq_res=0.5*pq.Hz,
n_tapers=5
)
# Spectrogram
freqs, times, spec = elephant.spectral.spectrogram(
lfp_signal,
freq_res=2*pq.Hz,
overlap=0.5
)
Cross-Correlation
# Spike train cross-correlation
cch = elephant.spike_train_correlation.cross_correlation_histogram(
spiketrain1,
spiketrain2,
window=(-100, 100)*pq.ms,
bin_size=1*pq.ms
)
Integration with Neo
Elephant is designed to work with Neo’s data structures:
from neo import Block, Segment, SpikeTrain, AnalogSignal
import quantities as pq
# Create a Neo structure
block = Block()
segment = Segment()
block.segments.append(segment)
# Add spike train
spiketrain = SpikeTrain([0.1, 0.5, 0.9]*pq.s, t_stop=1.0*pq.s)
segment.spiketrains.append(spiketrain)
# Add LFP signal
lfp = AnalogSignal(lfp_data, units='mV', sampling_rate=1000*pq.Hz)
segment.analogsignals.append(lfp)
# Analyze with Elephant
rate = elephant.statistics.mean_firing_rate(spiketrain)
Advanced Topics
Unitary Event Analysis
# Detect coincident spikes beyond chance
from elephant.unitary_event_analysis import hash_from_pattern
ue_result = elephant.unitary_event_analysis.unitary_events(
spiketrains=[st1, st2, st3],
bin_size=5*pq.ms,
winsize=100*pq.ms
)
Spike Train Generation
# Generate Poisson spike train
poisson_train = elephant.spike_train_generation.homogeneous_poisson_process(
rate=50*pq.Hz,
t_start=0*pq.s,
t_stop=10*pq.s
)
Phase Analysis
# Hilbert transform for phase extraction
analytic_signal = elephant.signal_processing.hilbert(theta_lfp)
phase = np.angle(analytic_signal)
# Phase locking of spikes
phase_at_spikes = phase[spike_indices]
Statistical Testing
# Compare firing rates between conditions
from scipy import stats
control_rates = [elephant.statistics.mean_firing_rate(st) for st in control_trains]
treatment_rates = [elephant.statistics.mean_firing_rate(st) for st in treatment_trains]
t_stat, p_value = stats.ttest_ind(control_rates, treatment_rates)
Installation
pixi add elephant
# or
conda install -c conda-forge elephant
# or
pip install elephant
Elephant requires Neo and Quantities, which will be installed automatically.
Best Practices
- Always include proper units using Quantities
- Use Neo data structures for compatibility
- Specify time periods explicitly (t_start, t_stop)
- Choose appropriate kernel widths for rate estimation
- Validate statistical significance with proper corrections
- Document analysis parameters for reproducibility
- Consider multiple units/channels when analyzing arrays