AI-мониторинг психического состояния через носимые устройства
Мониторинг психического состояния — стресса, тревоги, депрессии — через носимые устройства представляет собой активно развивающееся направление digital health. Модели достигают AUC 0.70-0.85 для детекции стресса, что полезно для превентивных вмешательств, но не заменяет клиническую диагностику.
Физиологические маркеры психического состояния
Вегетативная нервная система как мишень: ВНС напрямую отражает стресс-ответ. Симпатическая активация (стресс) → тахикардия, снижение HRV, усиление потоотделения, повышение температуры кожи.
Ключевые биомаркеры:
stress_biomarkers = {
# HRV (Heart Rate Variability) — золотой стандарт
'rmssd': 'парасимпатический тонус: снижение = стресс',
'lf_hf_ratio': 'симпато-вагальный баланс (30-й PSD)',
'sdnn': 'общая вариабельность',
# ЭКС (электрокожная проводимость) = EDA/GSR
'eda_tonic': 'SCL (Skin Conductance Level): базовый тонус',
'eda_phasic_scr': 'SCR (Skin Conductance Response): острый стресс',
# Температура
'peripheral_temp': 'снижение при симпатической активации (вазоконстрикция)',
'core_wrist_temp': 'Oura Ring: базовая температура кожи запястья',
# Движение
'actigraphy': 'беспокойность, нарушения сна',
'sway_variability': 'постуральная стабильность (тревога → нестабильность)'
}
Feature Engineering из физиологических данных
HRV фичи во временной и частотной областях:
def compute_hrv_stress_features(rr_intervals_ms, window_sec=300):
"""
5-минутное окно — стандарт для HRV анализа (Task Force 1996)
"""
rr = np.array(rr_intervals_ms)
# Временные метрики
time_features = {
'rmssd': np.sqrt(np.mean(np.diff(rr)**2)),
'sdnn': np.std(rr),
'pnn50': np.mean(np.abs(np.diff(rr)) > 50),
'mean_rr': np.mean(rr),
'cv_rr': np.std(rr) / np.mean(rr) # coefficient of variation
}
# Частотные метрики (PSD через Welch)
from scipy.signal import welch
f, psd = welch(rr - np.mean(rr), fs=4.0, nperseg=256) # upsampled to 4 Hz
lf_mask = (f >= 0.04) & (f < 0.15)
hf_mask = (f >= 0.15) & (f < 0.40)
lf_power = np.trapz(psd[lf_mask], f[lf_mask])
hf_power = np.trapz(psd[hf_mask], f[hf_mask])
freq_features = {
'lf_power_ms2': lf_power,
'hf_power_ms2': hf_power,
'lf_hf_ratio': lf_power / (hf_power + 1e-8),
'total_power': np.trapz(psd, f)
}
return {**time_features, **freq_features}
EDA обработка:
import neurokit2 as nk
def process_eda_signal(eda_raw, sampling_rate=64):
"""
neurokit2: разложение EDA на tonic (SCL) + phasic (SCR) компоненты
"""
signals, info = nk.eda_process(eda_raw, sampling_rate=sampling_rate)
return {
'scl_mean': signals['EDA_Tonic'].mean(),
'scr_count': len(info['SCR_Onsets']), # число острых стресс-реакций
'scr_amplitude_mean': signals['SCR_Amplitude'].mean(),
'scr_recovery_time': signals['SCR_RecoveryTime'].mean()
}
Модели детекции стресса
Binary Stress Classification:
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler
# Таргет: стресс (1) / нет стресса (0) — лабораторные метки (TSST протокол)
# Обучающие данные: WESAD, DEAP, DREAMER датасеты
features = ['rmssd', 'lf_hf_ratio', 'scl_mean', 'scr_count', 'peripheral_temp',
'actigraphy_std', 'mean_hr', 'hour_of_day', 'activity_level']
stress_clf = RandomForestClassifier(n_estimators=200, class_weight='balanced')
stress_clf.fit(scaler.fit_transform(X_train), y_train)
Personalized baseline: Стресс-реакция индивидуальна. Абсолютное значение RMSSD = 30 мс может быть нормой для одного человека и низким для другого. Нормализация к персональному baseline (скользящее среднее 2-недель):
def personalized_stress_score(current_hrv, personal_baseline_hrv):
"""
Относительное отклонение от персонального baseline
Более интерпретируемо, чем абсолютные значения
"""
hrv_deviation = (current_hrv['rmssd'] - personal_baseline_hrv['rmssd_mean']) / personal_baseline_hrv['rmssd_std']
return -hrv_deviation # инвертируем: снижение HRV = рост стресса
Мультимодальная fusion:
def fuse_modalities(hrv_features, eda_features, actigraphy_features):
"""
Late fusion: каждая модальность → свой score → взвешенная сумма
Плюс: надёжнее при отсутствии одной модальности (нет EDA сенсора)
"""
hrv_score = hrv_stress_model.predict_proba([hrv_features])[0][1]
eda_score = eda_stress_model.predict_proba([eda_features])[0][1]
activity_score = activity_stress_model.predict_proba([actigraphy_features])[0][1]
final_score = 0.45 * hrv_score + 0.35 * eda_score + 0.20 * activity_score
return final_score
Мониторинг настроения и депрессии
Digital Phenotyping из смартфона:
- Screen time patterns: чрезмерное использование или полная пассивность
- Mobility patterns (GPS): снижение движения при депрессии
- Social interactions: звонки, сообщения — сокращение при изоляции
- Sleep patterns: нарушения из акселерометра
PHQ-9 дигитализация: Опросник депрессии PHQ-9 → выявление корреляций с пассивными сенсорными данными → предсказание высокого балла по PHQ-9 без заполнения анкеты.
Ограничения и этика
Точность: Стресс — субъективный конструкт. Лабораторный стресс (TSST, Stroop) ≠ реальный жизненный стресс. Модели, обученные на lab data, генерализуются хуже на naturalistic settings.
Не клиническая диагностика: Явный disclaimer в любом продукте: система не диагностирует психические расстройства. Высокий стресс-скор → рекомендация обратиться к специалисту, не диагноз.
GDPR/конфиденциальность: Психологические данные = специальная категория по GDPR (Art. 9). Требуется явное информированное согласие, минимизация данных, обработка только на edge по возможности.
Bias: Обучающие данные преимущественно — студенты западных университетов. Генерализация на другие популяции не гарантирована.
Сроки: HRV pipeline + персональный baseline + базовый stress score + мобильное приложение — 4-5 недель. EDA fusion, depressive mood modeling, digital phenotyping, privacy-preserving edge processing — 3-4 месяца.







