基于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.mfbz.cn/a/745176.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

宝兰德受邀出席华为开发者大会2024,携手共绘基础软件新篇章

6月21日-23日&#xff0c;华为开发者大会&#xff08;HDC 2024&#xff09;在东莞松山湖举行&#xff0c;作为全球开发者的年度盛会&#xff0c;本次大会汇聚了众多业界精英与前沿技术。华为分享了HarmonyOS、盘古大模型、昇腾AI云服务、GaussDB数据库、自研仓颉编程语言等最新…

一年Java转GO|19K|腾讯 CSIG 一二面经

面经哥只做互联网社招面试经历分享&#xff0c;关注我&#xff0c;每日推送精选面经&#xff0c;面试前&#xff0c;先找面经哥 背景 学历&#xff1a;本科工作经验&#xff1a;一年(不算实习)当前语言&#xff1a;Javabase&#xff1a;武汉部门\岗位&#xff1a;腾讯云‍ 一…

pdf压缩,pdf压缩在线,pdf文件太大怎么变小

在数字化时代&#xff0c;PDF文档因其跨平台、保持原样、易于阅读和打印等特点&#xff0c;成为了我们日常工作和生活中不可或缺的一部分。然而&#xff0c;随着PDF文件的不断累积&#xff0c;存储空间逐渐变得紧张&#xff0c;特别是在处理大量大型PDF文件时&#xff0c;如何有…

深圳大学 软件测试作业 #2

声明&#xff1a;本人上课摆烂选手&#xff0c;稍微听了下&#xff0c;答案仅供参考。 ———————— 1. 考虑下面这个代码&#xff0c;并回答以下的问题。 (a) 请画出上面代码的控制流程图。(20分) (b) 请画出上面代码的数据流程图。(10分) (c) 找出每个变量的定义使…

说点智驾领域的实话!感知|定位|规划控制|就业……

你们有没有一种感觉&#xff0c;近几年自动驾驶技术栈迭代太快&#xff0c;自己稍不留神就与当下主流技术产生脱节了。 其实说实话&#xff0c;并非只有你如此&#xff0c;行业内的工程师都有类似感受。 智能驾驶行业交流群&#xff1a;点击进 分享几个我们最近聊天中的几位朋…

低代码平台如何重塑项目管理:效率与创新的新边界

引言 随着数字化转型的加速和技术创新的推动&#xff0c;低代码开发平台在近年来逐渐崭露头角&#xff0c;成为企业和组织加速应用开发和创新的重要工具。低代码平台通过提供可视化的开发环境和预构建的组件&#xff0c;极大地简化了应用程序的开发过程&#xff0c;使非专业开发…

Vmvare12安装CentOS7.6

Vmvare12安装 注意事项 安装完成以后有这两个虚拟网卡。 CentOS官网镜像地址 https://www.centos.org/download/mirrors/Vmvare安装CentOS7.6 创建虚拟机 安装CentOS7.6 选择桌面版 磁盘分区 上述是确认使用自动分区。 设置密码 设置license information 欢迎页面 CentOS7…

windows 安装 Kubernetes(k8s)

windows 安装 docker 详情见&#xff1a; https://blog.csdn.net/sinat_32502451/article/details/133026301 minikube Minikube 是一种轻量级的Kubernetes 实现&#xff0c;可在本地计算机上创建VM 并部署仅包含一个节点的简单集群。 下载地址&#xff1a;https://github.…

