基于Python/MNE处理fnirs数据

news2024/12/27 0:59:58

功能性近红外光谱技术在脑科学领域被广泛应用,市面上也已经有了许多基于MATLAB的优秀工具包及相关教程,如:homer、nirs_spm等。而本次教程将基于Python的MNE库对fNIRS数据进行处理

本次教程基于:https://mne.tools/stable/auto_tutorials/preprocessing/70_fnirs_processing.html

教程所用代码、数据可通过链接下载,也可在茗创科技公众号后台回复关键词:MNE-FNIRS获取本次教程所用的工具、代码、数据。

课前准备

Anaconda下载安装(windows,64位系统)

主链接:https://repo.anaconda.com/archive/Anaconda3-2021.11-Windows-x86_64.exe

备用链接(该链接下载限速1000kb/s,仅在主链接无法访问时使用):

http://1.14.108.54:8888/#s/7t2FaqPA

请按照默认选项安装,需要注意:

一定要勾选以下选项:

(如果忘记勾选,卸载软件后重新安装即可)

安装完毕后在开始菜单(左下角的windows图表

)找到

,两个都可以顺利打开证明安装成功。

打开Spyder

代码讲解实操

对于有Python基础的同学此步并不复杂,但此次课程面向零基础小白,将会逐步运行代码及讲解代码含义。

(1)载入软件库及fnirs数据

运行此次脚本前应加载好所需模块。

import numpy as np

如运行以上语句,左下角提示无某模块时(类似下图),

则通过anaconda powershell prompt载入相应模块。

可通过conda或pip或wheel语句载入模块。

成功后再运行代码无报错提示。

如果你先前未下载示例数据,可通过代码下载,运行代码:

fnirs_data_folder = mne.datasets.fnirs_motor.data_path()

右下角Python控制台将出现一个进度条下载数据,如下图为下载完成:

如果没有成功下载,出现提示某某路径下不存在mne_data文件夹,则在相应路径(一般是在C盘相应用户文件夹下)创建mne_data文件夹即可。此时打开:

Python提示路径下mne_data文件夹,将会看到本次脚本所用示例数据。

运行此段落剩下三句,将会指定数据所在路径、读取数据、载入数据。

fnirs_cw_amplitude_dir = fnirs_data_folder / 'Participant-1'

右上角变量区将会出现相应变量,如下图所示。

如果已经下载好数据,想通过路径读取,或者想读取自己的fnirs数据,可参考链接:https://mne.tools/stable/auto_tutorials/io/30_reading_fnirs_data.html

如果读取NIRX数据,则使用函数:

mne.io.read_raw_nirx(fname,saturated='annotate', preload=False, verbose=None)

如果读取Hitachi日立设备数据,则使用函数:

mne.io.read_raw_hitachi(fname,preload=False, verbose=None)

如果读取SNIRF (.snirf)数据(注:.nirs格式数据可通过homer3转换成.snirf格式数据),则使用函数:

mne.io.read_raw_snirf(fname,optode_frame='unknown', preload=False, verbose=None)

fname为数据所在路径,因此上述读取数据的代码可改为(数据所在路径应根据自身情况修改):

raw_intensity=mne.io.read_raw_nirx('C:/Users/Administrator.DESKTOP-J86OEI2/mne_data/MNE-fNIRS-motor-data/Participant-1',saturated = 'annotate' , preload = False , verbose = None)

运行后右上角同样出现变量

(2)指定duration,及修改mark

首先解释一下本次示例数据的实验mark,数据中共有四个mark,其中15.0为实验开始/结束mark,1.0为控制条件mark,2.0为Tapping/左侧条件mark,3.0为Tapping/右侧条件mark。每个刺激mark持续时间为5s。

代码中使用如下语句进行指定duration、修改mark、删除无用mark操作。

raw_intensity.annotations.set_durations(5)

运行raw_intensity.annotations.set_durations(5)语句后,数据的所有刺激持续时间都变成5秒。我们可以在变量区打开raw_intensity-->annotations-->set_durations,查看该语句的使用方法。

当set_durations后括号内只有一个数字时,所有刺激的持续时间都将改为该数字。

如果需要将不同刺激修改成不同持续时间,则参考示例语句:{'ShortStimulus' : 3, 'LongStimulus' : 12} 。该语句意为将Mark名为'ShortStimulus'的刺激的持续时间改为3,Mark名为'LongStimulus'的刺激的持续时间改为12。

raw_intensity.annotations.rename语句作用为修改Mark名字,示例语句为将Mark名为1的Mark改名为control

