• Python-EEG工具库MNE中文教程(8)-参考电极简介


    @

    本教程为脑机学习者Rose原创(转载请联系作者授权)发表于公众号:脑机接口社区(微信号:Brain_Computer).QQ交流群:903290195

    参考电极简介

    安置在头皮上的电极为作用电极(active electrode)。放置在身体相对零电位点的电极即为参考电极(reference electrode),也称为参考电极或标准电极。
    记录到的脑电信号即是作用电极与参考电极的差值(电位差)。

    更多详细的参考电极简介,请查看MNE-Python参考电极

    设置脑电图参考

    本教程描述了如何在MNE-Python中设置或更改EEG参考。

    set_eeg_reference(self, 
                      ref_channels='average',
                      projection=False, 
                      ch_type='auto', 
                      verbose=None)
    指定用于EEG信号的参考。
    
    参数
    ref_channels: list of str | str
    用于构造参考的通道名称。如果要应用平均参考,就在此处指定"average"(默认情况就是使用average)。
    如果指定了空列表,则表示您已假定该数据已经具有正确的引用,并且MNE将不会尝试对该数据进行任何重新参考。
    默认为平均参考。
    
    projection:bool
    如果ref_channels ='average',则此参数指定是否应将平均参考计算为projection(True)或不作为projection(False;默认)。
    如果projection = True,则将平均参考作为projection添加,并且不应用于数据(后面可以使用apply_proj方法应用)。
    如果projection = False,则将平均参考直接应用于数据。
    如果ref_channels不是'average',则projection必须设置为False。
    默认情况为False.
    
    ch_type:'auto' | 'eeg' | 'ecog' | 'seeg'
    要应用参考的通道类型的名称。如果选择'auto',则会选择(按此顺序)找到的第一个eeg,egg或seeg的通道类型。
    
    
    返回值
    Raw对象实例 | Epochs对象实例| Evoked对象实例
    
    注:
    1.如果请求的参考不是平均参考,则此函数将移除任何预先存在的平均参考投影。
    2.在源定位期间,EEG信号应具有平均参考值。
    3.为了应用参考,必须预先加载数据。如果ref_channels ='average'且projection = True,则无需执行此操作。
    4.对于一般参考,如果在info['bads']中设置了错误的EEG频道,则会自动排除这它们。
    

    案例-参考电极

    import os
    import mne
    import matplotlib.pyplot as plt
    %matplotlib auto
    
    """
    设置原始数据地址
    """
    sample_data_folder = mne.datasets.sample.data_path()
    sample_data_raw_file = os.path.join(sample_data_folder, 'MEG', 'sample',
                                        'sample_audvis_raw.fif')
    """
    读取数据生成raw对象实例
    """
    raw = mne.io.read_raw_fif(sample_data_raw_file, verbose=False)
    raw.crop(tmax=60).load_data()
    raw.pick(['EEG 0{:02}'.format(n) for n in range(41, 60)])
    

    设置或更改参考通道

    如果想要重新计算数据(就是不使用原来已经记录或保存数据时使用的参考电极计算),则MNE-Python中为Raw对象提供了set_eeg_reference()方法以及mne.add_reference_channels()方法。

    如果使用头皮电极作为参考,但未与原始数据一起保存(通常不使用参考通道),则您可能希望在重新参考之前将其重新添加到数据集中。
    例如,如果您的EEG系统使用通道Fp1作为参考记录,但在数据文件中没有包含Fp1,则使用set_eeg_reference()进行设置。
    例如,将Cz设置为新参考,然后将在Cz处的信号减去,而不恢复Fp1处的信号。在这种情况下,可以使用add_reference_channels()在重新引用之前将Fp1添加回平面通道。

    (由于这里的示例数据没有使用10-20电极命名系统,因此以下示例将EEG 999添加为缺少的参考,然后将该参考设置为EEG 050)

    这是数据在其原始状态下的显示方式:

    raw.plot()
    plt.show()
    

    默认情况下,add_reference_channels()返回一个副本,因此稍后我们可以返回到原始对象。

    如果想要更改现有的Raw对象,则可以指定copy = False。

    # 添加一个新的参考通道(新添的参考通道中的所有值均为0)
    raw_new_ref = mne.add_reference_channels(raw, ref_channels=['EEG 999'])
    raw_new_ref.plot()
    plt.show()
    

    如上图,刚添加的EEG 999通道作为参考电极,是一个平坦的效果。

    # 设置 `EEG 050` 作为参考电极
    raw_new_ref.set_eeg_reference(ref_channels=['EEG 050'])
    raw_new_ref.plot()
    plt.show()
    

    如上效果图,新的参考通道(EEG 050)现在是平坦的,而我们添加回数据中的原始参考通道(EEG 999)具有非零信号。
    还要注意,EEG 053是一个坏的信号(在raw.info['bads']中标记为"bad")不受重新参考的影响。

    设定平均参考

    想要设置一个"虚拟参考",即所有通道平均值,可以使用set_eeg_reference()与ref_channels ='average'。
    如上面所讲的,这不会影响任何标记为"bad"的频道,也不会在计算平均值时包含不良频道。
    但是,它确实就地修改Raw对象,因此我们将首先创建一个副本,以便稍后仍可以返回未修改的Raw对象:

    # 使用所有通道的平均值作为参考
    raw_avg_ref = raw.copy().set_eeg_reference(ref_channels='average')
    raw_avg_ref.plot()
    plt.show()
    

    创建平均参考作为projector(投影)具有以下优点:

    在绘图时可以打开或关闭projector(投影),因此很容易可视化平均参考对数据的影响。

    如果将附加通道标记为"bad",或者以后选择了通道的子集,则将重新计算projector(投影)以考虑这些变化(从而确保信号为零均值)。

    如果还有其他未使用的projector(投影)影响EEG通道(例如用于消除心跳或眨眼伪像的SSP projector(投影)),则在应用或移除这些projector(投影)之前,无法执行EEG重新参考;将EEG参考添加为projector(投影)不受此限制。

    for title, proj in zip(['Original', 'Average'], [False, True]):
        fig = raw.plot(proj=proj, n_channels=len(raw))
        # make room for title
        fig.subplots_adjust(top=0.9)
        fig.suptitle('{} reference'.format(title), size='xx-large', weight='bold')
    


    参考:MNE-Python-参考电极

    脑机学习者Rose笔记分享,QQ交流群:903290195
    更多分享,请关注公众号

  • 相关阅读:
    服务器编程入门(12) 守护进程
    Effective C++(10) 重载赋值操作符时,返回该对象的引用(retrun *this)
    C++ Primer(6) 模板和泛型编程(上)
    Effective C++(9) 构造函数调用virtual函数会发生什么
    Android开发(7)数据库和Content Provider
    Effective C++(7) 为多态基类声明virtual析构函数 or Not
    Effective C++(6) 如何拒绝编译器的自动生成函数
    Effective C++(4) 确定对象被使用前已先被初始化
    Effective C++(5) 了解C++默默地编写并调用哪些函数
    Effective C++(1-2) 编译器替换预处理器
  • 原文地址:https://www.cnblogs.com/RoseVorchid/p/12018417.html
Copyright © 2020-2023  润新知