每日一题——Python实现PAT乙级1030 完美数列(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 初次尝试 再次尝试 代码结构 时间复杂度分析 空间复杂度分析 总结 我要更强 时…

《互联网政务应用安全管理规定》深度解读

《互联网政务应用安全管理规定》的出台&#xff0c;对互联网政务应用的安全提出了一系列具体要求。 2024年5月15日&#xff0c;中央网信办、中央编办、工业和信息化部、公安部等四部门联合公布《互联网政务应用安全管理规定》&#xff08;以下称《规定》&#xff09;&#xff…

手机pdf删除怎么办?只需要2招,就可以快速恢复耶

PDF文件&#xff0c;这个我们日常生活中的常客&#xff0c;越来越受到大家的喜爱。但是&#xff0c;有时候我们会因为一时的疏忽或者清理手机内存而不小心删掉了重要的PDF文件&#xff0c;这可真是让人头疼啊&#xff01;那么&#xff0c;这些pdf删除后&#xff0c;有没有什么好…

一年半测试|17K|商汤科技4轮面经

面经哥只做互联网社招面试经历分享&#xff0c;关注我&#xff0c;每日推送精选面经&#xff0c;面试前&#xff0c;先找面经哥 背景‍‍ 楼主本科&#xff0c;大概一年半工作经验。 之前工作也是测试岗&#xff0c;离职了三个多月再次刷题面试&#xff0c;大概花了一个月准备…

Java露营基地预约小程序预约下单系统源码

轻松开启户外探险之旅 &#x1f31f; 露营热潮来袭&#xff0c;你准备好了吗&#xff1f; 随着人们对户外生活的热爱日益增加&#xff0c;露营已成为许多人周末和假期的首选活动。但你是否曾因找不到合适的露营基地而烦恼&#xff1f;或是因为繁琐的预约流程而错失心仪的营地…

OElove 婚恋系统 v10.2升级真是及时,你们是不是UI团队换了?不得不说这次UI是真美!当然功能也升级了大大的赞!

怎么说呢&#xff0c;成为OE的老用户已经有五年了&#xff0c;当时买的初衷就是在本地做一个响当当的门户但是因为疫情搁浅了。。。实在是入不敷出&#xff01;转行的这几年又看好了婚恋这个行业于是打算冲头再来&#xff0c;我记得我当时还是8.5&#xff0c;功能比较强大就是太…

联邦学习——学习笔记2:联邦学习×资源受限下的自适应本地迭代次数

文章目录 一、符号二、应用场景三、与FedAvg算法区别 本笔记参考自b站up主&#xff1a;丸一口 论文参考自Adaptive Federated Learning in Resource Constrained Edge Computing Systems 原视频链接 一、符号 原文的符号解释如下图绿色字体所注 二、应用场景 就是在资源小…

数据结构历年考研真题对应知识点(栈)

目录 3.1栈 3.1.1栈的基本概念 【栈的特点&#xff08;2017&#xff09;】 【入栈序列和出栈序列之间的关系(2022)】 【特定条件下的出栈序列分析(2010、2011、2013、2018、2020)】 3.1.2栈的顺序存储结构 【出/入栈操作的模拟(2009)】 3.1栈 3.1.1栈的基本概念 【栈…

视觉与运动控制6

基于驱动器的控制功能 驱动器的系统性能和运算能力有限需要单独的运动控制器。 V/F恒压频比控制 开环控制方法&#xff0c;应用最广泛、最简单&#xff0c;只需要电机数据即可。适用于控制精度和动态响应要求不高的应用。控制原理&#xff1a;保持点击内磁通量恒定&#xff…

Rocketmq在单节点情况下新增从节点

Rocketmq在单节点情况下新增从节点 在docker-compose部署rocketmq单节点的基础上&#xff0c;新增一个从节点 一&#xff0c;修改docker-compose配置文件 原docker-compose文件 version: 3.5 services:rmqnamesrv:image: foxiswho/rocketmq:server-4.5.2container_name: rm…

CST软件中滤波器中外部耦合偏小怎么办

在电磁仿真领域&#xff0c;CST Studio Suite&#xff08;CST 工作室套装&#xff09;软件以其强大的功能和易用性而广受工程师和科研人员的青睐。然而&#xff0c;在使用CST软件进行滤波器设计时&#xff0c;有时会遇到外部耦合偏小的问题&#xff0c;这可能导致滤波器的性能不…

已解决java.security.GeneralSecurityException: 安全性相关的通用异常的正确解决方法,亲测有效!!!

已解决java.security.GeneralSecurityException: 安全性相关的通用异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 确定具体异常类型 检查输入参数 验证算法支持性 调整安全策略 确保资源可…