从一系列注视眼动; 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' ),Trial = c(1,1,2,2),FixationDuration = c(250,950,250,666.6666667,216.6666667,383.3333333,433.3333333,500,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' ),Trial = c(1,1,2,2),FixationDuration = c(250,950,250,666.6666667,216.6666667,383.3333333,433.3333333,500,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()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...