当前位置: 首页 > article >正文

mne溯源相关说明

文章目录

    • 参考文章:
    • MNE、dSPM、sLORETA和eLORETA方法对比
      • MNE (最小范数估计)
      • dSPM (动态统计参数映射)
      • sLORETA (标准化低分辨率脑电磁断层扫描)
      • eLORETA (精确低分辨率脑电磁断层扫描)
    • 方法比较总结
      • MNE的教程
      • mne-Load and inspect example data
        • 2. 定义绘图参数字典
        • 3. 绘制源估计图
        • 4. 添加标题
        • 关键功能总结
    • 源估计
    • 博客园
      • 读取自己的数据
      • 进行fwd的计算(前向模型)
      • **核心参数**
      • **辅助参数**
      • **源空间相关**
      • **坐标变换**
      • **使用场景**
      • 协方差矩阵和逆向估计的计算
    • 对于stc的保存和读取
    • stc结构分析(MNE文档)
  • STC的可视化
  • 选择ROI
    • 对区域进行标注
      • **可用的 `mode` 形式**
        • **1. `"mean"`**
        • **2. `"mean_flip"`**
        • **3. `"pca_flip"`**
        • **4. `"max"`**
        • **5. `"median"`**
        • **6. `"auto"`**
        • **7. `"vote"`**
      • **模式选择建议**
    • 简单查看一下选择的分区平均激活和抑制的强度的数据

参考文章:

The SourceEstimate data structure这个是mne,讲解stc的结构。
博客园Note1 基于MNE实现脑电信号的源定位(重建或成像)
开始看mne的教程,不太清晰,这个博客园的流程清楚。
从mri电极位置构建源定位
可视化源定位stc

首先我们要清楚,溯源是需要一定的大脑的模版的,这个可以使用标准模版(template)的数据来辅助,也可以根据自己的mri的数据来构建,这个没有,先不讨论。

本文使用的是fsaverage下面的模版文件。可以看到还有其他的版本的大脑扫描模版。
在这里插入图片描述
这个图来自ebrains的网页可视化
在这里插入图片描述
我们可以看到这个是按照功能区划分的。

进行源定位的方式有MNE、dSPM、sLORETA 和 eLORETA。
我将为您比较dSPM和sLORETA这两种脑源定位方法。

dSPM(动态统计参数映射)和sLORETA(标准化低分辨率脑电磁断层扫描)都是用于脑源定位的方法,但它们在原理和应用上有一些显著差异。

MNE、dSPM、sLORETA和eLORETA方法对比

这四种方法都是脑源定位(source localization)领域中常用的算法,用于从脑电图(EEG)或脑磁图(MEG)数据中推断出大脑中的神经活动源。以下是它们的详细对比:

MNE (最小范数估计)

基本原理

  • 寻求使测量数据与源活动之间误差最小的解决方案
  • 使用L2范数正则化来求解欠定反问题

特点

  • 倾向于产生分散的浅表源活动
  • 计算速度较快,实现简单
  • 对深部源活动估计不足
  • 无统计框架,难以解释激活的统计显著性

适用场景

  • 适合初步分析和探索
  • 当研究浅表皮层活动时较为可靠

dSPM (动态统计参数映射)

基本原理

  • 基于MNE,但增加了噪声协方差矩阵的归一化
  • 将估计结果转换为z分数或t统计量

特点

  • 提供统计显著性测量
  • 对噪声具有较好的鲁棒性
  • 改善了对深部源的估计,但仍有偏差
  • 保留了较好的时间分辨率

适用场景

  • 需要统计显著性评估的研究
  • 时间序列分析
  • 事件相关研究

sLORETA (标准化低分辨率脑电磁断层扫描)

基本原理

  • 使用分辨率矩阵进行标准化
  • 在无噪声情况下对单一源有零定位误差

特点

  • 理论上提供无偏估计,尤其对单一源
  • 空间分辨率优于MNE和dSPM
  • 深部源定位更准确
  • 空间平滑度较高,可能导致相邻活动源区分不清

适用场景

  • 需要准确源定位的研究
  • 对深部源活动感兴趣的研究
  • 单一或少数几个活动源的分析

eLORETA (精确低分辨率脑电磁断层扫描)

