如何为iohub事件与眼动追踪数据表添加自定义试次识别列?
给iohub事件和眼动追踪数据表添加自定义试次识别列
嘿,这个问题我当初第一次搭iohub+PsychoPy的眼动实验时也纠结过!完全可以给iohub的事件记录和眼动数据表加上自定义的试次标识(比如你说的刺激图片名称),下面给你两种实用的方法:
方法1:用iohub内置变量自动附加标识
iohub本身支持给当前实验上下文设置自定义变量,这些变量会自动绑定到后续所有的眼动事件和数据记录中,不用事后手动匹配,非常省心。
具体步骤很简单:在每个试次开始前,调用iohub.setVariable()方法传入你的自定义标识就行。示例代码如下:
# 先初始化iohub和眼动追踪设备 from psychopy.iohub import launchHubServer from psychopy import visual, core iohub = launchHubServer() eyetracker = iohub.devices.eyetracker win = visual.Window(size=(1920,1080)) # 假设你有一个试次列表,每个试次包含刺激图片名称 trial_list = [{'stimulus': 'cat.jpg'}, {'stimulus': 'dog.jpg'}, {'stimulus': 'bird.jpg'}] # 开启眼动记录 eyetracker.startRecording() for trial in trial_list: # 获取当前试次的刺激图片名称 current_stim = trial['stimulus'] # 设置iohub自定义变量,这个变量会自动添加到所有后续眼动数据里 iohub.setVariable('trial_stim_name', current_stim) # 呈现你的刺激 stim_img = visual.ImageStim(win, image=current_stim) stim_img.draw() win.flip() # 等待试次时长 core.wait(2.0) # 可选:清除变量,不过下一个试次的setVariable会自动覆盖它 # iohub.clearVariable('trial_stim_name') # 停止记录并关闭iohub eyetracker.stopRecording() iohub.quit() win.close()
当你导出iohub的眼动数据(比如CSV或EDF格式)时,就能看到新增的trial_stim_name列,每个行的对应值就是你设置的刺激图片名称,完美对应到每个试次的眼动数据。
方法2:手动记录试次时间范围,事后关联标识
如果需要更灵活的控制(比如试次内有多个子阶段需要区分),可以手动记录每个试次的时间范围,之后把试次标识和iohub的时间戳数据做匹配。
示例代码如下:
from psychopy.iohub import launchHubServer from psychopy import visual, core import pandas as pd iohub = launchHubServer() eyetracker = iohub.devices.eyetracker win = visual.Window(size=(1920,1080)) trial_list = [{'stimulus': 'cat.jpg'}, {'stimulus': 'dog.jpg'}, {'stimulus': 'bird.jpg'}] eyetracker.startRecording() # 用来存储试次时间和标识的列表 trial_info = [] for trial in trial_list: current_stim = trial['stimulus'] # 用iohub的时间戳(和眼动数据的时间戳一致)记录试次开始时间 trial_start = iohub.getTime() # 呈现刺激 stim_img = visual.ImageStim(win, image=current_stim) stim_img.draw() win.flip() core.wait(2.0) # 记录试次结束时间 trial_end = iohub.getTime() # 保存试次信息 trial_info.append({ 'stim_name': current_stim, 'start_time': trial_start, 'end_time': trial_end }) eyetracker.stopRecording() iohub.quit() win.close() # 事后关联数据:读取iohub导出的眼动CSV,匹配试次标识 eye_data = pd.read_csv('iohub_eye_recording.csv') trial_df = pd.DataFrame(trial_info) # 给每一行眼动数据匹配对应的刺激名称 eye_data['trial_stim_name'] = eye_data['time'].apply( lambda timestamp: trial_df[ (trial_df['start_time'] <= timestamp) & (timestamp <= trial_df['end_time']) ]['stim_name'].values[0] ) # 保存关联好的数据 eye_data.to_csv('eye_data_with_stim_labels.csv', index=False)
两种方法各有优势:第一种适合大多数常规实验,不用额外处理数据;第二种适合复杂实验设计,能实现更精细的标识匹配。
内容的提问来源于stack exchange,提问作者Krzysztof Krejtz
相关产品推荐
相关产品推荐

