基于Python/MNE处理fnirs数据

功能性近红外光谱技术在脑科学领域被广泛应用,市面上也已经有了许多基于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.mzph.cn/web/34342.shtml

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

相关文章

【AI研发工具包】sklearn教程(Scikit-learn)

目录 1. 引言 2. 安装sklearn 3. 导入sklearn 4. 加载数据集 5. 数据预处理 6. 训练模型 7. 评估模型 8. 保存和加载模型 9. 自定义数据 10. 深入sklearn 11. 注意事项 1. 引言 Scikit-learn&#xff08;简称sklearn&#xff09;是Python中一个非常流行的机器学习库…

自动驾驶系统功能安全解决方案解析

电信、公用事业、运输和国防等关键基础设施服务需要定位、导航和授时&#xff08;PNT&#xff09;技术来运行。但是&#xff0c;广泛采用定位系统&#xff08;GPS&#xff09;作为PNT信息的主要会引入漏洞。 在为关键基础设施制定PNT解决方案时&#xff0c;运营商必须做出两个…

运维入门技术——监控的三个维度(非常详细)零基础收藏这一篇就够了_监控维度怎么区分

一个好的监控系统最后要做到的形态:实现Metrics、Tracing、Logging的融合。监控的三个维度也就是Metrics、Tracing、Logging。 Metrics Metrics也就是我们常说的指标。 首先它的典型特征就是可聚合(aggregatable).什么是可聚合的呢,简单讲可聚合就是一种基本单位可以在一种维…

uniapp标题水平对齐微信小程序胶囊按钮及适配

uniapp标题水平对齐微信小程序胶囊按钮及适配 状态栏高度胶囊按钮的信息计算顶部边距模板样式 标签加样式加动态计算实现效果 状态栏高度 获取系统信息里的状态栏高度 const statusBarHeight uni.getSystemInfoSync().statusBarHeight;//系统信息里的状态栏高度胶囊按钮的…

钢筋计在工程项目中的关键应用与优势

在长期工程项目中&#xff0c;如大型桥梁、高层建筑或深基坑工程中&#xff0c;钢筋是承载结构的重要组成部分。为确保工程质量和安全&#xff0c;监测与管理钢筋的状态至关重要。钢筋计作为一种先进的监测工具&#xff0c;在长期工程项目中发挥着不可替代的作用。 1. 钢筋计的…

赶紧收藏!2024 年最常见的操作系统面试题(五)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见的操作系统面试题&#xff08;四&#xff09;-CSDN博客 九、请解释什么是I/O多路复用&#xff0c;以及它如何提高性能&#xff1f; I/O多路复用是一种在计算机编程中用于处理多个输入/输出&#xff08;I/O&#xff0…

实现全球平台软件业务的快速部署

要实现全球平台软件业务的快速部署&#xff0c;可以遵循以下清晰的步骤和策略&#xff0c;这些步骤结合了参考文章中的相关信息和最佳实践&#xff1a; 1. 选择云部署策略&#xff1a; - 利用云计算平台&#xff0c;佰优联的全球节点&#xff0c;以节省前期投资和缩短应用部…

Spring Boot 学习第八天:AOP代理机制对性能的影响

1 概述 在讨论动态代理机制时&#xff0c;一个不可避免的话题是性能。无论采用JDK动态代理还是CGLIB动态代理&#xff0c;本质上都是在原有目标对象上进行了封装和转换&#xff0c;这个过程需要消耗资源和性能。而JDK和CGLIB动态代理的内部实现过程本身也存在很大差异。下面将讨…

Guacd运行一段时间后,不能创建与远程主机的连接,重启方能解决

问题表象&#xff1a; 使用guacamole搭建远程桌面访问&#xff0c;使用guacamole版本为1.5.4。连接远程主机使用rdp协议。运行过程中发现&#xff0c;各几个小时&#xff0c;guacamole连接就会断连&#xff0c;点击重新连接一直是连接不上&#xff0c;重启guacd后&#xff0c;点…

网络编程基础语法