基本原理

  • sLORETA的改进版本
  • 使用权重矩阵来补偿空间偏差
  • 即使在有噪声的情况下也能达到零定位误差

特点

  • 最佳的空间分辨率和定位准确性
  • 对多源场景表现更好
  • 深部源估计更准确
  • 计算复杂度较高
  • 较新的方法,但已获得广泛认可

适用场景

  • 需要最高定位精度的研究
  • 复杂源结构的分析
  • 深部源活动研究

方法比较总结

方法定位准确性深部源估计统计框架计算复杂度空间分辨率时间分辨率
MNE很差
dSPM
sLORETA
eLORETA最高最好最高

选择哪种方法取决于具体的研究问题、数据质量、关注的脑区以及计算资源。在实际应用中,研究者经常会使用多种方法进行交叉验证,以增强结果的可靠性和稳健性。

从mne 我们知道源定位的形式有下面的几种,我们在此使用的是皮层约束源空间。
在这里插入图片描述
我们先对比来看,MNE的原教程先让我们设置几个文件夹的变量,并尝试设置几个路径,

MNE的教程

from mne import read_source_estimate
from mne.datasets import sample

print(__doc__)

# Paths to example data
sample_dir_raw = sample.data_path()#D:/系统数据/git仓库/MNE-Cookbook/mne_data/MNE-sample-data
sample_dir = sample_dir_raw / "MEG" / "sample"
subjects_dir = sample_dir_raw / "subjects"

fname_stc = sample_dir / "sample_audvis-meg"

在这里插入图片描述
可以看到我的simple的文件夹是下面的

simple_dir是D:\系统数据\git仓库\MNE-Cookbook\mne_data\MNE-sample-data\MEG\sample
里面存在很多.fif.stc后缀类似的文件。

subjects_dir是D:\系统数据\git仓库\MNE-Cookbook\mne_data\MNE-sample-data\subjects
在这里插入图片描述
fname_stc 这个直接使用了成人的meg的这个文件。

看到很多文件是不是有些不明所以。
事实上,我们需要的文件只有fif后缀的一个和stc这个文件。

mne-Load and inspect example data

加载和检查数据。
通过read_source_estimate来进行这个stc的读取。

stc = read_source_estimate(fname_stc, subject="sample")

# Define plotting parameters
surfer_kwargs = dict(
    hemi="lh",
    subjects_dir=subjects_dir,
    clim=dict(kind="value", lims=[8, 12, 15]),
    views="lateral",
    initial_time=0.09,
    time_unit="s",
    size=(800, 800),
    smoothing_steps=5,
)

# Plot surface
brain = stc.plot(**surfer_kwargs)

# Add title
brain.add_text(0.1, 0.9, "SourceEstimate", "title", font_size=16)

从文件加载源空间时间序列数据(SourceEstimate 对象)。

设置了网格参数和绘图的方式。

