从一系列注视计算首次注视时间、首次注视持续时间和访问持续时间(眼动追踪;R)

Posted

技术标签:

【中文标题】从一系列注视计算首次注视时间、首次注视持续时间和访问持续时间(眼动追踪;R)【英文标题】:Calculating time to first fixation, first fixation duration, and visit duration from series of fixations (eye tracking; R) 【发布时间】:2021-01-07 00:42:56 【问题描述】:

我希望每个人都做得很好。

我目前正在使用眼动追踪数据集。我已经使用 R 包“gazepath”处理了注视。这为我提供了对 x/y 平面上特定坐标的注视输出。

我的目标是计算:与每个试验的 x-y 坐标范围相对应的一系列感兴趣区域的首次注视持续时间、首次注视时间和总访问持续时间。

对于这项研究,我有两个主要的兴趣领域 - 眼睛和嘴巴。 例如,眼睛位于 x1 – .200 到 x2 – .300 和 y1 – .500 到 y1 – .600 面部的位置从 x1 – .100 到 x2 – .500 和 y1 .100 到 y2 .800。

所以在下面的示例中,对于查看面部的试验 1,它应该输出如下内容: 首次固定时间 = 1;第一次注视持续时间=250;总注视时间 = 2116.667

我希望对每个试验和每个 AOI 都执行此操作。帮助为一系列主题文件创建循环并保存每个主题的输出也将不胜感激。

感谢您的时间和考虑!保重,卡罗琳

df1 <- data.frame(Participant = c('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A' ), 
Trial = c(1,1,1,1,2, 2,2,2,2,2), 
FixationDuration = c(250, 950, 250, 666.6666667, 216.6666667, 383.3333333, 433.3333333, 500, 383.3333333, 550),
StartTimeforFixation= c(1, 301, 1284, 1584, 2301, 2567, 3001, 3484, 4034, 4451), 
EndTimeforFixation = c(250, 1250, 1533, 2250, 2516, 2950, 3433, 3983, 4416, 5000),
mean_x = c(0.464453,  0.499141, 0.491302, 0.496063, 0.491435, 0.494063, 0.498093, 0.487845, 0.492093, 0.497614),
mean_y = c(0.638584, 0.515769, 0.604171, 0.685817, 0.546331, 0.70222,0.528106, 0.615643, 0.551993, 0.661424),
POGsdSacAmp = c(4.84E-05, 0.000103, 6.69E-05, 0.000111, 0.000118, 0.000108, 
7.15E-05, 7.31E-05, 6.76E-05, 7.10E-05),
RMS = c(6.61E-05, 0.000128, 7.89E-05, 8.27E-05, 0.000156, 0.000151, 7.85E-05, 6.91E-05,  8.86E-05, 9.17E-05))

【问题讨论】:

你是怎么想到total fixation duration = 2116.667的?以及如何考虑 AOI,您是否在 mean_xmean_y 上进行过滤? 您好!谢谢你的问题。我根据当前示例中的假设计算了这一点,即所有注视点都落在面部 aoi 区域(基于平均 x 和平均 y,这意味着它必须在 aoi 位置的上下范围之间)。然后,我将试验一的所有注视相加,结果为 2116 毫秒。 我找到了 2113,所以这就是我要问的原因。无论如何,我(很快)会发布一个答案,看看为什么会出现这种差异。 【参考方案1】:

使用dplyr,这可以很容易地通过分组来实现。

library(tidyverse)
df1 <- tibble(Participant = c('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A' ), 
                  Trial = c(1,1,1,1,2, 2,2,2,2,2), 
                  FixationDuration = c(250, 950, 250, 666.6666667, 216.6666667, 383.3333333, 433.3333333, 500, 383.3333333, 550),
                  StartTimeforFixation= c(1, 301, 1284, 1584, 2301, 2567, 3001, 3484, 4034, 4451), 
                  EndTimeforFixation = c(250, 1250, 1533, 2250, 2516, 2950, 3433, 3983, 4416, 5000),
                  mean_x = c(0.464453,  0.499141, 0.491302, 0.496063, 0.491435, 0.494063, 0.498093, 0.487845, 0.492093, 0.497614),
                  mean_y = c(0.638584, 0.515769, 0.604171, 0.685817, 0.546331, 0.70222,0.528106, 0.615643, 0.551993, 0.661424),
                  POGsdSacAmp = c(4.84E-05, 0.000103, 6.69E-05, 0.000111, 0.000118, 0.000108, 
                                  7.15E-05, 7.31E-05, 6.76E-05, 7.10E-05),
                  RMS = c(6.61E-05, 0.000128, 7.89E-05, 8.27E-05, 0.000156, 0.000151, 7.85E-05, 6.91E-05,  8.86E-05, 9.17E-05))