unwanted = np.nonzero(raw_intensity.annotations.description == '15.0')和raw_intensity.annotations.delete(unwanted)两句为删掉Mark名为‘15’的无用Mark。在本例数据中15代表实验开始和结束,与分析无关,故舍弃。

(3)删除短通道

研究者认为短通道(光电二极管之间的距离小于1厘米)无法有效检测神经反应,因此保留其他有效通道(非短通道)。

picks = mne.pick_types(raw_intensity.info, meg=False, fnirs=True)

运行完raw_intensity.pick(picks[dists > 0.01])后点开raw_intensity的ch_name变量,可见通道数变为40,删去了距离小于1cm的16个通道。

运行以下语句,可看到被保留的通道及数据整体情况。

raw_intensity.plot(

随后将原始光强度转换为光密度。

raw_od = mne.preprocessing.nirs.optical_density(raw_intensity)

变量区增加raw_od为光密度信息。

(此图为光密度信息)

(4)SCI法评估数据质量

研究者使用使用头皮耦合指数(scalp coupling index)来量化头皮与光电器件之间的耦合质量。

(此方法参考文献为:Luca Pollonini, Cristen Olds, Homer Abaya, Heather Bortfeld, MichaelS Beauchamp, and John S Oghalai. Auditory cortex activation to natural speech and simulated cochlear implant speech measured with functional near-infrared spectroscopy. Hearing Research, 309:84–93, 2014. doi:10.1016/j.heares.2013.11.007.)

sci = mne.preprocessing.nirs.scalp_coupling_index(raw_od)

(此图为SCI可视化)

其中sci = mne.preprocessing.nirs.scalp_coupling_index(raw_od)为计算各通道的头皮耦合指数,可以点开SCI变量查看各通道的头皮耦合指数。

随后使用以下语句标记SCI指数小于0.5的通道为坏通道。

raw_od.info["bads"] = list(compress(raw_od.ch_names, sci < 0.5))

由于本次示例数据质量较高,没有通道被标记。(可自行尝试其他值)

也有文献依据SCI以一定比例去除坏通道,SCI阈值可根据需求或文献建议调整。

mne.preprocessing.nirs.scalp_coupling_index函数还可有其他参数设置,具体见网址:https://mne.tools/dev/generated/mne.preprocessing.nirs.scalp_coupling_index.html#examples-using-mne-preprocessing-nirs-scalp-coupling-index

sci = mne.preprocessing.nirs.scalp_coupling_index(raw)完整语句(默认参数设置)为:

mne.preprocessing.nirs.scalp_coupling_index(raw, l_freq=0.7, h_freq=1.5, l_trans_bandwidth=0.3, h_trans_bandwidth=0.3, verbose=False)

可根据分析需求改动l_freq、h_freq等参数计算SCI指数。

(5)数据转换并移除心率噪声(梅耶尔波)

使用修正后的比尔-朗伯定律将光密度数据转换为血红蛋白浓度。

raw_haemo = mne.preprocessing.nirs.beer_lambert_law(raw_od, ppf=0.1)

(此图为血红蛋白浓度)

注:如前面通过SCI指数标记坏通道,在此步坏通道会显示灰色,如下所示:

研究者认为近红外研究关注的血流动力学响应的频率低于0.5Hz,而1Hz左右的梅耶尔波噪声可通过低通滤波器删除,同时通过高通滤波器移除缓慢的信号漂移。

raw_haemo_unfiltered = raw_haemo.copy()

raw_haemo.filter后的滤波参数可根据分析需求改动。

出图可看到滤波效果:

可看到噪声频段显著降低。

同时右下角控制台输出FIR滤波器参数等。

(6)提取分段

提取事件相关分段:

在进行后续操作前,先对各Mark进行可视化,可通过后两句代码检查Mark数量、时间点是否有误。

检查无误后定义分段时长、拒绝标准、基线校正并提取分段。

reject_criteria = dict(hbo=80e-6)

右下角控制台将输出被拒绝分段情况。

使用以下语句,可视化被拒绝的分段。

epochs.plot_drop_log()

结合mne.Epochs具体用法可知reject_criteria = dict(hbo=80e-6)指定了当某分段内HBO信号值最大差值超过80e-6则剔除该分段。

tmin, tmax = -5, 15指定分段范围(此句为Mark前5s到Mark后15s)。

其中mne.Epochs具体用法可见链接:

https://mne.tools/stable/generated/mne.Epochs.html#mne.Epochs

可改动内部参数尝试不同标准对数据的影响。

(7)可视化分段后血氧浓度变化

检查跨分段中血氧响应的一致性。

使用以下语句,可视化实验条件(两个tapping Mark)的血氧浓度变化信息。

epochs["Tapping"].plot_image(

可通过上图观察血氧变换的峰值等。

上彩图图横坐标为时间,纵坐标为分段,可视化了血氧浓度值。

下波形图横坐标为时间,纵坐标为血氧单位,可视化了各分段的血氧浓度变化(中间黑线为均值)。

以下语句用于可视化控制(control Mark)条件数据。

epochs["Control"].plot_image(

通过以下语句,检查跨通道中血氧响应的一致性。

fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(15, 6))

可视化控制条件及实验条件下血氧响应变化,检查跨通道一致性。

(8)绘制HRF图、地形图等

使用以下语句绘制各条件下的HRF均值图,可以直观看到血氧浓度随时间的变换。

evoked_dict = {

使用以下语句绘制各通道HBO波形图及各时间节点地形图。

times = np.arange(-3.5, 13.2, 3.0)

其中times = np.arange(-3.5, 13.2, 3.0)指定画地形图从-3.5时间节点开始每隔3秒,到13.2为止,可自行改变参数绘制不同时间点地形图。

(9)对比左右手trapping条件

通过可视化左右手trapping条件地形图,对比不同时间点差异。使用以下语句分别可视化通道HBO和HRO均值地形图,出图顺序与代码语句顺序一致。

times = np.arange(4.0, 11.0, 1.0)

绘制差值图。

其中ts = 9.0语句指定绘制时间点。

(10)绘制波形图

可绘制所有通道HRF图。

点击波形可查看大图。

本文末尾特别感谢茗创科技机器学习授课李老师、核磁部分小齐老师、助教洋芋老师、编辑RR老师的帮助~助力本教程的诞生!

小伙伴们关注茗创科技,将第一时间收到精彩内容推送哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1863709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3 按钮根据屏幕宽度展示折叠按钮

文章目录 一、组件封装二、使用三、最终效果(参考)四、参考 一、组件封装 ButtonFold.vue 1、获取父组件的元素&#xff0c;根据元素创建动态插槽 2、插槽中插入父元素标签。默认效果和初始状态相同。 3、当屏幕宽度缩小时&#xff0c;部分按钮通过 dropdown 的方式展示出来&a…

APT 组织也在利用云存储进行攻击

研究人员发现&#xff0c;各类攻击者都在攻击行动中将恶意脚本、远控木马和诱饵文档等恶意文件上传到云服务器上&#xff0c;各种恶意文件组合起来完成恶意攻击。 某个攻击组织从发送钓鱼邮件到植入远控木马的过程如下所示&#xff1a; 攻击链 多个恶意文件串联起了整个攻击行…

【ai】tx2 nx: yolov4-triton-tensorrt 成功部署server

isarsoft / yolov4-triton-tensorrt运行发现插件未注册? 【ai】tx2 nx: jetson Triton Inference Server 部署YOLOv4 【ai】tx2 nx: jetson Triton Inference Server 运行YOLOv4 对main 进行了重新构建 【ai】tx2 nx :ubuntu查找NvInfer.h 路径及哪个包、查找符号【ai】tx2…

Swift开发——简单App设计

App的界面设计需要具有大量的图像并花费大量的时间,这样的应用不方便学习和交流,这里重点介绍SwiftUI界面元素的用法,通过简单App设计过程的讲解,展示图形用户界面应用程序的设计方法。 01、简单App设计 按照9.1节工程MyCh0901的创建方法,创建一个新的工程MyCh0902,此时工…

基于SSM的医药垃圾分类管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SSM的医药垃圾分类管理系统,java项目…

浅谈逻辑控制器之while控制器

浅谈逻辑控制器之while控制器 “While控制器”是一种高级控制结构&#xff0c;它允许用户基于特定条件来循环执行其下的子采样器或控制器&#xff0c;直至该条件不再满足。本文旨在详细介绍While控制器的功能、配置方法、使用场景以及实践示例&#xff0c;帮助测试工程师高效利…

龙芯CPU架构上使用向日葵远程工具

原文链接&#xff1a;龙芯CPU架构上使用向日葵远程工具 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在龙芯CPU上使用向日葵远程控制软件的文章。向日葵是一款强大的远程控制软件&#xff0c;能够帮助用户轻松地实现远程桌面访问和控制。本文将详细介绍如何在龙芯…

DevExpress WPF中文教程:Grid - 如何排序、分组、过滤数据(设计时)?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

【学习】科大睿智解读ITSS认证中咨询机构的作用

企业拥有ITSS认证这不仅将为企业开拓商机&#xff0c;提升竞争力&#xff0c;还能促使企业改进内部运维流程&#xff0c;提高服务质量&#xff0c;为客户提供更优质的IT运维支持。在ITSS认证中&#xff0c;咨询机构扮演着重要的角色&#xff0c;其主要作用包括以下几个方面&…

Apache APISIX遇到504超时的解决办法

说明&#xff1a; Apache APISIX版本&#xff1a;v3.9.0Apache APISIX Dashboard版本&#xff1a;v3.0.1 当使用Apache APISIX开源网关&#xff0c;通过接口上传或下载大文件等时&#xff0c;出现如下“504 Gateway Time-out”错误信息&#xff0c;它表示网关或代理服务器未能…

通达信擒牛亮剑出击抄底主升浪指标公式源码

通达信擒牛亮剑出击抄底主升浪指标公式源码&#xff1a; ABC1:(CLOSE-REF(CLOSE,1))/REF(CLOSE,1)*100; ABC2:IF(CLOSE>OPEN,CLOSE,OPEN); ABC3:IF(CLOSE>OPEN,OPEN,CLOSE); ABC4:LLV(ABC2,4); ABC5:HHV(ABC3,4); ABC6:ABC2>ABC4 AND ABC3<ABC4 AND ABC2>ABC5 …

emqx4.4.3关于如何取消匿名登录,添加认证用户这件事

emqx4.4.3如何取消匿名登录&#xff0c;添加认证用户 emqx版本&#xff1a;4.4.3 背景&#xff1a;使用docker搭建完emqx后&#xff0c;使用 MQTTX 连接总是超时&#xff1a; 检查Java项目 是否有接口&#xff1a;https://XXXX:80/mqtt/auth? 若有&#xff0c;则具体逻辑查询…

上海亚商投顾:沪指5连阴 工业母机概念逆势走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数今日继续调整&#xff0c;沪指午后一度跌近1%&#xff0c;随后探底回升跌幅收窄&#xff0c;创业板指…

多维度mysql性能优化手段实践

数据库优化维度有四个:硬件升级、系统配置、表结构设计、SQL语句及索引。 优化选择: 优化成本:硬件升级>系统配置>表结构设计>SQL语句及索引。 优化效果:硬件升级<系统配置<表结构设计<SQL语句及索引。 系统配置优化 保证从内存中读取数据 MySQL会在内…

鼠标与键盘交互设计

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在海龟绘图中&#xff0c;也支持与鼠标或键盘的交互操作。它提供了监听键盘按键事件、鼠标事件以及定时器等方法&#xff0c;下面分别进行介绍。 1键…

【python013】pyinstaller打包PDF提取脚本为exe工具

1.在日常工作和学习中&#xff0c;遇到类似问题处理场景&#xff0c;如pdf文件核心内容截取&#xff0c;这里将文件打包成exe可执行文件&#xff0c;实现功能简便使用。 2.欢迎点赞、关注、批评、指正&#xff0c;互三走起来&#xff0c;小手动起来&#xff01; 3.欢迎点赞、关…

视频文件太大怎么压缩?十大视频压缩软件可解决您的问题

您是否已经受够了无法上传视频文件&#xff0c;因为它们太大了&#xff1f;如果您正在积极寻找免费下载的视频压缩软件&#xff0c;下面概述了目前在线提供的 10 个功能更强大的软件。 我们建议您在决定下载之前先通读一下这个简短的介绍。我们不希望您随意点击一个选项&#…

STM32定时器篇——通用定时器的使用(定时中断,PWM输出)

一、通用定时器的类型以及应用功能&#xff1a; 通用定时器有&#xff1a;TIM2、TIM3、TIM4、TIM5&#xff0c;其总线挂载于APB1上&#xff0c;且有基本定时器的所有功能&#xff08;定时中断、主模式触发ADC&#xff09;&#xff0c;并额外具有内外时钟源选择&#xff0c;输入…

学习笔记——动态路由——RIP(Rip 基本配置)

五、Rip 基本配置 主类网络(有类&#xff0c;major-net)&#xff1a; 使用自然掩码的网段 例如&#xff1a; 12.1.1.0/24--->12.0.0.0 192.168.1.0/24--->192.168.1.0 172.16.1.0/24--->172.16.0.0 基本配置&#xff1a; 济南总局&#xff1a; IP:192.168.1.1 /…

如何提高pcdn技术的传输效率?

提高PCDN技术的传输效率是一个复杂且多层面的任务&#xff0c;涉及多个关键策略和方法的结合。以下是一些具体的建议和措施&#xff0c;有助于提升PCDN技术的传输效率&#xff1a; 一&#xff0e;优化缓存策略&#xff1a; 精准定位热点内容&#xff0c;优先将这部分内容缓存…