2. 定义绘图参数字典
surfer_kwargs = dict(
    hemi="lh",
    subjects_dir=subjects_dir,
    clim=dict(kind="value", lims=[8, 12, 15]),
    views="lateral",
    initial_time=0.09,
    time_unit="s",
    size=(800, 800),
    smoothing_steps=5,
)
  • 核心参数解析
    • hemi="lh":指定绘制左半球 ('lh'/'rh'/'both')
    • subjects_dir:FreeSurfer 被试目录的路径(包含各被试的皮层表面数据)
    • clim:颜色范围控制
      • kind="value":直接指定数值范围
      • lims=[8, 12, 15]:颜色渐变的分界点(min, mid, max)
    • views="lateral":视角(其他选项:'medial', 'ventral', 'frontal' 等)
    • initial_time=0.09:初始显示的时间点(单位由 time_unit 决定)
    • time_unit="s":时间单位(秒,也支持 'ms'
    • size=(800, 800):图像画布尺寸(宽度, 高度)
    • smoothing_steps=5:表面平滑的迭代次数(值越大表面越平滑)

3. 绘制源估计图
brain = stc.plot(**surfer_kwargs)
  • 作用:生成交互式 3D 脑图对象 (mne.viz.Brain)
  • 返回的 brain 对象可用于后续交互操作(如添加标记、调整视角等)

4. 添加标题
brain.add_text(0.1, 0.9, "SourceEstimate", "title", font_size=16)
  • 参数解析
    • 0.1:水平位置(0=左,1=右)
    • 0.9:垂直位置(0=底部,1=顶部)
    • "SourceEstimate":显示的文本内容
    • "title":文本标识符(可自定义)
    • font_size=16:字体大小
关键功能总结
  1. 数据加载:从 STC 文件加载源激活时空数据
  2. 可视化配置:通过参数字典精细控制脑图的显示方式(颜色、视角、时间点等)
  3. 交互式显示:生成可旋转、缩放、浏览时间序列的 3D 脑图
  4. 标注增强:在图像上添加自定义文本标注

我们运行,可以得到下面的结果,stc就是包含了溯源后的数据的东西。

那么我们如何计算自己的数据的stc。
在这里插入图片描述

源估计

源估计包含由源空间定义的空间位置上的激活时间序列。在 FreeSurfer 表面(由 3D 三角剖分组成)的背景下,我们可以将膨胀大脑表示上的每个数据点称为顶点。如果每个顶点代表一个时间序列的空间位置,则可以将时间序列和空间位置写入一个矩阵,其中每个顶点(行)在多个时间点(列)可以分配一个值。这个值是我们在给定时空点的信号强度。正是这个矩阵存储在 stc.data 中。

博客园

下面给出博客里面的如何获得源数据的过程。
我们需要使用上面的这个模版

\mne_data\MNE-fsaverage-data\fsaverage

如果没有这个,在运行了一次之后,应该会下载到对应的文件夹。
在博客的原文中,使用的是ico-5的溯源方式,因为无法运行,进行了下采样。
fsaverage是FreeSurfer的标准模板大脑,常用于脑成像研究中的标准化空间。

import mne
import os.path as op
from mne.datasets import fetch_fsaverage

# 获取 fsaverage 路径
fs_dir = fetch_fsaverage(verbose=True)
subjects_dir = op.dirname(fs_dir)
subject = "fsaverage"
trans = "fsaverage"

src = op.join(fs_dir, "bem", "fsaverage-ico-4-src.fif")
bem = op.join(fs_dir, "bem", "fsaverage-5120-5120-5120-bem-sol.fif")

# 生成 ico-4 源空间(2562 源点,相比 ico-5 更轻量)
src = mne.setup_source_space(subject, spacing="ico4", subjects_dir=subjects_dir, add_dist=False)
mne.write_source_spaces(op.join(fs_dir, "bem", "fsaverage-ico-4-src.fif"), src, overwrite=True)

# 如果需要更低分辨率的 ico-3
src = mne.setup_source_space(subject, spacing="ico3", subjects_dir=subjects_dir, add_dist=False)
mne.write_source_spaces(op.join(fs_dir, "bem", "fsaverage-ico-3-src.fif"), src, overwrite=True)

第一个文件fsaverage-ico-4-src.fif中的“src”可能代表“source space”,即源空间。源空间定义了大脑中可能产生信号的源的位置,通常是皮层表面。ico-4可能指的是四阶的Icosahedron(二十面体)细分,用于生成源空间的网格。Ico-4的细分级别决定了源的数量,细分级别越高,源点越多,计算量也越大。用户可能需要这个文件来进行源定位分析,比如计算逆解。

第二个文件fsaverage-5120-5120-5120-bem-sol.fif中的“bem”代表边界元模型(Boundary Element Model),用于正向计算中的电磁场模拟。BEM模型需要不同组织的边界,如头皮、颅骨、脑脊液和大脑等。文件名中的5120可能指的是每个边界面(如头皮、颅骨、大脑)的三角形数量,例如5120个三角形。而“sol”可能表示解文件,即已经计算好的BEM模型的解,用于快速计算导联场或正向解。用户在进行EEG/MEG的正向计算时会用到这个文件。

读取自己的数据

此处我读取的是eeglab处理过后的数据。

pathdir=r"E:\data\301数据汇总\EEG\jxt_analysis\health\1"
file=r"processed_data.set"
path=os.path.join(pathdir, file)
raw_data = mne.io.read_raw_eeglab(path, preload=True)

#降低采样率和设置重参考,这个是必要的
raw = raw_data.copy()
raw = raw.resample(sfreq=100, verbose=True)
raw.set_eeg_reference(projection=True)

需要自己的通道文件,读取的src文件就可以绘制这个标准的溯源点的图。

mne.viz.plot_alignment(
    raw.info,
    src=src,
    eeg=["original", "projected"],
    trans=trans,
    show_axes=True,
    mri_fiducials=True,
    dig="fiducials",
)

在这里插入图片描述

进行fwd的计算(前向模型)

前向模型用于模拟大脑(源)的电活动如何被传感器(如脑电图电极)测量。这很有道理,因为在脑电图分析中,你需要一个将源活动与传感器读数连接起来的模型。
mindist=5.0 内颅骨到源的最小距离

fwd = mne.make_forward_solution(
    raw.info, trans=trans, src=src, bem=bem, eeg=True, mindist=5.0, n_jobs=None
)
print(fwd)

查看fwd的键值

print(fwd.keys()) 

dict_keys([‘sol’, ‘source_ori’, ‘nsource’, ‘coord_frame’, ‘sol_grad’,
‘nchan’, ‘_orig_source_ori’, ‘_orig_sol’, ‘_orig_sol_grad’, ‘info’,
‘src’, ‘source_nn’, ‘source_rr’, ‘surf_ori’, ‘mri_head_t’])

看一下就可以,还没有都使用。

核心参数

  1. sol (正向解矩阵)

    • 核心的增益矩阵(n_channels × n_sources),表示每个源点活动对传感器信号的贡献权重。
    • source_ori 为自由方向(free orientation),每个源点对应 3 列(x/y/z 方向)。
  2. source_ori (源方向约束)

    • 表示源方向的约束方式:
      • 'fixed':固定方向(如皮层表面法线方向)
      • 'free':自由方向(允许任意方向,需后续逆解方法支持)
  3. nsource (源总数)

    • 源空间中的离散化源点数量(若 source_ori='free',实际自由度可能为 3 × nsource)。
  4. coord_frame (坐标系)

    • 源点坐标的参考系,通常为 'head'(头部坐标系)或 'mri'(MRI 坐标系)。
  5. sol_grad (解的梯度矩阵)

    • 用于计算磁场梯度(MEG 中的导数场),形状类似 sol,但对应磁场梯度。

辅助参数

  1. nchan (通道数)

    • EEG/MEG 传感器的数量,与 sol 的行数一致。
  2. _orig_source_ori, _orig_sol, _orig_sol_grad

    • 原始未修改的源方向和解矩阵(某些操作会覆盖原值,此参数用于备份)。
  3. info (测量信息)

    • 仿照 MNE 的 Info 对象,包含传感器配置、滤波信息、坐标变换等元数据。

源空间相关

  1. src (源空间对象)

    • 包含源点位置 (src[0]['rr'])、三角剖分 (src[0]['tris'])、层信息等详细结构。
  2. source_rr (源点坐标)

    • 所有源点的三维坐标(形状:(nsource, 3)),单位为米。
  3. source_nn (源点法线方向)

    • 每个源点的法线方向向量(形状:(nsource, 3)),仅在 source_ori='fixed' 时有效。
  4. surf_ori (表面法线方向标记)

    • 布尔值,表示源方向是否基于表面法线(通常为 True)。

坐标变换

  1. mri_head_t (MRI 到头部坐标变换)
    • 将 MRI 坐标系中的源点转换到头部坐标系的仿射变换矩阵(4×4)。

使用场景

  • EEG/MEG 逆问题fwd['sol'] 是源活动到传感器信号的线性映射,用于构建逆算子(如 LCMV/dSPM)。
  • 源方向约束:通过 source_orisource_nn 实现固定方向约束,减少计算复杂度。
  • 坐标对齐mri_head_t 确保源空间与头部坐标系对齐,是多模态数据融合的关键。

建议通过 print(fwd) 直接查看前向模型的摘要信息,或使用 mne.forward.forward.Forward 类的文档进一步探索。

print(fwd['nsource'])  # 源点数
print(fwd['nchan'])    # 传感器通道数
print(fwd['sol'])      # 解析解
print(fwd['source_rr'])  # 源空间的顶点坐标
print(fwd['source_ori']) # 源的方向

协方差矩阵和逆向估计的计算

因为需要噪声源模型,所以对于erp可能使用动作基线的部分,来更好的屏蔽噪声和凸显主要数据。对于静息态,应该使用比较暗

计算噪声协方差、逆向因子,并应用逆向因子。此处使用的方法为dSPM。根据官方教程可更换为其他的逆向求解算法。

此处的raw使用的是静息态的脑电数据,并且未进行筛选,正常的应该尽量截取无噪声污染的片段。

noise_cov = mne.compute_raw_covariance(raw)
#逆向因子
inverse_operator = make_inverse_operator(
    raw.info, fwd, noise_cov, loose=0.0, depth=0.8
)
#删去fwd
del fwd

# 逆向因子应用
from mne.minimum_norm import apply_inverse_raw
#使用dSPM的方法,下面再尝试其他的方法。
method = "dSPM"
snr = 3.0
lambda2 = 1.0 / snr**2
stc = apply_inverse_raw(
    raw,
    inverse_operator,
    lambda2,
    method=method,
    pick_ori=None,
    verbose=True,
)

通过这几个短短的代码,就可以得到stc这个源估计了。

使用提供的函数进行可视化
这些参数和可视化的界面的参数差不多。

initial_time = 0.1
brain = stc.plot(
#查看了一些内部实现,好像两个参数没什么用,默认参数是none
    #subjects_dir=subjects_dir,
    #subject=subject,
    initial_time=initial_time,
    smoothing_steps=7,
    hemi='both'#确定是左脑还是右脑,或者更多的选择
)

这个annotation读取的也不是这两个文件夹中的内容。
在这里插入图片描述
说明,中间这几个步骤可以按照博客园的过程。
如果运行过程出现数组过大,就可以尝试我上述的步骤,对ico这个源定位估计的点进行减少,同时,对于脑电的时间长度和采样点,可以进行减少。

这个图可以看到不少东西,但是我们如何取得这个数据并进一步进行分析。
在这里插入图片描述

对于stc的保存和读取

from mne import SourceEstimate
stc.save('1.stc')

#会分别保存左脑和右脑的数据

在这里插入图片描述

loaded_stc = mne.read_source_estimate('1.stc-lh.stc')

stc结构分析(MNE文档)

MNE中有讲述
与源空间(src)的关系
我们先得到src,在fwd中,我们可以访问到src。
fwd['src']
src 承载着从 stc 到表面的映射。表面由每个半球的三角网格构建而成。构成一个面的三角形由 3 个顶点组成。由于 src 是两个源空间(左半球和右半球)的列表,我们可以通过首先选择源空间来访问相应数据。构建左半球的表面可以通过 src[0]['tris'] 访问,其中索引 0 代表左半球,1 代表右半球。
src[0][‘tris’]中的值指的是 src[0]['rr'] 中的行索引。在这里,我们找到了表面网格的实际坐标。因此,每个顶点的索引值都会从这里选择一个坐标。此外, src[0]['vertno'] 存储的数据与 stc.lh_vertno 相同,但在使用如 mne.inverse_sparse.mixed_norm() 这样的稀疏求解器时除外,因为那时只有一部分顶点具有非零激活。
在这里插入图片描述
使用的是高密度源空间,有163842

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
hemi_idx=0
# 获取顶点坐标
vertices = fwd['src'][hemi_idx]['rr']

# 获取三角形索引 (每个三角形由3个顶点索引定义)
triangles = fwd['src'][hemi_idx]['tris']
fig = plt.figure(figsize=(10, 8))
alpha=0.3
ax = fig.add_subplot(111, projection='3d')
mesh = Poly3DCollection([vertices[triangle] for triangle in triangles],
                        alpha=alpha, linewidths=0.1, edgecolor='k')
# 设置颜色 (可以根据半球不同设置不同颜色)
face_color = [0.5, 0.5, 1.0] 
# if hemi == 'lh' else [1.0, 0.5, 0.5]
mesh.set_facecolor(face_color)

# 添加到图形中
ax.add_collection3d(mesh)    
# 设置轴的范围
coords_min = vertices.min(axis=0)
coords_max = vertices.max(axis=0)
ax.set_xlim(coords_min[0], coords_max[0])
ax.set_ylim(coords_min[1], coords_max[1])
ax.set_zlim(coords_min[2], coords_max[2])

# 设置轴标签
ax.set_xlabel('X (m)')
ax.set_ylabel('Y (m)')
ax.set_zlabel('Z (m)')               
# plt.ion()
plt.show()   

在这里插入图片描述
绘制出的上三角坐标的脑模型。

mesh = Poly3DCollection([vertices[triangle] for triangle in triangles],
alpha=alpha, linewidths=0.1, edgecolor=‘k’)
tris是坐标的索引,rr是坐标点位置。可以组合为一个三角形的三点定位。

STC的可视化

主要参考这个 可视化源定位stc

我们可以使用 stc.plot 来绘制源估计,就像在其他 MNE 对象中一样。请注意,为了使这种可视化工作,您必须在您的机器上安装 PyVista

和之前的可视化一样

initial_time = 0.1
brain = stc.plot(
    subjects_dir=subjects_dir,
    subject=subject,
    initial_time=initial_time,
    clim=dict(kind="value", lims=[3, 6, 9]),
    smoothing_steps=7,
)

在这里插入图片描述

initial_time = 0.1
stc_fs = mne.compute_source_morph(
    stc, "fsaverage", "fsaverage", subjects_dir, smooth=5, verbose="error"
).apply(stc)
brain = stc_fs.plot(
    subjects_dir=subjects_dir,
    initial_time=initial_time,
    clim=dict(kind="value", lims=[3, 6, 9]),
    surface="flat",
    hemi="both",
    size=(1000, 500),
    smoothing_steps=5,
    time_viewer=False,
    add_data_kwargs=dict(colorbar_kwargs=dict(label_font_size=10)),
)

# to help orient us, let's add a parcellation (red=auditory, green=motor,
# blue=visual)
brain.add_annotation("HCPMMP1_combined", borders=2)

# You can save a movie like the one on our documentation website with:
brain.save_movie(time_dilation=20, tmin=0.1, tmax=1.5,
                 interpolation='linear', framerate=50)

在这里插入图片描述
会生成一个动画,此过程占用内存也比较大。

先记录到这,更多的可视化方法参见教程。

选择ROI

import mne
from mne.datasets import sample
import os.path as op
from mne.datasets import fetch_fsaverage

fs_dir = fetch_fsaverage(verbose=True)
print(fs_dir)
subjects_dir = op.dirname(fs_dir)
subject = "fsaverage"

# 示例:加载视觉皮层(V1)的标签
labels = mne.read_labels_from_annot('fsaverage',  # 使用fsaverage模板
                                    parc='aparc',  # 解剖学分区
                                    subjects_dir=subjects_dir)  # FreeSurfer数据路径


v1_label = [label for label in labels if label.name == 'temporalpole-lh'][0]


# 可视化ROI
brain = stc.plot(subject='fsaverage', subjects_dir=subjects_dir)
brain.add_label(v1_label, color='red', alpha=0.5)

对区域进行标注

这是代码的最后部分,我们可以看到对应的区域被标记为粉色、

brain = stc.plot(subject='fsaverage', subjects_dir=subjects_dir)
brain.add_label(v1_label, color='pink', alpha=1)

在这里插入图片描述

modes = ['mean', 'mean_flip', 'pca_flip', 'max', 'median']
roi_data = stc.extract_label_time_course(
    v1_label, 
    fwd['src'],  # 源空间顶点索引(需与STC一致)
    mode='mean',    # 提取模式:取平均值
    allow_empty=True  # 允许空标签(无顶点时返回NaN)
)

print("ROI数据形状:", roi_data.shape) 
#Extracting time courses for 1 labels (mode: mean)
#ROI数据形状: (1, 30051)
 
#这个可以查看一下有什么区域
for label in labels:
    print(label.name)

bankssts-lh bankssts-rh caudalanteriorcingulate-lh
caudalanteriorcingulate-rh caudalmiddlefrontal-lh
caudalmiddlefrontal-rh cuneus-lh cuneus-rh entorhinal-lh entorhinal-rh
frontalpole-lh frontalpole-rh fusiform-lh fusiform-rh
inferiorparietal-lh inferiorparietal-rh inferiortemporal-lh
inferiortemporal-rh insula-lh insula-rh isthmuscingulate-lh
isthmuscingulate-rh lateraloccipital-lh lateraloccipital-rh
lateralorbitofrontal-lh

在 MNE-Python 的 extract_label_time_course 函数中,mode 参数决定了如何将标签(ROI)内的源活动数据整合为一个时间序列。以下是所有可用的 mode 选项及其作用的详细说明:


可用的 mode 形式

1. "mean"
  • 作用:对标签内所有顶点的源活动取平均值
  • 适用场景:简单快速的整合,适合初步分析。
  • 数学表达
    time_course ( t ) = 1 N ∑ i = 1 N source_activity i ( t ) \text{time\_course}(t) = \frac{1}{N} \sum_{i=1}^{N} \text{source\_activity}_i(t) time_course(t)=N1i=1Nsource_activityi(t)
    其中 (N) 是标签内的顶点数。
2. "mean_flip"
  • 作用:取平均值,但翻转极性以消除体积传导(volume conduction)的影响。
  • 适用场景:EEG/MEG 溯源时,减少邻近区域的干扰。
  • 原理
    计算平均值后,根据标签的法向量方向翻转极性,确保信号方向一致。
3. "pca_flip"
  • 作用:使用主成分分析(PCA)提取标签内源活动的第一主成分,并翻转极性。
  • 适用场景:标签内顶点活动高度相关(如皮层褶皱区域),需降维后提取主要信号。
  • 优势:比 "mean" 更鲁棒,尤其在高噪声或高相关性数据中。
4. "max"
  • 作用:取标签内顶点的最大值
  • 适用场景:关注标签内最强的活动响应(如癫痫发作的高激活区域)。
5. "median"
  • 作用:取标签内顶点的中位数
  • 适用场景:对异常值不敏感,适合非正态分布的数据。
6. "auto"
  • 作用:自动选择模式(默认为 "mean")。
  • 适用场景:无需手动选择时,快速调用。
7. "vote"
  • 作用:对二进制活动(如事件相关同步/去同步)进行投票,统计激活顶点的比例。
  • 适用场景:分类或二元活动分析(如静息态 vs 活动态)。

模式选择建议

模式适用情况优缺点
"mean"简单平均,无需复杂处理。快速但可能受体积传导影响。
"mean_flip"EEG/MEG 溯源,需消除体积传导误差。减少干扰,但假设法向量方向一致。
"pca_flip"高相关性顶点,需降维。更鲁棒,但计算量稍大。
"max"关注峰值活动(如癫痫、强刺激响应)。可能对噪声敏感。
"median"非正态分布数据或存在异常值。抵抗异常值,但信息量较少。

简单查看一下选择的分区平均激活和抑制的强度的数据

截取了前500s。

import matplotlib.pyplot as plt
positive_times = np.where(roi_data[0][1:500] > 0)[0]
plt.plot(positive_times, roi_data[0][1:500][positive_times], 'ro')
plt.xlabel('Time (samples)')
plt.ylabel('Amplitude')
plt.title('Positive Activation Times')
plt.show()

在这里插入图片描述
在这里插入图片描述

完成了第一部分,溯源,加上roi区域的标记(按照默认功能区的)和这个数据的获取。
之后再进行额外的记录。


http://www.kler.cn/a/585308.html

相关文章:

  • ChatGPT、DeepSeek、Grok 三者对比:AI 语言模型的博弈与未来
  • RTSP/Onvif视频安防监控平台EasyNVR调用接口返回匿名用户名和密码的原因排查
  • Linux内核实时机制19 - RT调度器3 - 实时任务出入队
  • 【vLLM 学习】使用 TPU 安装
  • C++11 编译使用 aws-cpp-sdk
  • HTTP相关问题(AI回答)
  • 前端开发中的设计模式:装饰器模式的应用与实践
  • IDEA 一键完成:打包 + 推送 + 部署docker镜像
  • Python区块链应用开发从入门到精通
  • 深入理解 Python 中的进程池
  • leetcode203.移除链表元素
  • android 新闻客户端和springboot后台开发(一)
  • vue2:el-table列中文字前面加icon图标的两种方式
  • vue uniapp里照片多张照片展示
  • 论文阅读笔记——LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
  • 【RISCV LAB】0x01-安装实验仿真辅助工具
  • AI建模智能生成:从2D到3D,AI只需一步!
  • 结构型模式之适配器模式:让不兼容的接口兼容
  • 工业数采适配99%协议EG8200Mini 边缘计算网关
  • 【零基础入门unity游戏开发——unity3D篇】3D物理系统之 —— 碰撞检测和触发器检测的特殊生命周期函数