时空网络动力学图谱分析完整解决方案

时空网络动力学图谱分析完整解决方案

1. 数据预处理与特征提取
import numpy as np
import mne
import pandas as pd
from scipy import signal, stats
import antropy as ant

def preprocess_data(raw, l_freq=1, h_freq=40):
    """预处理EEG数据"""
    raw.filter(l_freq, h_freq, fir_design='firwin')
    raw.set_eeg_reference('average')
    return raw

def extract_features(data, sfreq):
    """提取Hjorth参数和香农熵"""
    features = []
    for ch_data in data:
        # Hjorth参数
        activity = np.var(ch_data)
        diff1 = np.diff(ch_data)
        mobility = np.sqrt(np.var(diff1) / activity)
        diff2 = np.diff(diff1)
        complexity = np.sqrt(np.var(diff2) / np.var(diff1)) / mobility
        
        # 香农熵
        shannon_ent = ant.shannon_entropy(ch_data)
        
        features.append([activity, mobility, complexity, shannon_ent])
    return np.array(features)
2. 动态连接矩阵计算(PLV/wPLI)
from mne.connectivity import spectral_connectivity
from functools import partial

def compute_dynamic_connectivity(data, sfreq, method='wpli', window_size=1.0, step=0.2):
    """滑动窗口计算连接矩阵"""
    n_channels, n_samples = data.shape
    window_samples = int(window_size * sfreq)
    step_samples = int(step * sfreq)
    n_windows = (n_samples - window_samples) // step_samples + 1
    
    conn_mats = np.zeros((n_windows, n_channels, n_channels))
    freqs = np.arange(1, 41, 1)  # 1-40Hz
    
    for i in range(n_windows):
        start = i * step_samples
        end = start + window_samples
        window_data = data[:, start:end]
        
        # 计算频域连接性
        con, freqs, _, _ = spectral_connectivity(
            [window_data], method=method, mode='multitaper',
            sfreq=sfreq, fmin=1, fmax=40, faverage=True)
        
        conn_mats[i] = con[..., 0]
    
    return conn_mats
3. Granger因果分析
from statsmodels.tsa.stattools import grangercausalitytests

def compute_granger_causality(data, maxlag=5):
    """计算Granger因果关系矩阵"""
    n_channels, n_samples = data.shape
    gc_mat = np.zeros((n_channels, n_channels))
    
    for i in range(n_channels):
        for j in range(n_channels):
            if i != j:
                test_result = grangercausalitytests(
                    np.column_stack((data[j], data[i])), 
                    maxlag=maxlag, verbose=False)
                
                # 取最佳滞后的p值
                min_p = min([test_result[lag][0]['ssr_chi2test'][1] 
             

你可能感兴趣的:(python,机器学习,仿真,机器学习,人工智能,深度学习)