zoukankan      html  css  js  c++  java
  • Python-EEG工具库MNE中文教程(14)-Epoch对象中的元数据(metadata)

    目录

      本分享为脑机学习者Rose整理发表于公众号:脑机接口社区(微信号:Brain_Computer).QQ交流群:903290195

      本案例演示使用Epochs元数据。关于Epochs数据结构:可以查看文章Python-EEG工具库MNE中文教程(2)-MNE中数据结构Epoch及其创建方法Python-EEG工具库MNE中文教程(3)-MNE中数据结构Epoch及其用法简介

      有时候使用mne的metadata属性来存储相关数据特别有用,metadata使用pandas.DataFrame来封装数据。其中每一行对应一个epoch,每一列对应一个epoch的元数据属性。列必须包含字符串、整数或浮点数。

      在该数据集中,受试者在屏幕上看到单个单词,并记录每个单词对应的脑电图活动。我们知道每个epoch显示哪个单词,以及关于这个单词的额外信息(例如,单词频率)。

      #导入工具
      import mne
      import numpy as np
      import matplotlib.pyplot as plt
      
      #加载数据
      path = mne.datasets.kiloword.data_path() + '/kword_metadata-epo.fif'
      epochs = mne.read_epochs(path)
      

      从上面打印的信息可以知道该数据集中有960个样本数据。

      epochs.metadata[:10]
      

      # 元数据以panda.DataFrame的形式存储数据
      # 获取前10条记录
      print(epochs.metadata.head(10))
      

      我们可以使用该元数据属性来选择epoch的子集。这使用了Pandas中的pandas.DataFrame.query()方法。任何有效的查询字符串都将起作用。下面,我们将绘制两个图进行比较:

      av1 = epochs['Concreteness < 5 and WordFrequency < 2'].average()
      av2 = epochs['Concreteness > 5 and WordFrequency > 2'].average()
      
      joint_kwargs = dict(ts_args=dict(time_unit='s'),
                          topomap_args=dict(time_unit='s'))
      av1.plot_joint(show=False, **joint_kwargs)
      av2.plot_joint(show=False, **joint_kwargs)
      plt.show()
      

      words = ['film', 'cent', 'shot', 'cold', 'main']
      epochs['WORD in {}'.format(words)].plot_image(show=False)
      plt.show()
      

      """
      注意,传统的epoch子选择仍然有效。
      传统的选择epoch的MNE方法将取代丰富的元数据查询。
      """
      epochs['cent'].average().plot(show=False, time_unit='s')
      plt.show()
      

      下面将展示一个更复杂的示例,该示例利用每个epoch的元数据。我们将在元数据对象中创建一个新列,并使用它生成许多试验子集的平均值。

      metadata = epochs.metadata
      is_concrete = metadata["Concreteness"] > metadata["Concreteness"].median()
      metadata["is_concrete"] = np.where(is_concrete, 'Concrete', 'Abstract')
      is_long = metadata["NumberOfLetters"] > 5
      metadata["is_long"] = np.where(is_long, 'Long', 'Short')
      epochs.metadata = metadata
      
      """
      现在我们可以快速提取(并绘制)数据的子集。例如,看按单词长度和具体程度划分的单词:
      """
      query = "is_long == '{0}' & is_concrete == '{1}'"
      evokeds = dict()
      for concreteness in ("Concrete", "Abstract"):
          for length in ("Long", "Short"):
              subset = epochs[query.format(length, concreteness)]
              evokeds["/".join((concreteness, length))] = list(subset.iter_evoked())
      
      # 为了进行实际的可视化,下面存储了许多共享参数。
      style_plot = dict(
          colors={"Long": "Crimson", "Short": "Cornflowerblue"},
          linestyles={"Concrete": "-", "Abstract": ":"},
          split_legend=True,
          ci=.68,
          show_sensors='lower right',
          legend='lower left',
          truncate_yaxis="auto",
          picks=epochs.ch_names.index("Pz"),
      )
      
      fig, ax = plt.subplots(figsize=(6, 4))
      #绘制诱发响应
      mne.viz.plot_compare_evokeds(evokeds, axes=ax, **style_plot)
      plt.show()
      

      下面比较不同字母长度(字母个数)单词所得到的诱发响应。比较长度为4、5、6、7或8个字母的单词:

      letters = epochs.metadata["NumberOfLetters"].unique().astype(int).astype(str)
      
      evokeds = dict()
      for n_letters in letters:
          evokeds[n_letters] = epochs["NumberOfLetters == " + n_letters].average()
      
      style_plot["colors"] = {n_letters: int(n_letters)
                              for n_letters in letters}
      style_plot["cmap"] = ("# of Letters", "viridis_r")
      del style_plot['linestyles']
      
      fig, ax = plt.subplots(figsize=(6, 4))
      mne.viz.plot_compare_evokeds(evokeds, axes=ax, **style_plot)
      plt.show()
      

      最后,对于字母的具体性与连续长度之间的相互作用:

      evokeds = dict()
      query = "is_concrete == '{0}' & NumberOfLetters == {1}"
      for concreteness in ("Concrete", "Abstract"):
          for n_letters in letters:
              subset = epochs[query.format(concreteness, n_letters)]
              evokeds["/".join((concreteness, n_letters))] = subset.average()
      
      style_plot["linestyles"] = {"Concrete": "-", "Abstract": ":"}
      
      fig, ax = plt.subplots(figsize=(6, 4))
      mne.viz.plot_compare_evokeds(evokeds, axes=ax, **style_plot)
      plt.show()
      

      参考
      Epoch对象中的元数据(metadata)

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

    • 相关阅读:
      vue2 生命周期
      javascript http库axios
      vue2自定义事件之$emit
      php配置rewrite模块
      php 正则匹配中文(转)
      php常用自定义函数
      Mysql----MySQL的mysql_insert_id和LAST_INSERT_ID(转)
      Mysql----mysql启动服务时提示"服务名无效"
      div+css布局
      php常见问题以及解决方法
    • 原文地址:https://www.cnblogs.com/RoseVorchid/p/12109508.html
    Copyright © 2011-2022 走看看