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

Calculating time to first fixation, first fixation duration, and visit duration from series of fixations (eye tracking; R)

希望大家一切顺利

我目前正在处理眼动追踪数据集。我已经使用 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))

使用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,则您需要创建一个 AOI 列,其值为“face”、“eyes”、...和 ​​group_by(Participant, Trial, AOI) 以计算每个试验的平均值.

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