首先,我们需要计算各个持续时间:

df1 %>%
  mutate(fix_time = EndTimeforFixation - StartTimeforFixation)
# A tibble: 10 x 10
#   Participant Trial FixationDuration StartTimeforFixat~ EndTimeforFixati~ mean_x mean_y POGsdSacAmp     RMS fix_time
#   <chr>       <dbl>            <dbl>              <dbl>             <dbl>  <dbl>  <dbl>       <dbl>   <dbl>    <dbl>
# 1 A               1             250                   1               250  0.464  0.639   0.0000484 6.61e-5      249
# 2 A               1             950                 301              1250  0.499  0.516   0.000103  1.28e-4      949
# 3 A               1             250                1284              1533  0.491  0.604   0.0000669 7.89e-5      249
# 4 A               1             667.               1584              2250  0.496  0.686   0.000111  8.27e-5      666
...

请注意,当您有 250 毫秒时,我得到的第一个是 249 毫秒。

然后你可以定义组,这里的参与者和试验应该是相关的组。然后,您可以在每个组中计算您想要的任何统计数据:

df1 %>%
  mutate(fix_time = EndTimeforFixation - StartTimeforFixation) %>%
  group_by(Participant, Trial) %>%
  summarize(tot_duration = sum(fix_time))
# A tibble: 2 x 3
# Groups:   Participant [1]
#  Participant Trial tot_duration
#  <chr>       <dbl>        <dbl>
#1 A               1         2113
#2 A               2         2460

当然,在summarize 语句中,您还可以计算mean()var()sd() 或您感兴趣的任何其他内容。

现在,您应该怎么做才能只计算正确区域的试验统计数据?计算前可以使用filter

df1 %>%
  mutate(fix_time = EndTimeforFixation - StartTimeforFixation,
         AOI_face = (mean_x >= .100 & mean_x <= .500 & mean_y >= .100 & mean_y <= .800),
         AOI_eyes = (mean_x >= .200 & mean_x <= .300 & mean_y >= .500 & mean_y <= .600)) %>%
  filter(AOI_face) %>%
  group_by(Participant, Trial) %>%
  summarize(tot_duration = sum(fix_time))

这里我假设一个试验可以在多个 AOI 中进行。如果您改为为每个试验分配一个 AOI,您可能希望创建一个带有值“face”、“eyes”、...和 ​​group_by(Participant, Trial, AOI) 的单个 AOI 列来计算每个试验的平均值。

最后,要将结果保存到磁盘,我推荐write_csv()

【讨论】:

嗨,亚历克斯,这太棒了!谢谢!这适用于解决访问持续时间。我认为我们的回答存在差异是因为我使用了“持续时间”变量,而您是通过从开始时间减去结束时间来计算的。您对如何选择每次试验的首次固定时间和首次固定时间有任何想法吗?再次感谢!保重。 first()(还在dplyr)呢?您可以在summarize() 中使用它。 效果很好!非常感谢您的所有帮助!

以上是关于从一系列注视计算首次注视时间、首次注视持续时间和访问持续时间(眼动追踪;R)的主要内容,如果未能解决你的问题,请参考以下文章

测量一个人注视多个物体的时间

需要眼动追踪,注视追踪方法

BroadcastReceiver 用于在收藏夹/注视中添加或删除联系人时收听

华为P40 Pro评测:超感知四摄打造夜景望远镜

如何在rmarkdown中调整注视表的字体大小?

谷歌在注视着我们?搜索引擎如何扮演上帝