网络编程 Java.net.*包下面提供了网络编程的解决方案 基本架构 C/S架构 Client客户端 需要程序员开发 用户需要安装 Server服务端 需要程序员开发实现 B/S架构 …

如何优化Java中的HashMap性能?

如何优化Java中的HashMap性能&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java开发中&#xff0c;HashMap是一种常用的数据结构&#xff0c…

筛斗数据:数据提取,连接现实与未来的桥梁

在当今快速发展的数字化时代&#xff0c;数据已经成为推动社会进步和科技创新的重要力量。而数据提取技术&#xff0c;作为连接现实与未来的桥梁&#xff0c;正日益展现出其独特的魅力和价值。 一、数据提取技术的核心作用 数据提取技术&#xff0c;顾名思义&#xff0c;就是…

VMware Workstation搭建Windows Server2019主备AD域控详细操作步骤

版本 虚拟机版本 VMware Workstation 16 Prp 16.2.5 build-20904516 服务器系统版本 具体操作 安装第一台虚拟机服务器 首先先创建一台Windows Server2019虚拟机&#xff0c;可以参考VMware Workstation安装Windows Server2019系统详细操作步骤-CSDN博客 克隆第一台虚拟机…

创建npm私包

参考文章&#xff1a; 使用双重身份验证访问 npm | npm 中文网 私有npm包的实例详解-js教程-PHP中文网 1.注册npm账号 npm官网&#xff1a; npm | Home 2.安装node 百度挺多的&#xff0c;安装完后&#xff0c;检查是否安装成功就行 3.写一个简单的模块 创建个文件夹&am…

echarts 折线图柱状图增加点击事件

单折线图&#xff0c;可以直接监听click事件&#xff08;只有点击到折线才会触发&#xff09; this.chart.on(click, () > {console.log(点击,.s)})但很多时候&#xff0c;我们是要求点击折线图任意位置触发点击事件 而且要注意隐藏折线的操作按钮 this.chart.getZr().on…

MySQL之复制(十一)

复制 复制的问题和解决方案 数据损坏或丢失的错误 当一个二进制日志损坏时&#xff0c;能恢复多少数据取决于损坏的类型&#xff0c;有几种比较常见的类型: 1.数据改变&#xff0c;但事件仍是有效的SQL 不幸的是&#xff0c;MySQL甚至无法察觉这种损坏。因此最好还是经常检查…

Java核心知识(一):JVM

JVM 前言 文本源自微博客 (www.microblog.store),且已获授权. 一、线程 1.1 基本概念 JVM是可运行java代码的假象计算机,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收、堆和一个存储方法域。JVM是运行在操作系统之上的&#xff0c;与硬件没有直接的交互。 1.2 运…

Stateflow快速入门系列(二):通过使用状态和转移动作来定义图行为

状态动作和转移动作是您分别在状态内部或转移上编写的指令&#xff0c;用于定义 Stateflow 图在仿真期间的行为。例如&#xff0c;下图中的动作定义了一个以试验方式验证 Collatz 猜想实例的状态机。对于给定的数值输入 &#xff0c;该图通过迭代以下规则来计算冰雹序列 &…

Android10 Settings系列(六)Settings中toolbar 的基本流程,和Activity如何关联,这可能是比较详细的分析

一、前言 写在前面:一个快捷栏,音量浮窗快捷进入设置界面,点击左上角返回键拉起设置首页问题引发的思考和解决方法 事情的起因是测试报了一个问题。在Android9的一个设备在点击音量键时,在弹出的弹框中,点击设置图标快速进入音量设置中,点击左上角返回按钮是,退出当前界…

使用宝塔安装Nginx,使用Nginx代理本地项目出现PC端使用移动端样式导致页面错乱

使用宝塔安装Nginx&#xff0c;使用Nginx代理本地项目出现PC端使用移动端样式导致页面错乱 解决方案 把 /www/server/nginx/conf/proxy.conf 里的 proxy_cache cache_one; 注释掉 proxy_temp_path /www/server/nginx/proxy_temp_dir; proxy_cache_path /www/server/nginx/pro…