| name | eeg-biomarker-robustness-cross-population |
| description | Cross-population framework for evaluating robustness and generalizability of EEG biomarkers in multi-site clinical settings. Addresses cross-subject and cross-platform variation for reliable Parkinson's disease detection. Keywords: EEG biomarkers, cross-population, generalization, multi-site, Parkinson's disease, clinical reliability. |
Robust and Clinically Reliable EEG Biomarkers: A Cross Population Framework
Framework for developing EEG biomarkers that generalize across populations, sites, and recording platforms for reliable clinical deployment.
Metadata
- Source: arXiv:2604.23933v1
- Authors: Nicholas R. Rasmussen, Longwei Wang, Rodrigue Rizk, et al.
- Published: 2026-04-27
Core Methodology
The Cross-Population Challenge
EEG biomarkers often fail when deployed across different:
- Subjects: Individual physiological differences
- Sites: Different hospitals/clinics with varying protocols
- Platforms: Different EEG hardware and software
- Populations: Different demographics, disease stages
Three-Pillar Evaluation Framework
┌─────────────────────────────────────────────────────────────┐
│ ROBUST EEG BIOMARKER FRAMEWORK │
├─────────────────┬─────────────────┬─────────────────────────┤
│ INTERNAL │ EXTERNAL │ CLINICAL │
│ RELIABILITY │ RELIABILITY │ UTILITY │
├─────────────────┼─────────────────┼─────────────────────────┤
│ • Test-retest │ • Cross-site │ • Diagnostic │
│ stability │ generalization│ accuracy │
│ • Split-half │ • Cross-platform│ • Prognostic │
│ consistency │ robustness │ value │
│ • Intra-subject │ • Cross-population• Treatment │
│ variance │ transfer │ monitoring │
└─────────────────┴─────────────────┴─────────────────────────┘
Implementation Guide
Step 1: Biomarker Feature Extraction
import numpy as np
from scipy import signal
from sklearn.preprocessing import StandardScaler
class EEGBiomarkerExtractor:
"""
Extract robust EEG biomarkers for clinical applications
"""
def __init__(self, fs=500):
self.fs = fs
self.bands = {
'delta': (0.5, 4),
'theta': (4, 8),
'alpha': (8, 13),
'beta': (13, 30),
'gamma': (30, 100)
}
def extract_spectral_features(self, eeg_data):
"""
Extract band power and spectral features
Args:
eeg_data: (channels, time) array
Returns:
Dictionary of spectral features
"""
features = {}
for band_name, (low, high) in self.bands.items():
sos = signal.butter(4, [low, high], btype='band', fs=self.fs, output='sos')
filtered = signal.sosfilt(sos, eeg_data, axis=-1)
power = np.mean(filtered ** , axis=-)
features[] = power
total_power = (features[] b .bands.keys())
band .bands.keys():
features[] = features[] / (total_power + )
freqs, psd = signal.welch(eeg_data, fs=.fs, nperseg=.fs*)
alpha_mask = (freqs >= ) & (freqs <= )
features[] = freqs[alpha_mask][np.argmax(psd[:, alpha_mask], axis=)]
features
():
scipy.stats spearmanr
n_channels = eeg_data.shape[]
connectivity = np.zeros((n_channels, n_channels))
i (n_channels):
j (i+, n_channels):
phase_i = np.angle(signal.hilbert(eeg_data[i]))
phase_j = np.angle(signal.hilbert(eeg_data[j]))
plv = np.(np.mean(np.exp( * (phase_i - phase_j))))
connectivity[i, j] = connectivity[j, i] = plv
{: connectivity}
Step 2: Robustness Evaluation
from sklearn.model_selection import LeaveOneGroupOut, cross_val_score
from sklearn.ensemble import RandomForestClassifier
class BiomarkerRobustnessEvaluator:
"""
Evaluate biomarker robustness across populations
"""
def __init__(self, biomarker_extractor):
self.extractor = biomarker_extractor
self.classifier = RandomForestClassifier(n_estimators=100)
def evaluate_internal_reliability(self, X, y, subject_ids):
"""
Test-retest reliability and split-half consistency
"""
results = {}
unique_subjects = np.unique(subject_ids)
test_retest_scores = []
for subject in unique_subjects:
mask = subject_ids == subject
if np.sum(mask) >= 2:
subject_features = X[mask]
corr = np.corrcoef(subject_features)[0, 1]
test_retest_scores.append(corr)
results['test_retest_icc'] = np.mean(test_retest_scores)
from sklearn.model_selection import ShuffleSplit
cv = ShuffleSplit(n_splits=10, test_size=0.5)
split_scores = cross_val_score(self.classifier, X, y, cv=cv)
results['split_half_accuracy'] = np.mean(split_scores)
return results
():
results = {}
logo = LeaveOneGroupOut()
site_scores = cross_val_score(
.classifier, X, y,
cv=logo.split(X, y, site_ids)
)
results[] = np.mean(site_scores)
platform_scores = cross_val_score(
.classifier, X, y,
cv=logo.split(X, y, platform_ids)
)
results[] = np.mean(platform_scores)
results
():
sklearn.metrics roc_auc_score, precision_recall_fscore_support
.classifier.fit(X_train, y_train)
y_pred = .classifier.predict(X_test)
y_prob = .classifier.predict_proba(X_test)[:, ]
results = {
: roc_auc_score(y_test, y_prob),
: np.mean(y_pred == y_test),
: precision_recall_fscore_support(y_test, y_pred, average=)[],
: precision_recall_fscore_support(y_test, y_pred, average=)[],
: precision_recall_fscore_support(y_test, y_pred, average=)[]
}
results
Step 3: Harmonization Pipeline
class EEGHarmonization:
"""
Combat harmonization for multi-site EEG data
"""
def __init__(self):
from sklearn.linear_model import LinearRegression
self.model = LinearRegression()
def fit(self, X, site_ids):
"""
Learn site-specific effects (ComBat-style)
"""
self.site_effects = {}
overall_mean = np.mean(X, axis=0)
for site in np.unique(site_ids):
site_mask = site_ids == site
self.site_effects[site] = {
'mean': np.mean(X[site_mask], axis=0) - overall_mean,
'std': np.std(X[site_mask], axis=0)
}
self.overall_mean = overall_mean
return self
def transform(self, X, site_ids):
"""Remove site effects"""
X_harmonized = X.copy()
for site in np.unique(site_ids):
site_mask = site_ids == site
X_harmonized[site_mask] -= self.site_effects[site]['mean']
return X_harmonized
Applications
- Parkinson's Disease: Reliable EEG biomarkers for early detection
- Alzheimer's Disease: Cross-site validation of diagnostic markers
- Depression: Objective biomarkers for treatment monitoring
- Clinical Trials: Standardized biomarkers for drug development
Pitfalls
- Overfitting to Training Site: May not generalize to new sites
- Platform Differences: Sampling rates, electrode positions vary
- Population Bias: Training data may not represent target population
- Temporal Drift: Biomarkers may degrade over time
Related Skills
- eeg-tinnitus-biomarker-robustness
- eeg-hopfield-emotion-energy
- tms-eeg-biomarkers
- explainable-gnn-eeg-neurological
References
- Rasmussen et al. (2026) Robust EEG Biomarkers, arXiv:2604.23933
- Fortin et al. (2017) Harmonization of multi-site diffusion tensor imaging data
- Combrisson & Jerbi (2015) Exceeding chance level by chance